Merge branch 'develop' of github.com:ethereum/go-ethereum into develop

This commit is contained in:
Maran 2014-05-12 17:23:16 +02:00
commit c3ad210846
2 changed files with 219 additions and 160 deletions

View File

@ -10,146 +10,146 @@ import QtQuick.Controls.Styles 1.1
import QtQuick.Dialogs 1.1 import QtQuick.Dialogs 1.1
ApplicationWindow { ApplicationWindow {
id: wizardRoot id: wizardRoot
width: 500 width: 500
height: 400 height: 400
title: "Ethereal first run setup" title: "Ethereal first run setup"
Column {
spacing: 5
anchors.leftMargin: 10
anchors.left: parent.left
Text {
visible: true
text: "<h2>Ethereal setup</h2>"
}
Column { Column {
id: restoreColumn spacing: 5
spacing: 5 anchors.leftMargin: 10
Text { anchors.left: parent.left
visible: true
font.pointSize: 14
text: "Restore your Ethereum account"
id: restoreLabel
}
TextField {
id: txPrivKey
width: 480
placeholderText: "Private key or mnemonic words"
focus: true
onTextChanged: {
if(this.text.length == 64){
detailLabel.text = "Private (hex) key detected."
actionButton.enabled = true
}
else if(this.text.split(" ").length == 24){
detailLabel.text = "Mnemonic key detected."
actionButton.enabled = true
}else{
detailLabel.text = ""
actionButton.enabled = false
}
}
}
Row {
spacing: 10
Button {
id: actionButton
text: "Restore"
enabled: false
onClicked: {
var success = eth.importAndSetPrivKey(txPrivKey.text)
if(success){
importedDetails.visible = true
restoreColumn.visible = false
newKey.visible = false
wizardRoot.height = 120
}
}
}
Text { Text {
id: detailLabel visible: true
font.pointSize: 12 text: "<h2>Ethereal setup</h2>"
anchors.topMargin: 10
} }
}
}
Column {
id: importedDetails
visible: false
Text {
text: "<b>Your account has been imported. Please close the application and restart it again to let the changes take effect.</b>"
wrapMode: Text.WordWrap
width: 460
}
}
Column {
spacing: 5
id: newDetailsColumn
visible: false
Text {
font.pointSize: 14
text: "Your account details"
}
Label {
text: "Address"
}
TextField {
id: addressInput
readOnly:true
width: 480
}
Label {
text: "Private key"
}
TextField {
id: privkeyInput
readOnly:true
width: 480
}
Label {
text: "Mnemonic words"
}
TextField {
id: mnemonicInput
readOnly:true
width: 480
}
Label {
text: "<b>A new account has been created. Please take the time to write down the <i>24 words</i>. You can use those to restore your account at a later date.</b>"
wrapMode: Text.WordWrap
width: 480
}
Label {
text: "Please restart the application once you have completed the steps above."
wrapMode: Text.WordWrap
width: 480
}
}
} Column {
Button { id: restoreColumn
anchors.right: parent.right spacing: 5
anchors.bottom: parent.bottom Text {
anchors.rightMargin: 10 visible: true
anchors.bottomMargin: 10 font.pointSize: 14
id: newKey text: "Restore your Ethereum account"
text: "I don't have an account yet" id: restoreLabel
onClicked: { }
var res = eth.createAndSetPrivKey()
mnemonicInput.text = res[0]
addressInput.text = res[1]
privkeyInput.text = res[2]
// Hide restore TextField {
restoreColumn.visible = false id: txPrivKey
width: 480
placeholderText: "Private key or mnemonic words"
focus: true
onTextChanged: {
if(this.text.length == 64){
detailLabel.text = "Private (hex) key detected."
actionButton.enabled = true
}
else if(this.text.split(" ").length == 24){
detailLabel.text = "Mnemonic key detected."
actionButton.enabled = true
}else{
detailLabel.text = ""
actionButton.enabled = false
}
}
}
Row {
spacing: 10
Button {
id: actionButton
text: "Restore"
enabled: false
onClicked: {
var success = lib.importAndSetPrivKey(txPrivKey.text)
if(success){
importedDetails.visible = true
restoreColumn.visible = false
newKey.visible = false
wizardRoot.height = 120
}
}
}
Text {
id: detailLabel
font.pointSize: 12
anchors.topMargin: 10
}
}
}
Column {
id: importedDetails
visible: false
Text {
text: "<b>Your account has been imported. Please close the application and restart it again to let the changes take effect.</b>"
wrapMode: Text.WordWrap
width: 460
}
}
Column {
spacing: 5
id: newDetailsColumn
visible: false
Text {
font.pointSize: 14
text: "Your account details"
}
Label {
text: "Address"
}
TextField {
id: addressInput
readOnly:true
width: 480
}
Label {
text: "Private key"
}
TextField {
id: privkeyInput
readOnly:true
width: 480
}
Label {
text: "Mnemonic words"
}
TextField {
id: mnemonicInput
readOnly:true
width: 480
}
Label {
text: "<b>A new account has been created. Please take the time to write down the <i>24 words</i>. You can use those to restore your account at a later date.</b>"
wrapMode: Text.WordWrap
width: 480
}
Label {
text: "Please restart the application once you have completed the steps above."
wrapMode: Text.WordWrap
width: 480
}
}
// Show new details
newDetailsColumn.visible = true
newKey.visible = false
} }
} Button {
anchors.right: parent.right
anchors.bottom: parent.bottom
anchors.rightMargin: 10
anchors.bottomMargin: 10
id: newKey
text: "I don't have an account yet"
onClicked: {
var res = lib.createAndSetPrivKey()
mnemonicInput.text = res[0]
addressInput.text = res[1]
privkeyInput.text = res[2]
// Hide restore
restoreColumn.visible = false
// Show new details
newDetailsColumn.visible = true
newKey.visible = false
}
}
} }

View File

@ -24,7 +24,8 @@ type Gui struct {
eth *eth.Ethereum eth *eth.Ethereum
// The public Ethereum library // The public Ethereum library
lib *EthLib lib *EthLib
uiLib *UiLib
txDb *ethdb.LDBDatabase txDb *ethdb.LDBDatabase
@ -75,19 +76,55 @@ func (gui *Gui) Start(assetPath string) {
// Expose the eth library and the ui library to QML // Expose the eth library and the ui library to QML
context.SetVar("eth", gui) context.SetVar("eth", gui)
uiLib := NewUiLib(gui.engine, gui.eth, assetPath) gui.uiLib = NewUiLib(gui.engine, gui.eth, assetPath)
context.SetVar("ui", uiLib) context.SetVar("ui", gui.uiLib)
// Load the main QML interface // Load the main QML interface
data, _ := ethutil.Config.Db.Get([]byte("KeyRing")) data, _ := ethutil.Config.Db.Get([]byte("KeyRing"))
var err error /*
var component qml.Object var err error
firstRun := len(data) == 0 var component qml.Object
firstRun := len(data) == 0
if firstRun { if firstRun {
component, err = gui.engine.LoadFile(uiLib.AssetPath("qml/first_run.qml")) component, err = gui.engine.LoadFile(uiLib.AssetPath("qml/first_run.qml"))
} else {
component, err = gui.engine.LoadFile(uiLib.AssetPath("qml/wallet.qml"))
}
if err != nil {
ethutil.Config.Log.Infoln("FATAL: asset not found: you can set an alternative asset path on on the command line using option 'asset_path'")
panic(err)
}
gui.win = component.CreateWindow(nil)
uiLib.win = gui.win
db := &Debugger{gui.win, make(chan bool)}
gui.lib.Db = db
uiLib.Db = db
// Add the ui as a log system so we can log directly to the UGI
ethutil.Config.Log.AddLogSystem(gui)
// Loads previous blocks
if firstRun == false {
go gui.setInitialBlockChain()
go gui.readPreviousTransactions()
go gui.update()
}
gui.win.Show()
gui.win.Wait()
gui.eth.Stop()
*/
var win *qml.Window
var err error
if len(data) == 0 {
win, err = gui.showKeyImport(context)
} else { } else {
component, err = gui.engine.LoadFile(uiLib.AssetPath("qml/wallet.qml")) win, err = gui.showWallet(context)
} }
if err != nil { if err != nil {
ethutil.Config.Log.Infoln("FATAL: asset not found: you can set an alternative asset path on on the command line using option 'asset_path'") ethutil.Config.Log.Infoln("FATAL: asset not found: you can set an alternative asset path on on the command line using option 'asset_path'")
@ -95,28 +132,50 @@ func (gui *Gui) Start(assetPath string) {
panic(err) panic(err)
} }
gui.win = component.CreateWindow(nil) win.Show()
uiLib.win = gui.win win.Wait()
db := &Debugger{gui.win, make(chan bool)}
gui.lib.Db = db
uiLib.Db = db
// Add the ui as a log system so we can log directly to the UGI
ethutil.Config.Log.AddLogSystem(gui)
// Loads previous blocks
if firstRun == false {
go gui.setInitialBlockChain()
go gui.readPreviousTransactions()
go gui.update()
}
gui.win.Show()
gui.win.Wait()
gui.eth.Stop() gui.eth.Stop()
} }
func (gui *Gui) showWallet(context *qml.Context) (*qml.Window, error) {
component, err := gui.engine.LoadFile(gui.uiLib.AssetPath("qml/wallet.qml"))
if err != nil {
return nil, err
}
win := gui.createWindow(component)
go gui.setInitialBlockChain()
go gui.readPreviousTransactions()
go gui.update()
return win, nil
}
func (gui *Gui) showKeyImport(context *qml.Context) (*qml.Window, error) {
context.SetVar("lib", gui.lib)
component, err := gui.engine.LoadFile(gui.uiLib.AssetPath("qml/first_run.qml"))
if err != nil {
return nil, err
}
return gui.createWindow(component), nil
}
func (gui *Gui) createWindow(comp qml.Object) *qml.Window {
win := comp.CreateWindow(nil)
gui.win = win
gui.uiLib.win = win
db := &Debugger{gui.win, make(chan bool)}
gui.lib.Db = db
gui.uiLib.Db = db
return gui.win
}
func (gui *Gui) setInitialBlockChain() { func (gui *Gui) setInitialBlockChain() {
// Load previous 10 blocks // Load previous 10 blocks
chain := gui.eth.BlockChain().GetChain(gui.eth.BlockChain().CurrentBlock.Hash(), 10) chain := gui.eth.BlockChain().GetChain(gui.eth.BlockChain().CurrentBlock.Hash(), 10)