diff --git a/mist/assets/qml/views/chain.qml b/mist/assets/qml/views/chain.qml index 5bfc4b6c7..130ff8bb9 100644 --- a/mist/assets/qml/views/chain.qml +++ b/mist/assets/qml/views/chain.qml @@ -248,7 +248,7 @@ Rectangle { for(var i = 0; i < block.txs.length; i++) { transactionModel.insert(0, block.txs.get(i)) } - if(block.txs.get(0).data){ + if(block.txs.length > 0 && block.txs.get(0).data){ popup.showContractData(block.txs.get(0)) } } diff --git a/mist/assets/qml/views/jeffcoin/jeff.png b/mist/assets/qml/views/jeffcoin/jeff.png new file mode 100644 index 000000000..2b9c6651a Binary files /dev/null and b/mist/assets/qml/views/jeffcoin/jeff.png differ diff --git a/mist/assets/qml/views/jeffcoin/jeffcoin.qml b/mist/assets/qml/views/jeffcoin/jeffcoin.qml new file mode 100644 index 000000000..6a57791a7 --- /dev/null +++ b/mist/assets/qml/views/jeffcoin/jeffcoin.qml @@ -0,0 +1,184 @@ +import QtQuick 2.0 +import QtQuick.Controls 1.0; +import QtQuick.Layouts 1.0; +import QtQuick.Dialogs 1.0; +import QtQuick.Window 2.1; +import QtQuick.Controls.Styles 1.1 + +Rectangle { + id: root + property var title: "JeffCoin" + property var iconSource: "./views/jeffcoin/jeff.png" + property var menuItem + property var filter + property var address: "fc0a9436890478bb9b1c6ed7455c2535366f4a99" + + function insertTx(message, blockNumber) { + if(!message) return; + + var from = message.from + var to = message.input.substr(24, 40) + var value = eth.fromNumber(message.input.substr(64, 64)) + + var me = eth.key().address; + if((to == me|| from == me) && message.input.length == 128) { + txModel.insert(0, {confirmations: blockNumber - message.number, from: from, to: to, value: value}) + } + } + + function setBalance() { + var jeffCoinAmount = eth.fromNumber(eth.storageAt(address, eth.key().address)) + " JΞF" + menuItem.secondaryTitle = jeffCoinAmount + + balance.text = "Balance: " + jeffCoinAmount; + } + + function onReady() { + setBalance() + + filter = new ethx.watch({latest: -1, to: address}) + filter.changed(function(messages) { + setBalance() + + var blockNumber = eth.block(-1).number; + for(var i = 0; i < messages.length; i++) { + insertTx(messages.get(i), blockNumber); + } + }); + + var blockNumber = eth.block(-1).number; + var messages = filter.messages() + for(var i = messages.length-1; i >= 0; i--) { + var message = messages.get(i) + + insertTx(message, blockNumber) + } + + var chainChanged = ethx.watch("chain") + chainChanged.changed(function() { + for(var i = 0; i < txModel.count; i++) { + var entry = txModel.get(i); + entry.confirmations++; + } + }); + } + + function onDestroy() { + filter.uninstall() + } + + ColumnLayout { + spacing: 10 + y: 40 + anchors.fill: parent + + Text { + id: balance + text: "Balance: " + eth.fromNumber(eth.storageAt(address, eth.key().address)) + " JΞF" + font.pixelSize: 24 + anchors { + horizontalCenter: parent.horizontalCenter + top: parent.top + topMargin: 20 + } + } + + Rectangle { + id: newTxPane + color: "#ececec" + border.color: "#cccccc" + border.width: 1 + anchors { + top: balance.bottom + topMargin: 10 + left: parent.left + leftMargin: 5 + right: parent.right + rightMargin: 5 + } + height: 100 + + RowLayout { + id: amountFields + spacing: 10 + anchors { + top: parent.top + topMargin: 20 + left: parent.left + leftMargin: 20 + } + + Text { + text: "JΞF " + } + + // There's something off with the row layout where textfields won't listen to the width setting + Rectangle { + width: 50 + height: 20 + TextField { + id: txValue + width: parent.width + placeholderText: "0.00" + } + } + } + + RowLayout { + id: toFields + spacing: 10 + anchors { + top: amountFields.bottom + topMargin: 5 + left: parent.left + leftMargin: 20 + } + + Text { + text: "To" + } + + Rectangle { + width: 200 + height: 20 + TextField { + id: txTo + width: parent.width + placeholderText: "Address or name" + } + } + + Button { + text: "Send" + onClicked: { + eth.transact({from: eth.key().privateKey, to:address, gas: "9000", gasPrice: "100000000000", data: ["0x"+txTo.text, txValue.text]}) + } + } + } + } + + Rectangle { + anchors { + left: parent.left + right: parent.right + top: newTxPane.bottom + topMargin: 10 + bottom: parent.bottom + } + TableView { + id: txTableView + anchors.fill : parent + TableViewColumn{ role: "value" ; title: "Amount" ; width: 100 } + TableViewColumn{ role: "from" ; title: "From" ; width: 280 } + TableViewColumn{ role: "to" ; title: "To" ; width: 280 } + TableViewColumn{ role: "confirmations" ; title: "Confirmations" ; width: 100 } + + model: ListModel { + id: txModel + Component.onCompleted: { + } + } + } + } + } +} diff --git a/mist/assets/qml/wallet.qml b/mist/assets/qml/wallet.qml index c4379cd47..24191eae8 100644 --- a/mist/assets/qml/wallet.qml +++ b/mist/assets/qml/wallet.qml @@ -16,8 +16,8 @@ ApplicationWindow { property var ethx : Eth.ethx property var web - width: 1024 - height: 750 + width: 1200 + height: 820 minimumHeight: 300 title: "Mist" @@ -45,8 +45,9 @@ ApplicationWindow { // Takes care of loading all default plugins Component.onCompleted: { - addPlugin("./views/wallet.qml", {noAdd: true, close: false, section: "ethereum", active: true}); - root.web = addPlugin("./webapp.qml", {noAdd: true, close: false, section: "ethereum", active: true}); + var wallet = addPlugin("./views/wallet.qml", {noAdd: true, close: false, section: "ethereum", active: true}); + var browser = addPlugin("./webapp.qml", {noAdd: true, close: false, section: "ethereum", active: true}); + root.web = browser.view; addPlugin("./views/transaction.qml", {noAdd: true, close: false, section: "legacy"}); addPlugin("./views/chain.qml", {noAdd: true, close: false, section: "legacy"}); @@ -54,6 +55,10 @@ ApplicationWindow { addPlugin("./views/pending_tx.qml", {noAdd: true, close: false, section: "legacy"}); addPlugin("./views/javascript.qml", {noAdd: true, close: false, section: "legacy"}); + addPlugin("./views/jeffcoin/jeffcoin.qml", {noAdd: true, close: false, section: "apps"}) + + mainSplit.setView(wallet.view, wallet.menuItem); + // Call the ready handler gui.done(); } @@ -97,7 +102,7 @@ ApplicationWindow { var view = mainView.createView(component, options) var views = addViews(view, path, options) - return views.view + return views } catch(e) { ethx.note(e) } @@ -374,8 +379,8 @@ ApplicationWindow { ********************/ Rectangle { id: menu - Layout.minimumWidth: 180 - Layout.maximumWidth: 180 + Layout.minimumWidth: 210 + Layout.maximumWidth: 210 anchors.top: parent.top color: "#ececec" @@ -394,7 +399,7 @@ ApplicationWindow { sel.visible = on } - width: 176 + width: 206 height: 28 color: "#00000000" @@ -801,9 +806,9 @@ ApplicationWindow { anchors.left: aboutIcon.right anchors.leftMargin: 10 anchors.top: parent.top - anchors.topMargin: 40 + anchors.topMargin: 30 font.pointSize: 12 - text: "