diff --git a/ethereal/assets/qml/first_run.qml b/ethereal/assets/qml/first_run.qml
index 0bd3b4ce10..0b1dac4c60 100644
--- a/ethereal/assets/qml/first_run.qml
+++ b/ethereal/assets/qml/first_run.qml
@@ -10,146 +10,146 @@ import QtQuick.Controls.Styles 1.1
import QtQuick.Dialogs 1.1
ApplicationWindow {
- id: wizardRoot
- width: 500
- height: 400
- title: "Ethereal first run setup"
-
- Column {
- spacing: 5
- anchors.leftMargin: 10
- anchors.left: parent.left
-
- Text {
- visible: true
- text: "
Ethereal setup
"
- }
+ id: wizardRoot
+ width: 500
+ height: 400
+ title: "Ethereal first run setup"
Column {
- id: restoreColumn
- spacing: 5
- Text {
- visible: true
- font.pointSize: 14
- text: "Restore your Ethereum account"
- id: restoreLabel
- }
+ spacing: 5
+ anchors.leftMargin: 10
+ anchors.left: parent.left
- 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 {
- id: detailLabel
- font.pointSize: 12
- anchors.topMargin: 10
+ visible: true
+ text: "Ethereal setup
"
}
- }
- }
- Column {
- id: importedDetails
- visible: false
- Text {
- text: "Your account has been imported. Please close the application and restart it again to let the changes take effect."
- 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: "A new account has been created. Please take the time to write down the 24 words. You can use those to restore your account at a later date."
- wrapMode: Text.WordWrap
- width: 480
- }
- Label {
- text: "Please restart the application once you have completed the steps above."
- wrapMode: Text.WordWrap
- width: 480
- }
- }
- }
- 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 = eth.createAndSetPrivKey()
- mnemonicInput.text = res[0]
- addressInput.text = res[1]
- privkeyInput.text = res[2]
+ Column {
+ id: restoreColumn
+ spacing: 5
+ Text {
+ visible: true
+ font.pointSize: 14
+ text: "Restore your Ethereum account"
+ id: restoreLabel
+ }
- // Hide restore
- restoreColumn.visible = false
+ 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 = 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: "Your account has been imported. Please close the application and restart it again to let the changes take effect."
+ 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: "A new account has been created. Please take the time to write down the 24 words. You can use those to restore your account at a later date."
+ 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
+ }
+ }
}
diff --git a/ethereal/ui/gui.go b/ethereal/ui/gui.go
index 46bfa01334..65c87c4c2f 100644
--- a/ethereal/ui/gui.go
+++ b/ethereal/ui/gui.go
@@ -24,7 +24,8 @@ type Gui struct {
eth *eth.Ethereum
// The public Ethereum library
- lib *EthLib
+ lib *EthLib
+ uiLib *UiLib
txDb *ethdb.LDBDatabase
@@ -75,19 +76,55 @@ func (gui *Gui) Start(assetPath string) {
// Expose the eth library and the ui library to QML
context.SetVar("eth", gui)
- uiLib := NewUiLib(gui.engine, gui.eth, assetPath)
- context.SetVar("ui", uiLib)
+ gui.uiLib = NewUiLib(gui.engine, gui.eth, assetPath)
+ context.SetVar("ui", gui.uiLib)
// Load the main QML interface
data, _ := ethutil.Config.Db.Get([]byte("KeyRing"))
- var err error
- var component qml.Object
- firstRun := len(data) == 0
+ /*
+ var err error
+ var component qml.Object
+ firstRun := len(data) == 0
- if firstRun {
- component, err = gui.engine.LoadFile(uiLib.AssetPath("qml/first_run.qml"))
+ if firstRun {
+ 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 {
- component, err = gui.engine.LoadFile(uiLib.AssetPath("qml/wallet.qml"))
+ win, err = gui.showWallet(context)
}
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'")
@@ -95,28 +132,50 @@ func (gui *Gui) Start(assetPath string) {
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()
+ win.Show()
+ win.Wait()
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() {
// Load previous 10 blocks
chain := gui.eth.BlockChain().GetChain(gui.eth.BlockChain().CurrentBlock.Hash(), 10)