plugeth/ethereal/assets/qml/webapp.qml

336 lines
6.7 KiB
QML
Raw Normal View History

import QtQuick 2.0
import QtWebKit 3.0
import QtWebKit.experimental 1.0
import QtQuick.Controls 1.0;
2014-08-14 11:26:29 +00:00
import QtQuick.Controls.Styles 1.0
import QtQuick.Layouts 1.0;
import QtQuick.Window 2.1;
import Ethereum 1.0
ApplicationWindow {
2014-04-29 23:44:12 +00:00
id: window
title: "Ethereum"
2014-08-14 11:26:29 +00:00
width: 1000
height: 800
2014-04-29 23:44:12 +00:00
minimumHeight: 300
property alias url: webview.url
property alias webView: webview
Item {
objectName: "root"
id: root
anchors.fill: parent
state: "inspectorShown"
RowLayout {
id: navBar
2014-08-14 11:26:29 +00:00
height: 40
anchors {
left: parent.left
right: parent.right
2014-08-14 11:26:29 +00:00
leftMargin: 7
}
Button {
id: back
onClicked: {
webview.goBack()
}
2014-08-14 11:26:29 +00:00
style: ButtonStyle {
background: Image {
source: "../back.png"
width: 30
height: 30
}
}
}
TextField {
anchors {
left: back.right
2014-08-14 11:26:29 +00:00
right: toggleInspector.left
leftMargin: 5
rightMargin: 5
2014-08-13 08:52:30 +00:00
}
id: uriNav
2014-08-14 11:26:29 +00:00
y: parent.height / 2 - this.height / 2
Keys.onReturnPressed: {
2014-08-14 11:26:29 +00:00
webview.url = this.text;
}
}
Button {
id: toggleInspector
anchors {
right: parent.right
}
iconSource: "../bug.png"
onClicked: {
if(inspector.visible == true){
inspector.visible = false
}else{
inspector.visible = true
inspector.url = webview.experimental.remoteInspectorUrl
}
}
}
}
WebView {
objectName: "webView"
id: webview
anchors {
left: parent.left
right: parent.right
bottom: parent.bottom
top: navBar.bottom
}
onTitleChanged: { window.title = title }
property var cleanPath: false
onNavigationRequested: {
if(!this.cleanPath) {
var uri = request.url.toString();
if(!/.*\:\/\/.*/.test(uri)) {
uri = "http://" + uri;
}
2014-08-13 08:52:30 +00:00
var reg = /(^https?\:\/\/(?:www\.)?)([a-zA-Z0-9_\-]*\.eth)(.*)/
if(reg.test(uri)) {
2014-08-14 11:26:29 +00:00
uri.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;
});
}
2014-08-14 11:26:29 +00:00
this.cleanPath = true;
webview.url = uri;
2014-08-14 11:26:29 +00:00
} else {
// Prevent inf loop.
this.cleanPath = false;
}
}
2014-04-29 23:44:12 +00:00
experimental.preferences.javascriptEnabled: true
experimental.preferences.navigatorQtObjectEnabled: true
experimental.preferences.developerExtrasEnabled: true
experimental.userScripts: ["../ext/pre.js", "../ext/big.js", "../ext/string.js", "../ext/ethereum.js"]
2014-04-29 23:44:12 +00:00
experimental.onMessageReceived: {
2014-05-05 09:56:05 +00:00
console.log("[onMessageReceived]: ", message.data)
2014-04-29 23:44:12 +00:00
// TODO move to messaging.js
var data = JSON.parse(message.data)
try {
switch(data.call) {
case "getCoinBase":
2014-08-14 11:26:29 +00:00
postData(data._seed, eth.getCoinBase())
2014-08-14 11:26:29 +00:00
break
case "getIsListening":
2014-08-14 11:26:29 +00:00
postData(data._seed, eth.getIsListening())
2014-08-14 11:26:29 +00:00
break
case "getIsMining":
2014-08-14 11:26:29 +00:00
postData(data._seed, eth.getIsMining())
2014-08-14 11:26:29 +00:00
break
case "getPeerCount":
2014-08-14 11:26:29 +00:00
postData(data._seed, eth.getPeerCount())
2014-08-14 11:26:29 +00:00
break
case "getTxCountAt":
2014-08-14 11:26:29 +00:00
require(1)
postData(data._seed, eth.getTxCountAt(data.args[0]))
2014-08-14 11:26:29 +00:00
break
case "getBlockByNumber":
2014-08-14 11:26:29 +00:00
var block = eth.getBlock(data.args[0])
postData(data._seed, block)
2014-08-14 11:26:29 +00:00
break
case "getBlockByHash":
2014-08-14 11:26:29 +00:00
var block = eth.getBlock(data.args[0])
postData(data._seed, block)
2014-08-14 11:26:29 +00:00
break
case "transact":
2014-08-14 11:26:29 +00:00
require(5)
2014-04-29 23:44:12 +00:00
2014-08-14 11:26:29 +00:00
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)
2014-05-02 11:35:12 +00:00
2014-08-14 11:26:29 +00:00
break
2014-04-29 23:44:12 +00:00
case "getStorage":
2014-08-14 11:26:29 +00:00
require(2);
2014-04-29 23:44:12 +00:00
2014-08-14 11:26:29 +00:00
var stateObject = eth.getStateObject(data.args[0])
var storage = stateObject.getStorage(data.args[1])
postData(data._seed, storage)
2014-08-14 11:26:29 +00:00
break
2014-04-29 23:44:12 +00:00
case "getEachStorage":
2014-08-14 11:26:29 +00:00
require(1);
var stateObject = eth.getStateObject(data.args[0]).stateKeyVal(true)
postData(data._seed,stateObject)
2014-08-14 11:26:29 +00:00
break
case "getTransactionsFor":
2014-08-14 11:26:29 +00:00
require(1);
var txs = eth.getTransactionsFor(data.args[0], true)
postData(data._seed, txs)
2014-08-14 11:26:29 +00:00
break
2014-06-25 14:12:53 +00:00
case "getBalance":
2014-08-14 11:26:29 +00:00
require(1);
2014-08-14 11:26:29 +00:00
postData(data._seed, eth.getStateObject(data.args[0]).value());
2014-04-29 23:44:12 +00:00
2014-08-14 11:26:29 +00:00
break
2014-04-29 23:44:12 +00:00
case "getKey":
2014-08-14 11:26:29 +00:00
var key = eth.getKey().privateKey;
2014-08-14 11:26:29 +00:00
postData(data._seed, key)
break
2014-05-05 11:09:11 +00:00
/*
case "watch":
require(1)
eth.watch(data.args[0], data.args[1]);
break
*/
case "watch":
require(2)
eth.watch(data.args[0], data.args[1])
case "disconnect":
2014-08-14 11:26:29 +00:00
require(1)
postData(data._seed, null)
2014-08-14 11:26:29 +00:00
break;
case "getSecretToAddress":
2014-08-14 11:26:29 +00:00
require(1)
postData(data._seed, eth.secretToAddress(data.args[0]))
2014-08-14 11:26:29 +00:00
break;
2014-08-14 15:01:37 +00:00
case "messages":
require(1);
var messages = JSON.parse(eth.getMessages(data.args[0]))
postData(data._seed, messages)
break
case "debug":
console.log(data.args[0]);
2014-05-05 09:56:05 +00:00
break;
2014-04-29 23:44:12 +00:00
}
} catch(e) {
console.log(data.call + ": " + e)
postData(data._seed, null);
}
}
function require(args, num) {
if(args.length < num) {
throw("required argument count of "+num+" got "+args.length);
}
}
function postData(seed, data) {
webview.experimental.postMessage(JSON.stringify({data: data, _seed: seed}))
}
function postEvent(event, data) {
webview.experimental.postMessage(JSON.stringify({data: data, _event: event}))
}
function onWatchedCb(data, id) {
var messages = JSON.parse(data)
postEvent("watched:"+id, messages)
}
2014-04-29 23:44:12 +00:00
function onNewBlockCb(block) {
postEvent("block:new", block)
}
function onObjectChangeCb(stateObject) {
2014-04-30 12:42:57 +00:00
postEvent("object:"+stateObject.address(), stateObject)
2014-04-29 23:44:12 +00:00
}
2014-05-05 09:56:05 +00:00
function onStorageChangeCb(storageObject) {
var ev = ["storage", storageObject.stateAddress, storageObject.address].join(":");
postEvent(ev, [storageObject.address, storageObject.value])
}
2014-04-29 23:44:12 +00:00
}
2014-04-29 23:44:12 +00:00
Rectangle {
id: sizeGrip
color: "gray"
visible: false
height: 10
anchors {
left: root.left
right: root.right
}
y: Math.round(root.height * 2 / 3)
MouseArea {
anchors.fill: parent
drag.target: sizeGrip
drag.minimumY: 0
drag.maximumY: root.height
drag.axis: Drag.YAxis
}
}
WebView {
id: inspector
visible: false
2014-04-29 23:44:12 +00:00
anchors {
left: root.left
right: root.right
top: sizeGrip.bottom
bottom: root.bottom
}
}
states: [
State {
name: "inspectorShown"
PropertyChanges {
target: inspector
}
}
]
}
}