Refactored some code and fixed #37
This commit is contained in:
		| @@ -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: "<h2>Ethereal setup</h2>" | ||||
|     } | ||||
|     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: "<h2>Ethereal setup</h2>" | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|     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 | ||||
|       } | ||||
|     } | ||||
|  | ||||
|   } | ||||
|   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: "<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 | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -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) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user