From 95ba340d07a02da40000d4bcf2b1bb24bd7856ef Mon Sep 17 00:00:00 2001 From: obscuren Date: Thu, 14 Aug 2014 00:18:37 +0200 Subject: [PATCH] Tweaks and fixes + added webview debugger * Require better icons .. someone? :-) --- ethereal/assets/back.png | Bin 0 -> 931 bytes ethereal/assets/close.png | Bin 0 -> 905 bytes ethereal/assets/ext/ethereum.js | 95 ++++++++-- ethereal/assets/ext/messaging.js | 117 ------------ ethereal/assets/pick.png | Bin 0 -> 932 bytes ethereal/assets/qml/views/history.qml | 2 +- ethereal/assets/qml/views/info.qml | 27 +-- ethereal/assets/qml/views/javascript.qml | 45 +++++ ethereal/assets/qml/views/pending_tx.qml | 2 +- ethereal/assets/qml/wallet.qml | 9 +- ethereal/assets/qml/webapp.qml | 215 +++++++++++++---------- ethereal/gui.go | 6 +- ethereal/main.go | 3 + ethereal/ui_lib.go | 10 ++ 14 files changed, 271 insertions(+), 260 deletions(-) create mode 100644 ethereal/assets/back.png create mode 100644 ethereal/assets/close.png delete mode 100644 ethereal/assets/ext/messaging.js create mode 100644 ethereal/assets/pick.png create mode 100644 ethereal/assets/qml/views/javascript.qml diff --git a/ethereal/assets/back.png b/ethereal/assets/back.png new file mode 100644 index 0000000000000000000000000000000000000000..71486c7c05795d7ee5a3ef0ee77af0c0085b40d9 GIT binary patch literal 931 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3jKx9jP7LeL$-D$|I14-?iy0WW zg+Z8+Vb&Z8pn}NEkcg59UmvUF{9L`nl>DSry^7odplSvNn+hu+GdHy)QK2F?C$HG5 z!d3~a!V1U+3F|8Y3;nDA{o-C@9zzrKDK}xwt{K19`Se z86_nJR{Hwo<>h+i#(Mch>H3D2mX`VkM*2oZx=P7{9O-#x!EwNQn0$BtH5O0c3d|4@L;p!@;Rg)2@K@No-U3d9=va- zS^FI^5NLa>67XSy1BZ&7Y*XK?Nw!=NDqXyA;S8;_Js@e`(6!$+KS1xwEM0YN`B=gqQaN0t0Sa z9_u})*Y{X=X^6h>W$_-~h35*SQ{sg~yd~Ox2a516)cnHJJlW{zwb>gNvh%2{2n#Tq z5fZx5jX#8KYR`GW+$QCq!<7?_UPz}`^PWENS+|^NFH3^hD=ikYg5XU&U*;O`ZT>7JoSv|J!Ii7NB~t%FR0UICG`vapG9!Io z!dB&PZ-u|TH`ZZ%dHO4}>Fa`6)h%i+J^454CaI`zabQ}*^rzu>6Bm&PCMUl>iOiipE=GeYfPQBX=;$R|I)sItgf5wd<&v{u4#PN3)vTNDdzi! zsPy>!vqwLEnRn&7+CJwxH#aY>JNdO|imgUt@H1_mrG4K&F+Qwtl#H>PxxFAJ zE&X#>%Er~E1$KN-=blz9WOPtJt~B>3Q~uY8DP1>bzGu{voWE^mAz$BqJKF=>4L2T` zyz||Y!u+;f=Gx~j>|$KeoO|Ez-@UZWvUmTlX4?PzM@_&x$rqbIImgr0&t;ucLK6U~ CaA2hX literal 0 HcmV?d00001 diff --git a/ethereal/assets/close.png b/ethereal/assets/close.png new file mode 100644 index 0000000000000000000000000000000000000000..88df442c5c3e31aafb95e16c363f08a89de0f29a GIT binary patch literal 905 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VOS+@4BLl<6e(pbstUx|vage(c z!@6@aFM%9|WRD45bDP46hOx7_4S6Fo+k-*%fF5l;AAz zh%9Dc;1&j9Muu5)B!GrRW`;zRMELqxCFkerC8p#jrRr7W764TzCHb_`sNdc^+B->Ug!Z$#{Ilm}X!Bo#g&p^qJOF==wrYI%ND#*nR zsvXF)RmvzSDX`MlFE20GD>v55FG|-pw6wI;H!#vSGSUUA&@HaaD@m--%_~-h7y>iL zCAB!YD6^m>Ge1uOWNuW^rA6E#WYIKx_J=?u2N z+Gk8%19Q?N!w!lslXh{j-}YK|oA2ckuH7tu+g35=JvRTg$$sc(0pt|;;-PO{+JgfH|EO*WgDT=;%Af^Ati{|DM@uy3C zzrWkl!h7RDuAhTh@1hrWeUHO$a82H)@Sjn2*>2W1P8VNB9hi5aEKs~-t41QLWW--) zmu1Tjre8ie=k03u3HP#gNAGyX8N+GeVJT!bE1OC8D{5=%I>U7>KUIb WGK;!D`Q1fO8uxVdb6Mw<&;$UMO-b7T literal 0 HcmV?d00001 diff --git a/ethereal/assets/ext/ethereum.js b/ethereal/assets/ext/ethereum.js index de6fb0255..9970c6379 100644 --- a/ethereal/assets/ext/ethereum.js +++ b/ethereal/assets/ext/ethereum.js @@ -2,30 +2,97 @@ window.eth = { prototype: Object(), + mutan: function(code) { + }, + + toHex: function(str) { + var hex = ""; + for(var i = 0; i < str.length; i++) { + var n = str.charCodeAt(i).toString(16); + hex += n.length < 2 ? '0' + n : n; + } + + return hex; + }, + + toAscii: function(hex) { + // Find termination + var str = ""; + var i = 0, l = hex.length; + for(; i < l; i+=2) { + var code = hex.charCodeAt(i) + if(code == 0) { + break; + } + + str += String.fromCharCode(parseInt(hex.substr(i, 2), 16)); + } + + return str; + }, + + fromAscii: function(str, pad) { + if(pad === undefined) { + pad = 32 + } + + var hex = this.toHex(str); + + while(hex.length < pad*2) + hex += "00"; + + return hex + }, + + // Retrieve block // // Either supply a number or a string. Type is determent for the lookup method // string - Retrieves the block by looking up the hash // number - Retrieves the block by looking up the block number - getBlock: function(numberOrHash, cb) { - var func; - if(typeof numberOrHash == "string") { - func = "getBlockByHash"; - } else { - func = "getBlockByNumber"; - } - postData({call: func, args: [numberOrHash]}, cb); - }, + getBlock: function(numberOrHash, cb) { + var func; + if(typeof numberOrHash == "string") { + func = "getBlockByHash"; + } else { + func = "getBlockByNumber"; + } + postData({call: func, args: [numberOrHash]}, cb); + }, // Create transaction // // Transact between two state objects - transact: function(sec, recipient, value, gas, gasPrice, data, cb) { - postData({call: "transact", args: [sec, recipient, value, gas, gasPrice, data]}, cb); - }, + transact: function(params, cb) { + if(params === undefined) { + params = {}; + } - create: function(sec, value, gas, gasPrice, init, body, cb) { - postData({call: "create", args: [sec, value, gas, gasPrice, init, body]}, cb); + if(params.endowment !== undefined) + params.value = params.endowment; + if(params.code !== undefined) + params.data = params.code; + + // Make sure everything is string + var fields = ["to", "from", "value", "gas", "gasPrice"]; + for(var i = 0; i < fields.length; i++) { + if(params[fields[i]] === undefined) { + params[fields[i]] = ""; + } + params[fields[i]] = params[fields[i]].toString(); + } + + var data; + if(typeof params.data === "object") { + data = ""; + for(var i = 0; i < params.data.length; i++) { + data += params.data[i] + } + } else { + data = params.data; + } + + postData({call: "transact", args: [params.from, params.to, params.value, params.gas, params.gasPrice, "0x"+data]}, cb); }, getStorageAt: function(address, storageAddress, cb) { diff --git a/ethereal/assets/ext/messaging.js b/ethereal/assets/ext/messaging.js deleted file mode 100644 index e7bc63020..000000000 --- a/ethereal/assets/ext/messaging.js +++ /dev/null @@ -1,117 +0,0 @@ -function handleMessage(message) { - console.log("[onMessageReceived]: ", message.data) - // TODO move to messaging.js - var data = JSON.parse(message.data) - - try { - switch(data.call) { - case "getCoinBase": - postData(data._seed, eth.getCoinBase()) - - break - case "getIsListening": - postData(data._seed, eth.getIsListening()) - - break - case "getIsMining": - postData(data._seed, eth.getIsMining()) - - break - case "getPeerCount": - postData(data._seed, eth.getPeerCount()) - - break - - case "getTxCountAt": - require(1) - postData(data._seed, eth.getTxCountAt(data.args[0])) - - break - case "getBlockByNumber": - var block = eth.getBlock(data.args[0]) - postData(data._seed, block) - - break - case "getBlockByHash": - var block = eth.getBlock(data.args[0]) - postData(data._seed, block) - - break - case "transact": - require(5) - - var tx = eth.transact(data.args[0], data.args[1], data.args[2],data.args[3],data.args[4],data.args[5]) - postData(data._seed, tx) - - break - case "create": - postData(data._seed, null) - - break - case "getStorage": - require(2); - - var stateObject = eth.getStateObject(data.args[0]) - var storage = stateObject.getStorage(data.args[1]) - postData(data._seed, storage) - - break - case "getStateKeyVals": - require(1); - var stateObject = eth.getStateObject(data.args[0]).stateKeyVal(true) - postData(data._seed,stateObject) - - break - case "getTransactionsFor": - require(1); - var txs = eth.getTransactionsFor(data.args[0], true) - postData(data._seed, txs) - - break - case "getBalance": - require(1); - - postData(data._seed, eth.getStateObject(data.args[0]).value()); - - break - case "getKey": - var key = eth.getKey().privateKey; - - postData(data._seed, key) - break - case "watch": - require(1) - eth.watch(data.args[0], data.args[1]); - break - case "disconnect": - require(1) - postData(data._seed, null) - break; - case "set": - console.log("'Set' has been depcrecated") - /* - for(var key in data.args) { - if(webview.hasOwnProperty(key)) { - window[key] = data.args[key]; - } - } - */ - break; - case "getSecretToAddress": - require(1) - postData(data._seed, eth.secretToAddress(data.args[0])) - break; - case "debug": - console.log(data.args[0]); - break; - } - } catch(e) { - console.log(data.call + ": " + e) - - postData(data._seed, null); - } -} - -function postData(seed, data) { - webview.experimental.postMessage(JSON.stringify({data: data, _seed: seed})) -} diff --git a/ethereal/assets/pick.png b/ethereal/assets/pick.png new file mode 100644 index 0000000000000000000000000000000000000000..2f5a261c263a476ffaa7b5b4db19766077b87acb GIT binary patch literal 932 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}oCO|{#S9GG z!XV7ZFl&wkP(fs7NJL45ua8x7ey(0(N`6wRUPW#JP&EUCO@$SZnVVXYs8ErclUHn2 zVXFjIVFhG^g!Ppaz)DK8ZIvQ?0~DO|i&7O#^-S~(l1AfjnEK zjFOT9D}DX)@^Za$W4-*MbbUihOG|wNBYh(yU7!lx;>x^|#0uTKVr7USFmqf|i<65o z3raHc^AtelCMM;Vme?vOfh>Xph&xL%(-1c06+^uR^q@XSM&D4+Kp$>4P^%3{)XKjo zGZknv$b36P8?Z_gF{nK@`XI}Z90TzwSQO}0J1!f2c(B=V`5aP@1P1aGPZ!6K2+p@t z_Ifcp3LGzvmkMM~N?a^>BwWB-I(zk$uHGM!H(qdaWTh%1%w^#lL zhh0O(&d=tvVk3DIAYwdEEuSyVLnJi%UP})Z0xvd(j zg56ADpS*oIEQHK0e>nBWlcNPBm>|1{`XWay0$BktQHz%nn{BK_|kKweF zpYrnwd=C~s@k*4)Yx>j{a*#tjFtcT&?#(O5Tg?;ro4Def_wM@nN#mo|&bA{D6!m;N zJRi?AS*YgnF!;o~gOQ>80w!=T*OUF3`ib{s^Gx$ZsfZ0H-iG@g&7E~3g{w@kRAte% zP5izEDMf+Xzsji|y7hl;fSudheFbI0rQga7H)a<^Y`&>fqE#K>>tNG<-=J}=-y~_v zG%s5<#xj?^N59vFINd2Mx_n~2;B2;{GwL78)jqJzuJEqBm$&>6DC>B-`njxgN@xNA DTr*?p literal 0 HcmV?d00001 diff --git a/ethereal/assets/qml/views/history.qml b/ethereal/assets/qml/views/history.qml index f50ae8004..a73b7367d 100644 --- a/ethereal/assets/qml/views/history.qml +++ b/ethereal/assets/qml/views/history.qml @@ -29,7 +29,7 @@ Rectangle { model: txModel } - function addTx(type, tx, inout) { + function addTx(tx, inout) { var isContract if (tx.contract == true){ isContract = "Yes" diff --git a/ethereal/assets/qml/views/info.qml b/ethereal/assets/qml/views/info.qml index 9e05e2f8e..fcddd46e2 100644 --- a/ethereal/assets/qml/views/info.qml +++ b/ethereal/assets/qml/views/info.qml @@ -17,6 +17,7 @@ Rectangle { color: "#00000000" Column { + id: info spacing: 3 anchors.fill: parent anchors.topMargin: 5 @@ -49,7 +50,7 @@ Rectangle { } TableView { id: addressView - width: parent.width - 200 + width: parent.width height: 200 anchors.bottom: logLayout.top TableViewColumn{ role: "name"; title: "name" } @@ -58,30 +59,6 @@ Rectangle { model: addressModel } - Rectangle { - anchors.top: addressView.top - anchors.left: addressView.right - anchors.leftMargin: 20 - - TextField { - placeholderText: "Name to register" - id: nameToReg - width: 150 - } - - Button { - anchors.top: nameToReg.bottom - text: "Register" - MouseArea{ - anchors.fill: parent - onClicked: { - gui.registerName(nameToReg.text) - nameToReg.text = "" - } - } - } - } - property var logModel: ListModel { id: logModel } diff --git a/ethereal/assets/qml/views/javascript.qml b/ethereal/assets/qml/views/javascript.qml new file mode 100644 index 000000000..376397130 --- /dev/null +++ b/ethereal/assets/qml/views/javascript.qml @@ -0,0 +1,45 @@ +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 +import Ethereum 1.0 + +Rectangle { + property var title: "JavaScript" + property var iconFile: "../tx.png" + + objectName: "javascriptView" + visible: false + anchors.fill: parent + + TextField { + id: input + anchors { + left: parent.left + right: parent.right + bottom: parent.bottom + } + height: 20 + + Keys.onReturnPressed: { + var res = eth.evalJavascriptString(this.text); + this.text = ""; + + output.append(res) + } + } + + TextArea { + id: output + verticalAlignment: TextEdit.AlignBottom + text: "> JSRE Ready..." + anchors { + top: parent.top + left: parent.left + right: parent.right + bottom: input.top + } + } +} diff --git a/ethereal/assets/qml/views/pending_tx.qml b/ethereal/assets/qml/views/pending_tx.qml index 18572e3e2..5c5c496d6 100644 --- a/ethereal/assets/qml/views/pending_tx.qml +++ b/ethereal/assets/qml/views/pending_tx.qml @@ -30,7 +30,7 @@ Rectangle { model: pendingTxModel } - function addTx(type, tx, inout) { + function addTx(tx, inout) { var isContract if (tx.contract == true){ isContract = "Yes" diff --git a/ethereal/assets/qml/wallet.qml b/ethereal/assets/qml/wallet.qml index 3fc9a024c..769edfc6a 100644 --- a/ethereal/assets/qml/wallet.qml +++ b/ethereal/assets/qml/wallet.qml @@ -24,6 +24,7 @@ ApplicationWindow { var chainView = addPlugin("./views/chain.qml", {title: "Block chain"}) var infoView = addPlugin("./views/info.qml", {title: "Info"}) var pendingTxView = addPlugin("./views/pending_tx.qml", {title: "Pending", canClose: true}) + var pendingTxView = addPlugin("./views/javascript.qml", {title: "JavaScript", canClose: true}) // Call the ready handler gui.done() @@ -259,8 +260,8 @@ ApplicationWindow { ********************/ Rectangle { id: menu - Layout.minimumWidth: 180 - Layout.maximumWidth: 180 + Layout.minimumWidth: 80 + Layout.maximumWidth: 80 anchors.top: parent.top color: "#252525" @@ -398,9 +399,9 @@ ApplicationWindow { function importApp(path) { var ext = path.split('.').pop() if(ext == "html" || ext == "htm") { - ui.openHtml(path) + eth.openHtml(path) }else if(ext == "qml"){ - ui.openQml(path) + eth.openQml(path) } } diff --git a/ethereal/assets/qml/webapp.qml b/ethereal/assets/qml/webapp.qml index a848adf45..ec2f01741 100644 --- a/ethereal/assets/qml/webapp.qml +++ b/ethereal/assets/qml/webapp.qml @@ -21,46 +21,62 @@ ApplicationWindow { id: root anchors.fill: parent state: "inspectorShown" - TextField { + + RowLayout { + id: navBar anchors { - top: parent.top left: parent.left right: parent.right } - id: uriNav - //text: webview.url - Keys.onReturnPressed: { - var uri = this.text; - if(!/.*\:\/\/.*/.test(uri)) { - uri = "http://" + uri; + Button { + id: back + iconSource: "../back.png" + onClicked: { + webview.goBack() } + } - var reg = /(^https?\:\/\/(?:www\.)?)([a-zA-Z0-9_\-]*\.eth)(.*)/ - - if(reg.test(uri)) { - this.text.replace(reg, function(match, pre, domain, path) { - uri = pre; - - var lookup = eth.lookupDomain(domain.substring(0, domain.length - 4)); - var ip = []; - for(var i = 0, l = lookup.length; i < l; i++) { - ip.push(lookup.charCodeAt(i)) - } - - if(ip.length != 0) { - uri += lookup; - } else { - uri += domain; - } - - uri += path; - }); + TextField { + anchors { + top: parent.top + left: back.right + right: parent.right } + id: uriNav - console.log("connecting to ...", uri) + Keys.onReturnPressed: { + var uri = this.text; + if(!/.*\:\/\/.*/.test(uri)) { + uri = "http://" + uri; + } - webview.url = uri; + var reg = /(^https?\:\/\/(?:www\.)?)([a-zA-Z0-9_\-]*\.eth)(.*)/ + + if(reg.test(uri)) { + this.text.replace(reg, function(match, pre, domain, path) { + uri = pre; + + var lookup = eth.lookupDomain(domain.substring(0, domain.length - 4)); + var ip = []; + for(var i = 0, l = lookup.length; i < l; i++) { + ip.push(lookup.charCodeAt(i)) + } + + if(ip.length != 0) { + uri += lookup; + } else { + uri += domain; + } + + uri += path; + }); + } + + console.log("connecting to ...", uri) + + webview.url = uri; + } } } @@ -71,7 +87,7 @@ ApplicationWindow { left: parent.left right: parent.right bottom: parent.bottom - top: uriNav.bottom + top: navBar.bottom } onTitleChanged: { window.title = title } experimental.preferences.javascriptEnabled: true @@ -86,103 +102,107 @@ ApplicationWindow { try { switch(data.call) { case "getCoinBase": - postData(data._seed, eth.getCoinBase()) + postData(data._seed, eth.getCoinBase()) + + break - break case "getIsListening": - postData(data._seed, eth.getIsListening()) + postData(data._seed, eth.getIsListening()) + + break - break case "getIsMining": - postData(data._seed, eth.getIsMining()) + postData(data._seed, eth.getIsMining()) + + break - break case "getPeerCount": - postData(data._seed, eth.getPeerCount()) + postData(data._seed, eth.getPeerCount()) - break + break case "getTxCountAt": - require(1) - postData(data._seed, eth.getTxCountAt(data.args[0])) + require(1) + postData(data._seed, eth.getTxCountAt(data.args[0])) + + break - break case "getBlockByNumber": - var block = eth.getBlock(data.args[0]) - postData(data._seed, block) + var block = eth.getBlock(data.args[0]) + postData(data._seed, block) + + break - break case "getBlockByHash": - var block = eth.getBlock(data.args[0]) - postData(data._seed, block) + var block = eth.getBlock(data.args[0]) + postData(data._seed, block) + + break - break case "transact": - require(5) + require(5) - var tx = eth.transact(data.args[0], data.args[1], data.args[2],data.args[3],data.args[4],data.args[5]) - postData(data._seed, tx) + var tx = eth.transact(data.args[0], data.args[1], data.args[2],data.args[3],data.args[4],data.args[5]) + postData(data._seed, tx) - break - case "create": - postData(data._seed, null) + break - break case "getStorage": - require(2); + require(2); - var stateObject = eth.getStateObject(data.args[0]) - var storage = stateObject.getStorage(data.args[1]) - postData(data._seed, storage) + var stateObject = eth.getStateObject(data.args[0]) + var storage = stateObject.getStorage(data.args[1]) + postData(data._seed, storage) + + break - break case "getStateKeyVals": - require(1); - var stateObject = eth.getStateObject(data.args[0]).stateKeyVal(true) - postData(data._seed,stateObject) + require(1); + var stateObject = eth.getStateObject(data.args[0]).stateKeyVal(true) + postData(data._seed,stateObject) + + break - break case "getTransactionsFor": - require(1); - var txs = eth.getTransactionsFor(data.args[0], true) - postData(data._seed, txs) + require(1); + var txs = eth.getTransactionsFor(data.args[0], true) + postData(data._seed, txs) + + break - break case "getBalance": - require(1); + require(1); - postData(data._seed, eth.getStateObject(data.args[0]).value()); + postData(data._seed, eth.getStateObject(data.args[0]).value()); + + break - break case "getKey": - var key = eth.getKey().privateKey; + var key = eth.getKey().privateKey; + + postData(data._seed, key) + break - postData(data._seed, key) - break case "watch": - require(1) - eth.watch(data.args[0], data.args[1]); - break + require(1) + eth.watch(data.args[0], data.args[1]); + + break + case "disconnect": - require(1) - postData(data._seed, null) - break; - case "set": - console.log("'Set' has been depcrecated") - /* - for(var key in data.args) { - if(webview.hasOwnProperty(key)) { - window[key] = data.args[key]; - } - } - */ - break; + require(1) + postData(data._seed, null) + + break; + case "getSecretToAddress": - require(1) - postData(data._seed, eth.secretToAddress(data.args[0])) - break; + require(1) + postData(data._seed, eth.secretToAddress(data.args[0])) + + break; + case "debug": - console.log(data.args[0]); + console.log(data.args[0]); break; } } catch(e) { @@ -215,12 +235,13 @@ ApplicationWindow { postEvent(ev, [storageObject.address, storageObject.value]) } } + Rectangle { id: toggleInspector color: "#bcbcbc" visible: true - height: 12 - width: 12 + height: 20 + width: 20 anchors { right: root.right } @@ -233,8 +254,8 @@ ApplicationWindow { inspector.url = webview.experimental.remoteInspectorUrl } } + onDoubleClicked: { - console.log('refreshing') webView.reload() } anchors.fill: parent diff --git a/ethereal/gui.go b/ethereal/gui.go index a4e3efb19..710a1bd1e 100644 --- a/ethereal/gui.go +++ b/ethereal/gui.go @@ -282,7 +282,11 @@ func (gui *Gui) insertTransaction(window string, tx *ethchain.Transaction) { ptx.Sender = s ptx.Address = r - gui.getObjectByName("transactionView").Call("addTx", window, ptx, inout) + if window == "post" { + gui.getObjectByName("transactionView").Call("addTx", ptx, inout) + } else { + gui.getObjectByName("pendingTxView").Call("addTx", ptx, inout) + } } func (gui *Gui) readPreviousTransactions() { diff --git a/ethereal/main.go b/ethereal/main.go index 04a04536d..431307c6f 100644 --- a/ethereal/main.go +++ b/ethereal/main.go @@ -17,6 +17,9 @@ const ( func main() { runtime.GOMAXPROCS(runtime.NumCPU()) + // This is a bit of a cheat, but ey! + os.Setenv("QTWEBKIT_INSPECTOR_SERVER", "127.0.0.1:99999") + qml.Init(nil) var interrupted = false diff --git a/ethereal/ui_lib.go b/ethereal/ui_lib.go index b7cabf3a8..f900fcaee 100644 --- a/ethereal/ui_lib.go +++ b/ethereal/ui_lib.go @@ -1,6 +1,7 @@ package main import ( + "fmt" "path" "github.com/ethereum/eth-go" @@ -42,6 +43,15 @@ func (self *UiLib) EvalJavascriptFile(path string) { self.jsEngine.LoadExtFile(path[7:]) } +func (self *UiLib) EvalJavascriptString(str string) string { + value, err := self.jsEngine.Run(str) + if err != nil { + return err.Error() + } + + return fmt.Sprintf("%v", value) +} + func (ui *UiLib) OpenQml(path string) { container := NewQmlApplication(path[7:], ui) app := NewExtApplication(container, ui)