import QtQuick 2.2 import QtQuick.Controls 1.1 import QtQuick.Controls.Styles 1.1 import QtQuick.Dialogs 1.1 import QtQuick.Layouts 1.1 import org.ethereum.qml.RecordLogEntry 1.0 import org.ethereum.qml.InverseMouseArea 1.0 Item { property ListModel fullModel: ListModel{} property ListModel transactionModel: ListModel{} property ListModel callModel: ListModel{} property int selectedStateIndex: statesCombo.selectedIndex ColumnLayout { anchors.fill: parent RowLayout { anchors.right: parent.right anchors.left: parent.left Connections { id: compilationStatus target: codeModel property bool compilationComplete: false onCompilationComplete: compilationComplete = true onCompilationError: compilationComplete = false } Connections { target: projectModel onProjectSaved: { if (projectModel.appIsClosing || projectModel.projectIsClosing) return; if (compilationStatus.compilationComplete && codeModel.hasContract && !clientModel.running) projectModel.stateListModel.debugDefaultState(); } onProjectClosed: { fullModel.clear(); transactionModel.clear(); callModel.clear(); } onContractSaved: { if (compilationStatus.compilationComplete && codeModel.hasContract && !clientModel.running) projectModel.stateListModel.debugDefaultState(); } } StatesComboBox { id: statesCombo items: projectModel.stateListModel onSelectCreate: projectModel.stateListModel.addState() onEditItem: projectModel.stateListModel.editState(item) colorItem: "#808080" colorSelect: "#4a90e2" color: "white" Connections { target: projectModel.stateListModel onStateRun: { if (statesCombo.selectedIndex !== index) statesCombo.setSelectedIndex(index) } onStateListModelReady: { statesCombo.setSelectedIndex(projectModel.stateListModel.defaultStateIndex) } onStateDeleted: { if (index === statesCombo.selectedIndex) statesCombo.setSelectedIndex(0); } } } CheckBox { text: qsTr("Mine") onCheckedChanged: { mineAction.enabled = !checked; mineTimer.running = checked; } } Timer { id: mineTimer repeat: true; interval: 12000 running: false onTriggered: { clientModel.mine(); } } Button { id: mineBtn anchors.rightMargin: 9 anchors.verticalCenter: parent.verticalCenter action: mineAction } ComboBox { id: itemFilter function getCurrentModel() { return currentIndex === 0 ? fullModel : currentIndex === 1 ? transactionModel : currentIndex === 2 ? callModel : fullModel; } model: ListModel { ListElement { text: qsTr("Calls and Transactions"); value: 0; } ListElement { text: qsTr("Only Transactions"); value: 1; } ListElement { text: qsTr("Only Calls"); value: 2; } } onCurrentIndexChanged: { logTable.model = itemFilter.getCurrentModel(); } } } TableView { id: logTable Layout.fillWidth: true Layout.fillHeight: true model: fullModel TableViewColumn { role: "transactionIndex" title: qsTr("#") width: 40 } TableViewColumn { role: "contract" title: qsTr("Contract") width: 100 } TableViewColumn { role: "function" title: qsTr("Function") width: 120 } TableViewColumn { role: "value" title: qsTr("Value") width: 60 } TableViewColumn { role: "address" title: qsTr("Destination") width: 130 } TableViewColumn { role: "returned" title: qsTr("Returned") width: 120 } TableViewColumn { role: "gasUsed" title: qsTr("Gas Used") width: 120 } onActivated: { var item = logTable.model.get(row); if (item.type === RecordLogEntry.Transaction) clientModel.debugRecord(item.recordIndex); else clientModel.emptyRecord(); } Keys.onPressed: { if ((event.modifiers & Qt.ControlModifier) && event.key === Qt.Key_C && currentRow >=0 && currentRow < logTable.model.count) { var item = logTable.model.get(currentRow); clipboard.text = item.returned; } } } } Connections { target: clientModel onStateCleared: { fullModel.clear(); transactionModel.clear(); callModel.clear(); } onNewRecord: { fullModel.append(_r); if (!_r.call) transactionModel.append(_r); else callModel.append(_r); } onMiningComplete: { fullModel.append(clientModel.lastBlock); transactionModel.append(clientModel.lastBlock); } } }