From a8fcaee72fe985eedb623ee6b8e4f0247e95172b Mon Sep 17 00:00:00 2001 From: yann300 Date: Wed, 21 Jan 2015 15:49:04 +0100 Subject: [PATCH] - Right side pane resizing (list fill empty space). - Capitalisation. - Storage/MemoryDump/CallData add splitter. - Small changes on step icons. - App resizing: dock the right view on the main window. - Assembly code selection change (selection change move faster). - Reverse stack list. - Misc changes on debug info list. - Misc changes on debug button behavior + F10/F9 bug fixes. --- mix/AssemblyDebuggerControl.cpp | 2 +- mix/ClientModel.cpp | 5 +- mix/DebuggingStateWrapper.cpp | 1 + mix/qml.qrc | 1 + mix/qml/DebugBasicInfo.qml | 4 +- mix/qml/DebugInfoList.qml | 97 +++-- mix/qml/Debugger.qml | 704 +++++++++++++++++-------------- mix/qml/ItemDelegateDataDump.qml | 20 +- mix/qml/MainContent.qml | 61 ++- mix/qml/NewProjectDialog.qml | 2 +- mix/qml/ProjectModel.qml | 4 +- mix/qml/Splitter.qml | 51 +++ mix/qml/StateDialog.qml | 2 +- mix/qml/StatusPane.qml | 7 +- mix/qml/StepActionImage.qml | 3 +- mix/qml/TransactionDialog.qml | 4 +- mix/qml/js/Debugger.js | 26 +- mix/qml/main.qml | 16 +- 18 files changed, 599 insertions(+), 411 deletions(-) create mode 100644 mix/qml/Splitter.qml diff --git a/mix/AssemblyDebuggerControl.cpp b/mix/AssemblyDebuggerControl.cpp index f68ddc792..f52245450 100644 --- a/mix/AssemblyDebuggerControl.cpp +++ b/mix/AssemblyDebuggerControl.cpp @@ -49,5 +49,5 @@ void AssemblyDebuggerControl::start() const void AssemblyDebuggerControl::showDebugger() { QObject* debugPanel = m_view->findChild("debugPanel", Qt::FindChildrenRecursively); - QMetaObject::invokeMethod(debugPanel, "update"); + QMetaObject::invokeMethod(debugPanel, "update", Q_ARG(QVariant, true)); } diff --git a/mix/ClientModel.cpp b/mix/ClientModel.cpp index eb61c8554..b3a67536d 100644 --- a/mix/ClientModel.cpp +++ b/mix/ClientModel.cpp @@ -80,7 +80,10 @@ void ClientModel::debugState(QVariantMap _state) TransactionSettings transactionSettings(functionId, value, gas, gasPrice); for (auto p = params.cbegin(); p != params.cend(); ++p) - transactionSettings.parameterValues.insert(std::make_pair(p.key(), (qvariant_cast(p.value()))->toU256Wei())); + { + QBigInt* param = qvariant_cast(p.value()); + transactionSettings.parameterValues.insert(std::make_pair(p.key(), boost::get(param->internalValue()))); + } transactionSequence.push_back(transactionSettings); } diff --git a/mix/DebuggingStateWrapper.cpp b/mix/DebuggingStateWrapper.cpp index 69f5c2ee5..e19d2aea3 100644 --- a/mix/DebuggingStateWrapper.cpp +++ b/mix/DebuggingStateWrapper.cpp @@ -89,6 +89,7 @@ QStringList DebuggingStateWrapper::debugStack() for (auto i: m_state.stack) stack.append(QString::fromStdString(prettyU256(i))); + std::reverse(stack.begin(), stack.end()); return fillList(stack, ""); } diff --git a/mix/qml.qrc b/mix/qml.qrc index 169d1ebcb..3cf593837 100644 --- a/mix/qml.qrc +++ b/mix/qml.qrc @@ -43,5 +43,6 @@ qml/Ether.qml qml/EtherValue.qml qml/BigIntValue.qml + qml/Splitter.qml diff --git a/mix/qml/DebugBasicInfo.qml b/mix/qml/DebugBasicInfo.qml index 3e28aa4c1..d92390ec2 100644 --- a/mix/qml/DebugBasicInfo.qml +++ b/mix/qml/DebugBasicInfo.qml @@ -5,8 +5,6 @@ import QtQuick.Controls.Styles 1.1 RowLayout { property string titleStr - width: parent.width - height: parent.height / 4 function update(_value) { @@ -14,7 +12,7 @@ RowLayout { } Rectangle { - width: parent.width / 2 + width: 120 height: parent.height color: "#e5e5e5" Text diff --git a/mix/qml/DebugInfoList.qml b/mix/qml/DebugInfoList.qml index 6f65cc30d..a4f8e6a82 100644 --- a/mix/qml/DebugInfoList.qml +++ b/mix/qml/DebugInfoList.qml @@ -9,6 +9,23 @@ ColumnLayout { property bool collapsible; property Component itemDelegate spacing: 0 + + function collapse() + { + storageContainer.state = "collapsed"; + } + + function show() + { + storageContainer.state = ""; + } + + Component.onCompleted: + { + if (storageContainer.parent.parent.height === 25) + storageContainer.state = "collapsed"; + } + RowLayout { height: 25 id: header @@ -17,7 +34,6 @@ ColumnLayout { width: 15 sourceSize.width: 15 id: storageImgArrow - visible: collapsible } Text { @@ -32,52 +48,51 @@ ColumnLayout { enabled: collapsible anchors.fill: parent onClicked: { - if (storageContainer.state == "collapsed") - storageContainer.state = ""; - else - storageContainer.state = "collapsed"; + if (collapsible) + { + if (storageContainer.state == "collapsed") + { + storageContainer.state = ""; + storageContainer.parent.parent.height = storageContainer.parent.parent.Layout.maximumHeight; + + } + else + storageContainer.state = "collapsed"; + } } } } - - RowLayout + Rectangle { - height: parent.height - header.height - clip: true - Rectangle - { - height: parent.height - border.width: 3 - border.color: "#deddd9" - Layout.fillWidth: true - states: [ - State { - name: "collapsed" - PropertyChanges { - target: storageContainer.parent - height: 0 - visible: false - } - PropertyChanges { - target: storageImgArrow - source: "qrc:/qml/img/closedtriangleindicator.png" - } + border.width: 3 + border.color: "#deddd9" + Layout.fillWidth: true + Layout.fillHeight: true + states: [ + State { + name: "collapsed" + PropertyChanges { + target: storageImgArrow + source: "qrc:/qml/img/closedtriangleindicator.png" + } + PropertyChanges { + target: storageContainer.parent.parent + height: 25 } - ] - id: storageContainer - width: parent.width - ListView { - clip: true; - anchors.top: parent.top - anchors.left: parent.left - anchors.topMargin: 3 - anchors.leftMargin: 3 - width: parent.width - 3 - height: parent.height - 6 - id: storageList - model: listModel - delegate: itemDelegate } + ] + id: storageContainer + ListView { + clip: true; + anchors.top: parent.top + anchors.left: parent.left + anchors.topMargin: 3 + anchors.leftMargin: 3 + width: parent.width - 3 + height: parent.height - 6 + id: storageList + model: listModel + delegate: itemDelegate } } } diff --git a/mix/qml/Debugger.qml b/mix/qml/Debugger.qml index ac449065b..f31958444 100644 --- a/mix/qml/Debugger.qml +++ b/mix/qml/Debugger.qml @@ -3,6 +3,7 @@ import QtQuick.Controls.Styles 1.1 import QtQuick.Controls 1.1 import QtQuick.Dialogs 1.1 import QtQuick.Layouts 1.1 +import Qt.labs.settings 1.0 import "js/Debugger.js" as Debugger import "js/ErrorLocationFormater.js" as ErrorLocationFormater @@ -20,7 +21,13 @@ Rectangle { Debugger.moveSelection(-1); } - function update() + onVisibleChanged: + { + if (visible) + forceActiveFocus(); + } + + function update(giveFocus) { if (statusPane.result.successful) { @@ -39,11 +46,13 @@ Rectangle { errorDetail.text = errorInfo.errorDetail; errorLine.text = errorInfo.errorLine; } + if (giveFocus) + forceActiveFocus(); } Connections { target: codeModel - onCompilationComplete: update() + onCompilationComplete: update(false) } Rectangle @@ -95,413 +104,456 @@ Rectangle { } } - Flickable { - property int firstColumnWidth: 170 + property int firstColumnWidth: 180 property int secondColumnWidth: 250 id: debugScrollArea flickableDirection: Flickable.VerticalFlick anchors.fill: parent - contentHeight: machineStates.height + 300 - contentWidth: machineStates.width - - GridLayout + contentHeight: 4000 + contentWidth: parent.width + Rectangle { - property int sideMargin: 10 - id: machineStates - anchors.top: parent.top - anchors.topMargin: 15 - anchors.left: parent.left; - anchors.leftMargin: machineStates.sideMargin - anchors.right: parent.right; - anchors.rightMargin: machineStates.sideMargin - flow: GridLayout.TopToBottom - rowSpacing: 15 - RowLayout { - // step button + slider - spacing: machineStates.sideMargin - height: 27 - width: debugPanel.width - Rectangle - { - height: parent.height - color: "transparent" - width: debugScrollArea.firstColumnWidth - RowLayout { - anchors.horizontalCenter: parent.horizontalCenter - id: jumpButtons - spacing: 3 - StepActionImage - { - id: jumpOutBackAction; - enabledStateImg: "qrc:/qml/img/jumpoutback.png" - disableStateImg: "qrc:/qml/img/jumpoutbackdisabled.png" - onClicked: Debugger.stepOutBack() - width: 25 - height: 27 - } + anchors.fill: parent + ColumnLayout + { + property int sideMargin: 10 + id: machineStates + anchors.top: parent.top + anchors.topMargin: 15 + anchors.left: parent.left; + anchors.leftMargin: machineStates.sideMargin + anchors.right: parent.right; + anchors.rightMargin: machineStates.sideMargin + anchors.fill: parent + Layout.fillWidth: true + Layout.fillHeight: true + RowLayout { + // step button + slider + id: buttonRow + spacing: machineStates.sideMargin + height: 27 + Layout.fillWidth: true - StepActionImage - { - id: jumpIntoBackAction - enabledStateImg: "qrc:/qml/img/jumpintoback.png" - disableStateImg: "qrc:/qml/img/jumpintobackdisabled.png" - onClicked: Debugger.stepIntoBack() - width: 25 - height: 27 - } + Rectangle + { + height: parent.height + color: "transparent" + width: debugScrollArea.firstColumnWidth + RowLayout { + anchors.horizontalCenter: parent.horizontalCenter + id: jumpButtons + spacing: 3 + StepActionImage + { + id: jumpOutBackAction; + enabledStateImg: "qrc:/qml/img/jumpoutback.png" + disableStateImg: "qrc:/qml/img/jumpoutbackdisabled.png" + onClicked: Debugger.stepOutBack() + width: 28 + height: 30 + buttonTooltip: qsTr("Step Out Back") + } - StepActionImage - { - id: jumpOverBackAction - enabledStateImg: "qrc:/qml/img/jumpoverback.png" - disableStateImg: "qrc:/qml/img/jumpoverbackdisabled.png" - onClicked: Debugger.stepOverBack() - width: 25 - height: 27 - } + StepActionImage + { + id: jumpIntoBackAction + enabledStateImg: "qrc:/qml/img/jumpintoback.png" + disableStateImg: "qrc:/qml/img/jumpintobackdisabled.png" + onClicked: Debugger.stepIntoBack() + width: 28 + height: 30 + buttonTooltip: qsTr("Step Into Back") + } - StepActionImage - { - id: jumpOverForwardAction - enabledStateImg: "qrc:/qml/img/jumpoverforward.png" - disableStateImg: "qrc:/qml/img/jumpoverforwarddisabled.png" - onClicked: Debugger.stepOverForward() - width: 25 - height: 27 - } + StepActionImage + { + id: jumpOverBackAction + enabledStateImg: "qrc:/qml/img/jumpoverback.png" + disableStateImg: "qrc:/qml/img/jumpoverbackdisabled.png" + onClicked: Debugger.stepOverBack() + width: 28 + height: 30 + buttonTooltip: qsTr("Step Over Back") + } - StepActionImage - { - id: jumpIntoForwardAction - enabledStateImg: "qrc:/qml/img/jumpintoforward.png" - disableStateImg: "qrc:/qml/img/jumpintoforwarddisabled.png" - onClicked: Debugger.stepIntoForward() - width: 25 - height: 27 - } + StepActionImage + { + id: jumpOverForwardAction + enabledStateImg: "qrc:/qml/img/jumpoverforward.png" + disableStateImg: "qrc:/qml/img/jumpoverforwarddisabled.png" + onClicked: Debugger.stepOverForward() + width: 28 + height: 30 + buttonTooltip: qsTr("Step Over Forward") + } - StepActionImage - { - id: jumpOutForwardAction - enabledStateImg: "qrc:/qml/img/jumpoutforward.png" - disableStateImg: "qrc:/qml/img/jumpoutforwarddisabled.png" - onClicked: Debugger.stepOutForward() - width: 25 - height: 27 + StepActionImage + { + id: jumpIntoForwardAction + enabledStateImg: "qrc:/qml/img/jumpintoforward.png" + disableStateImg: "qrc:/qml/img/jumpintoforwarddisabled.png" + onClicked: Debugger.stepIntoForward() + width: 28 + height: 30 + buttonTooltip: qsTr("Step Into Forward") + } + + StepActionImage + { + id: jumpOutForwardAction + enabledStateImg: "qrc:/qml/img/jumpoutforward.png" + disableStateImg: "qrc:/qml/img/jumpoutforwarddisabled.png" + onClicked: Debugger.stepOutForward() + width: 28 + height: 30 + buttonTooltip: qsTr("Step Out Forward") + } } } - } - Rectangle { - color: "transparent" - width: debugScrollArea.secondColumnWidth - height: parent.height - Slider { - id: statesSlider - anchors.fill: parent - tickmarksEnabled: true - stepSize: 1.0 - onValueChanged: Debugger.jumpTo(value); - style: SliderStyle { - groove: Rectangle { - implicitHeight: 3 - color: "#7da4cd" - radius: 8 - } - handle: Rectangle { - anchors.centerIn: parent - color: control.pressed ? "white" : "lightgray" - border.color: "gray" - border.width: 2 - implicitWidth: 10 - implicitHeight: 10 - radius: 12 + + Rectangle { + color: "transparent" + Layout.fillWidth: true + height: parent.height + Slider { + id: statesSlider + anchors.fill: parent + tickmarksEnabled: true + stepSize: 1.0 + onValueChanged: Debugger.jumpTo(value); + style: SliderStyle { + groove: Rectangle { + implicitHeight: 3 + color: "#7da4cd" + radius: 8 + } + handle: Rectangle { + anchors.centerIn: parent + color: control.pressed ? "white" : "lightgray" + border.color: "gray" + border.width: 2 + implicitWidth: 10 + implicitHeight: 10 + radius: 12 + } } } } } - } - RowLayout { - // Assembly code - width: debugPanel.width - height: 405 - spacing: machineStates.sideMargin + RowLayout { + // Assembly code + id: assemblyCodeRow + Layout.fillWidth: true + height: 405 + implicitHeight: 405 + spacing: machineStates.sideMargin - Rectangle - { - width: debugScrollArea.firstColumnWidth - height: parent.height - border.width: 3 - border.color: "#deddd9" - color: "white" - anchors.top: parent.top - ListView { - anchors.fill: parent - anchors.leftMargin: 3 - anchors.rightMargin: 3 - anchors.topMargin: 3 - anchors.bottomMargin: 3 - clip: true - id: statesList - delegate: renderDelegate - highlight: highlightBar - highlightFollowsCurrentItem: true - } - - Component { - id: highlightBar - Rectangle { - radius: 4 - height: statesList.currentItem.height - width: statesList.currentItem.width; - color: "#4A90E2" - Behavior on y { SpringAnimation { spring: 2; damping: 0.1 } } + Rectangle + { + id: stateListContainer + width: debugScrollArea.firstColumnWidth + height: parent.height + border.width: 3 + border.color: "#deddd9" + color: "white" + anchors.top: parent.top + ListView { + anchors.fill: parent + anchors.leftMargin: 3 + anchors.rightMargin: 3 + anchors.topMargin: 3 + anchors.bottomMargin: 3 + clip: true + id: statesList + delegate: renderDelegate + highlight: highlightBar + highlightFollowsCurrentItem: false } - } - Component { - id: renderDelegate - RowLayout { - id: wrapperItem - height: 20 - width: parent.width - spacing: 5 - Text { - anchors.left: parent.left - anchors.leftMargin: 10 - width: 15 - color: "#b2b3ae" - text: line.split(' ')[0] - font.pointSize: 9 - id: id - wrapMode: Text.NoWrap + Component { + id: highlightBar + Rectangle { + radius: 4 + height: statesList.currentItem.height + width: statesList.currentItem.width; + y: statesList.currentItem.y + color: "#4A90E2" + Behavior on y { + PropertyAnimation { properties: "y"; easing.type: Easing.InOutQuad; duration: 50} + } } - Text { - wrapMode: Text.NoWrap - color: parent.ListView.isCurrentItem ? "white" : "black" - text: line.replace(line.split(' ')[0], '') - anchors.left: id.right - font.pointSize: 9 + } + + Component { + id: renderDelegate + RowLayout { + id: wrapperItem + height: 20 + width: parent.width + spacing: 5 + Text { + anchors.left: parent.left + anchors.leftMargin: 10 + width: 15 + color: "#b2b3ae" + text: line.split(' ')[0] + font.pointSize: 9 + id: id + wrapMode: Text.NoWrap + } + Text { + wrapMode: Text.NoWrap + color: parent.ListView.isCurrentItem ? "white" : "black" + text: line.replace(line.split(' ')[0], '') + anchors.left: id.right + font.pointSize: 9 + } } } } - } - ColumnLayout { - width: debugScrollArea.secondColumnWidth - height: parent.height + //ColumnLayout { Rectangle { - // Info - width: parent.width - id: basicInfoColumn - height: 125 - color: "transparent" - ColumnLayout { - spacing: 0 + Layout.fillWidth: true + height: parent.height //- 2 * stateListContainer.border.width + + ColumnLayout + { width: parent.width - height: parent.height + anchors.fill: parent + spacing: 0 DebugBasicInfo { id: currentStep - titleStr: qsTr("Current step") + titleStr: qsTr("Current Step") + Layout.fillWidth: true + height: 30 } DebugBasicInfo { id: mem - titleStr: qsTr("Adding memory") + titleStr: qsTr("Adding Memory") + Layout.fillWidth: true + height: 30 } DebugBasicInfo { id: stepCost - titleStr: qsTr("Step cost") + titleStr: qsTr("Step Cost") + Layout.fillWidth: true + height: 30 } DebugBasicInfo { id: gasSpent - titleStr: qsTr("Total gas spent") + titleStr: qsTr("Total Gas Spent") + Layout.fillWidth: true + height: 30 + } + + DebugInfoList + { + Layout.fillHeight: true + Layout.fillWidth: true + id: stack + collapsible: false + title : qsTr("Stack") + itemDelegate: Item { + id: renderedItem + height: 25 + width: parent.width + RowLayout + { + anchors.fill: parent + Rectangle + { + id: indexColumn + color: "#f7f7f7" + Layout.fillWidth: true + Layout.minimumWidth: 30 + Layout.preferredWidth: 30 + Layout.maximumWidth: 30 + Layout.minimumHeight: parent.height + Text { + anchors.centerIn: parent + anchors.leftMargin: 5 + font.family: "monospace" + color: "#4a4a4a" + text: model.index; + font.pointSize: 9 + } + } + + Rectangle + { + anchors.left: indexColumn.right + Layout.fillWidth: true + Layout.minimumWidth: 15 + Layout.preferredWidth: 15 + Layout.maximumWidth: 60 + Layout.minimumHeight: parent.height + Text { + anchors.left: parent.left + anchors.leftMargin: 5 + font.family: "monospace" + anchors.verticalCenter: parent.verticalCenter + color: "#4a4a4a" + text: modelData + font.pointSize: 9 + } + } + } + + Rectangle { + id: separator + width: parent.width; + height: 1; + color: "#cccccc" + anchors.bottom: parent.bottom + } + } } } + + } + } - Rectangle { - // Stack - height: 275 - width: parent.width - color: "transparent" + SplitView + { + id: splitInfoList + Layout.fillHeight: true + Layout.fillWidth: true + + Settings { + id: splitSettings + property alias storageHeightSettings: storageRect.height + property alias memoryDumpHeightSettings: memoryRect.height + property alias callDataHeightSettings: callDataRect.height + } + orientation: Qt.Vertical + width: debugPanel.width - 2 * machineStates.sideMargin + Rectangle + { + id: storageRect + width: parent.width + Layout.minimumHeight: 25 + Layout.maximumHeight: 223 + height: 25 DebugInfoList { - id: stack - width: parent.width - height: parent.height - collapsible: false - title : qsTr("Stack") - itemDelegate: Item { - id: renderedItem + id: storage + anchors.fill: parent + collapsible: true + title : qsTr("Storage") + itemDelegate: + Item { height: 27 - width: parent.width + width: parent.width; RowLayout { - anchors.fill: parent + id: row + width: parent.width + height: 26 Rectangle { - id: indexColumn color: "#f7f7f7" Layout.fillWidth: true - Layout.minimumWidth: 30 - Layout.preferredWidth: 30 - Layout.maximumWidth: 30 + Layout.minimumWidth: parent.width / 2 + Layout.preferredWidth: parent.width / 2 + Layout.maximumWidth: parent.width / 2 Layout.minimumHeight: parent.height + Layout.maximumHeight: parent.height Text { - anchors.centerIn: parent + anchors.verticalCenter: parent.verticalCenter + anchors.left: parent.left + font.family: "monospace" anchors.leftMargin: 5 - color: "#8b8b8b" - text: model.index; + color: "#4a4a4a" + text: modelData.split(' ')[0].substring(0, 10); font.pointSize: 9 } } - Rectangle { - anchors.left: indexColumn.right + color: "transparent" Layout.fillWidth: true - Layout.minimumWidth: 15 - Layout.preferredWidth: 15 - Layout.maximumWidth: 60 + Layout.minimumWidth: parent.width / 2 + Layout.preferredWidth: parent.width / 2 + Layout.maximumWidth: parent.width / 2 Layout.minimumHeight: parent.height + Layout.maximumHeight: parent.height Text { - anchors.left: parent.left anchors.leftMargin: 5 + width: parent.width - 5 + wrapMode: Text.Wrap + anchors.left: parent.left + font.family: "monospace" anchors.verticalCenter: parent.verticalCenter - color: "#8b8b8b" - text: modelData + color: "#4a4a4a" + text: modelData.split(' ')[1].substring(0, 10); font.pointSize: 9 } } } Rectangle { - id: separator - width: parent.width; - height: 1; - color: "#cccccc" - anchors.bottom: parent.bottom - } + anchors.top: row.bottom + width: parent.width; + height: 1; + color: "#cccccc" + anchors.bottom: parent.bottom + } } } } - } - } - - Rectangle { - width: debugPanel.width - 2 * machineStates.sideMargin - height: 2; - color: "#e3e3e3" - radius: 3 - } - DebugInfoList - { - id: storage - width: debugPanel.width - 2 * machineStates.sideMargin - height: 223 - collapsible: true - title : qsTr("Storage") - itemDelegate: - Item { - height: 27 - width: parent.width; - RowLayout + Rectangle { - id: row + id: memoryRect; + height: 25 width: parent.width - height: 26 - Rectangle - { - color: "#f7f7f7" - Layout.fillWidth: true - Layout.minimumWidth: parent.width / 2 - Layout.preferredWidth: parent.width / 2 - Layout.maximumWidth: parent.width / 2 - Layout.minimumHeight: parent.height - Layout.maximumHeight: parent.height - Text { - anchors.verticalCenter: parent.verticalCenter - anchors.left: parent.left - anchors.leftMargin: 5 - color: "#8b8b8b" - text: modelData.split(' ')[0].substring(0, 10); - font.pointSize: 9 + Layout.minimumHeight: 25 + Layout.maximumHeight: 223 + DebugInfoList { + id: memoryDump + anchors.fill: parent + collapsible: true + title: qsTr("Memory Dump") + itemDelegate: + Item { + height: 29 + width: parent.width - 3; + ItemDelegateDataDump {} } } - Rectangle - { - color: "transparent" - Layout.fillWidth: true - Layout.minimumWidth: parent.width / 2 - Layout.preferredWidth: parent.width / 2 - Layout.maximumWidth: parent.width / 2 - Layout.minimumHeight: parent.height - Layout.maximumHeight: parent.height - Text { - anchors.leftMargin: 5 - width: parent.width - 5 - wrapMode: Text.Wrap - anchors.left: parent.left - anchors.verticalCenter: parent.verticalCenter - color: "#8b8b8b" - text: modelData.split(' ')[1].substring(0, 10); - font.pointSize: 9 + } + + Rectangle + { + id: callDataRect + height: 25 + width: parent.width + Layout.minimumHeight: 25 + Layout.maximumHeight: 223 + DebugInfoList { + id: callDataDump + anchors.fill: parent + collapsible: true + title: qsTr("Call Data") + itemDelegate: + Item { + height: 29 + width: parent.width - 3; + ItemDelegateDataDump {} } } } - - Rectangle { - anchors.top: row.bottom - width: parent.width; - height: 1; - color: "#cccccc" - anchors.bottom: parent.bottom - } - } - } - - Rectangle { - width: debugPanel.width - 2 * machineStates.sideMargin - height: 2; - color: "#e3e3e3" - radius: 3 - } - - DebugInfoList { - id: memoryDump - width: debugPanel.width - 2 * machineStates.sideMargin - height: 223 - collapsible: true - title: qsTr("Memory Dump") - itemDelegate: - Item { - height: 29 - width: parent.width - 3; - ItemDelegateDataDump {} - } - } - - Rectangle { - width: debugPanel.width - 2 * machineStates.sideMargin - height: 2; - color: "#e3e3e3" - radius: 3 - } - - DebugInfoList { - id: callDataDump - width: debugPanel.width - 2 * machineStates.sideMargin - height: 223 - collapsible: true - title: qsTr("Call data") - itemDelegate: - Item { - height: 29 - width: parent.width - 3; - ItemDelegateDataDump {} + Rectangle + { + width: parent.width + Layout.minimumHeight: 25 + color: "transparent" + } } } } diff --git a/mix/qml/ItemDelegateDataDump.qml b/mix/qml/ItemDelegateDataDump.qml index d8513ac20..8d80c5e29 100644 --- a/mix/qml/ItemDelegateDataDump.qml +++ b/mix/qml/ItemDelegateDataDump.qml @@ -21,8 +21,9 @@ Rectangle { Layout.minimumHeight: parent.height Text { anchors.centerIn: parent - anchors.leftMargin: 5 - color: "#8b8b8b" + font.family: "monospace" + font.bold: true + color: "#4a4a4a" text: modelData[0] font.pointSize: 9; } @@ -30,17 +31,16 @@ Rectangle { Rectangle { - anchors.left: firstCol.right Layout.fillWidth: true Layout.minimumWidth: 90 Layout.preferredWidth: 90 Layout.maximumWidth: 90 Layout.minimumHeight: parent.height Text { - anchors.left: parent.left - anchors.leftMargin: 7 + font.family: "monospace" + font.bold: true anchors.verticalCenter: parent.verticalCenter - color: "#8b8b8b" + color: "#4a4a4a" text: modelData[1] font.pointSize: 9 } @@ -52,12 +52,12 @@ Rectangle { Layout.minimumWidth: 50 Layout.minimumHeight: parent.height Text { - anchors.left: parent.left anchors.verticalCenter: parent.verticalCenter - color: "#ededed" - font.bold: true + anchors.horizontalCenter: parent.horizontalCenter + font.family: "monospace" + color: "#4a4a4a" text: modelData[2] - font.pointSize: 10 + font.pointSize: 9 } } } diff --git a/mix/qml/MainContent.qml b/mix/qml/MainContent.qml index 2b0b50ce5..81771aa35 100644 --- a/mix/qml/MainContent.qml +++ b/mix/qml/MainContent.qml @@ -3,6 +3,7 @@ import QtQuick.Controls 1.1 import QtQuick.Layouts 1.0 import QtQuick.Controls.Styles 1.1 import CodeEditorExtensionManager 1.0 +import Qt.labs.settings 1.0 Rectangle { @@ -17,6 +18,14 @@ Rectangle { anchors.fill: parent id: root + onWidthChanged: + { + if (rightView.visible) + contentView.width = parent.width - projectList.width - rightView.width; + else + contentView.width = parent.width - projectList.width; + } + function toggleRightView() { if (!rightView.visible) @@ -37,6 +46,11 @@ Rectangle { rightView.hide(); } + function rightViewVisible() + { + return rightView.visible; + } + CodeEditorExtensionManager { headerView: headerPaneTabs; rightView: rightPaneTabs; @@ -78,21 +92,37 @@ Rectangle { } } - SplitView { - resizing: false - Layout.row: 1 - orientation: Qt.Horizontal; + Rectangle { Layout.fillWidth: true Layout.preferredHeight: root.height - headerView.height; + Settings { + id: splitSettings + property alias projectWidth: projectList.width + property alias contentViewWidth: contentView.width + property alias rightViewWidth: rightView.width + } + ProjectList { + anchors.left: parent.left id: projectList width: 200 height: parent.height Layout.minimumWidth: 200 } + Splitter + { + id: resizeLeft + itemToStick: projectList + itemMinimumWidth: projectList.Layout.minimumWidth + direction: "right" + brother: contentView + color: "#a2a2a2" + } + Rectangle { + anchors.left: projectList.right id: contentView width: parent.width - projectList.width height: parent.height @@ -103,28 +133,39 @@ Rectangle { } } + Splitter + { + id: resizeRight + visible: false; + itemToStick: rightView + itemMinimumWidth: rightView.Layout.minimumWidth + direction: "left" + brother: contentView + color: "#a2a2a2" + } + Rectangle { visible: false; id: rightView; - Keys.onEscapePressed: - { - hide(); - } + Keys.onEscapePressed: hide() function show() { visible = true; + resizeRight.visible = true; contentView.width = parent.width - projectList.width - rightView.width; } function hide() { + resizeRight.visible = false; visible = false; contentView.width = parent.width - projectList.width; } height: parent.height; - width: 450 - Layout.minimumWidth: 450 + width: 515 + Layout.minimumWidth: 515 + anchors.right: parent.right Rectangle { anchors.fill: parent; id: rightPaneView diff --git a/mix/qml/NewProjectDialog.qml b/mix/qml/NewProjectDialog.qml index 9f88d5238..64d91341d 100644 --- a/mix/qml/NewProjectDialog.qml +++ b/mix/qml/NewProjectDialog.qml @@ -64,7 +64,7 @@ Window { Button { enabled: titleField.text != "" && pathField.text != "" - text: qsTr("Ok"); + text: qsTr("OK"); onClicked: { close(); accepted(); diff --git a/mix/qml/ProjectModel.qml b/mix/qml/ProjectModel.qml index 91a4a97ca..743a2c25f 100644 --- a/mix/qml/ProjectModel.qml +++ b/mix/qml/ProjectModel.qml @@ -85,7 +85,7 @@ Item { FileDialog { id: openProjectFileDialog visible: false - title: qsTr("Open a project") + title: qsTr("Open a Project") selectFolder: true onAccepted: { var path = openProjectFileDialog.fileUrl.toString(); @@ -97,7 +97,7 @@ Item { FileDialog { id: addExistingFileDialog visible: false - title: qsTr("Add a file") + title: qsTr("Add a File") selectFolder: false onAccepted: { var paths = addExistingFileDialog.fileUrls; diff --git a/mix/qml/Splitter.qml b/mix/qml/Splitter.qml new file mode 100644 index 000000000..7876a0d52 --- /dev/null +++ b/mix/qml/Splitter.qml @@ -0,0 +1,51 @@ +import QtQuick 2.2 + +Rectangle { + + property variant itemToStick; + property int itemMinimumWidth; + property string direction; + property variant brother; + + Component.onCompleted: + { + if (direction === "left") + anchors.right = itemToStick.left; + else if (direction === "right") + anchors.left = itemToStick.right; + } + + width: 5 + height: parent.height + anchors.top: parent.top; + MouseArea + { + property int startX: 0; + anchors.fill: parent + onPressed: + { + startX = mouseX; + } + onPositionChanged: + { + parent.x += mouseX; + var diff = 0; + if (direction == "left") + diff = mouseX - startX; + else if (direction == "right") + diff = -(mouseX - startX); + + if (itemMinimumWidth > itemToStick.width - diff) + { + brother.width = brother.width + diff; + itemToStick.width = itemMinimumWidth; + } + else + { + brother.width = brother.width + diff; + itemToStick.width = itemToStick.width - diff; + } + } + cursorShape: Qt.SizeHorCursor + } +} diff --git a/mix/qml/StateDialog.qml b/mix/qml/StateDialog.qml index 55a4df14f..d33123fbb 100644 --- a/mix/qml/StateDialog.qml +++ b/mix/qml/StateDialog.qml @@ -99,7 +99,7 @@ Window { anchors.right: parent.right; Button { - text: qsTr("Ok"); + text: qsTr("OK"); onClicked: { close(); accepted(); diff --git a/mix/qml/StatusPane.qml b/mix/qml/StatusPane.qml index af4f6949e..5a7f7b846 100644 --- a/mix/qml/StatusPane.qml +++ b/mix/qml/StatusPane.qml @@ -65,7 +65,7 @@ Rectangle { visible: false font.pointSize: 9 height: 9 - text: qsTr("See log.") + text: qsTr("See Log.") font.family: "Monospace" objectName: "status" id: logslink @@ -105,8 +105,9 @@ Rectangle { Action { id: debugRunActionIcon onTriggered: { - mainContent.ensureRightView(); - clientModel.debugDeployment(); + mainContent.toggleRightView(); + if (mainContent.rightViewVisible()) + clientModel.debugDeployment(); } enabled: false } diff --git a/mix/qml/StepActionImage.qml b/mix/qml/StepActionImage.qml index fd6a46521..64440aa83 100644 --- a/mix/qml/StepActionImage.qml +++ b/mix/qml/StepActionImage.qml @@ -8,6 +8,7 @@ Rectangle { id: buttonActionContainer property string disableStateImg property string enabledStateImg + property string buttonTooltip signal clicked function enabled(state) @@ -19,7 +20,6 @@ Rectangle { debugImg.iconSource = disableStateImg; } - color: "transparent" Button { anchors.fill: parent @@ -31,6 +31,7 @@ Rectangle { } Action { + tooltip: buttonTooltip id: buttonAction onTriggered: { buttonActionContainer.clicked(); diff --git a/mix/qml/TransactionDialog.qml b/mix/qml/TransactionDialog.qml index 22995d66b..46fe997f0 100644 --- a/mix/qml/TransactionDialog.qml +++ b/mix/qml/TransactionDialog.qml @@ -136,7 +136,7 @@ Window { } Label { - text: qsTr("Gas price") + text: qsTr("Gas Price") } Rectangle { @@ -183,7 +183,7 @@ Window { anchors.right: parent.right; Button { - text: qsTr("Ok"); + text: qsTr("OK"); onClicked: { close(); accepted(); diff --git a/mix/qml/js/Debugger.js b/mix/qml/js/Debugger.js index da3928105..9078befdb 100644 --- a/mix/qml/js/Debugger.js +++ b/mix/qml/js/Debugger.js @@ -7,7 +7,7 @@ var currentSelectedState = null; var jumpStartingPoint = null; function init() { - if (debugStates === undefined) + if (typeof(debugStates) === "undefined") return; statesSlider.maximumValue = debugStates.length - 1; @@ -24,6 +24,9 @@ function init() function moveSelection(incr) { + if (typeof(debugStates) === "undefined") + return; + if (currentSelectedState + incr >= 0) { if (currentSelectedState + incr < debugStates.length) @@ -34,6 +37,9 @@ function moveSelection(incr) function select(stateIndex) { + if (typeof(debugStates) === "undefined") + return; + var codeLine = codeStr(stateIndex); var state = debugStates[stateIndex]; highlightSelection(codeLine); @@ -53,6 +59,9 @@ function select(stateIndex) function codeStr(stateIndex) { + if (typeof(debugStates) === "undefined") + return; + var state = debugStates[stateIndex]; return bytesCodeMapping.getValue(state.curPC); } @@ -64,6 +73,9 @@ function highlightSelection(index) function completeCtxInformation(state) { + if (typeof(debugStates) === "undefined") + return; + currentStep.update(state.step); mem.update(state.newMemSize.value() + " " + qsTr("words")); stepCost.update(state.gasCost.value()); @@ -83,6 +95,9 @@ function displayReturnValue() function stepOutBack() { + if (typeof(debugStates) === "undefined") + return; + if (jumpStartingPoint != null) { select(jumpStartingPoint); @@ -99,6 +114,9 @@ function stepIntoBack() function stepOverBack() { + if (typeof(debugStates) === "undefined") + return; + var state = debugStates[currentSelectedState]; if (state.instruction === "JUMPDEST") { @@ -118,6 +136,9 @@ function stepOverBack() function stepOverForward() { + if (typeof(debugStates) === "undefined") + return; + var state = debugStates[currentSelectedState]; if (state.instruction === "JUMP") { @@ -137,6 +158,9 @@ function stepOverForward() function stepIntoForward() { + if (typeof(debugStates) === "undefined") + return; + var state = debugStates[currentSelectedState]; if (state.instruction === "JUMP") { diff --git a/mix/qml/main.qml b/mix/qml/main.qml index e234d6344..57b9de968 100644 --- a/mix/qml/main.qml +++ b/mix/qml/main.qml @@ -97,7 +97,7 @@ ApplicationWindow { Action { id: createProjectAction - text: qsTr("&New project") + text: qsTr("&New Project") shortcut: "Ctrl+N" enabled: true; onTriggered: projectModel.createProject(); @@ -105,7 +105,7 @@ ApplicationWindow { Action { id: openProjectAction - text: qsTr("&Open project") + text: qsTr("&Open Project") shortcut: "Ctrl+O" enabled: true; onTriggered: projectModel.browseProject(); @@ -113,7 +113,7 @@ ApplicationWindow { Action { id: addNewJsFileAction - text: qsTr("New JavaScript file") + text: qsTr("New JavaScript File") shortcut: "Ctrl+Alt+J" enabled: !projectModel.isEmpty onTriggered: projectModel.newJsFile(); @@ -121,7 +121,7 @@ ApplicationWindow { Action { id: addNewHtmlFileAction - text: qsTr("New HTML file") + text: qsTr("New HTML File") shortcut: "Ctrl+Alt+H" enabled: !projectModel.isEmpty onTriggered: projectModel.newHtmlFile(); @@ -129,7 +129,7 @@ ApplicationWindow { Action { id: addNewContractAction - text: qsTr("New contract") + text: qsTr("New Contract") shortcut: "Ctrl+Alt+C" enabled: !projectModel.isEmpty onTriggered: projectModel.newContract(); @@ -137,7 +137,7 @@ ApplicationWindow { Action { id: addExistingFileAction - text: qsTr("Add existing file") + text: qsTr("Add Existing File") shortcut: "Ctrl+Alt+A" enabled: !projectModel.isEmpty onTriggered: projectModel.addExistingFile(); @@ -145,7 +145,7 @@ ApplicationWindow { Action { id: saveAllFilesAction - text: qsTr("Save all") + text: qsTr("Save All") shortcut: "Ctrl+S" enabled: !projectModel.isEmpty onTriggered: projectModel.saveAll(); @@ -153,7 +153,7 @@ ApplicationWindow { Action { id: closeProjectAction - text: qsTr("Close project") + text: qsTr("Close Project") shortcut: "Ctrl+W" enabled: !projectModel.isEmpty onTriggered: projectModel.closeProject();