Browse Source

Merge pull request #833 from yann300/debug_design

design changes on debugging feature.
cl-refactor
Gav Wood 10 years ago
parent
commit
6ec371cfac
  1. 2
      mix/AssemblyDebuggerControl.cpp
  2. 5
      mix/ClientModel.cpp
  3. 5
      mix/DebuggingStateWrapper.cpp
  4. 1
      mix/qml.qrc
  5. 4
      mix/qml/DebugBasicInfo.qml
  6. 96
      mix/qml/DebugInfoList.qml
  7. 700
      mix/qml/Debugger.qml
  8. 36
      mix/qml/ItemDelegateDataDump.qml
  9. 61
      mix/qml/MainContent.qml
  10. 2
      mix/qml/NewProjectDialog.qml
  11. 4
      mix/qml/ProjectModel.qml
  12. 47
      mix/qml/Splitter.qml
  13. 2
      mix/qml/StateDialog.qml
  14. 17
      mix/qml/StatusPane.qml
  15. 3
      mix/qml/StepActionImage.qml
  16. 4
      mix/qml/TransactionDialog.qml
  17. 26
      mix/qml/js/Debugger.js
  18. 16
      mix/qml/main.qml

2
mix/AssemblyDebuggerControl.cpp

@ -49,5 +49,5 @@ void AssemblyDebuggerControl::start() const
void AssemblyDebuggerControl::showDebugger() void AssemblyDebuggerControl::showDebugger()
{ {
QObject* debugPanel = m_view->findChild<QObject*>("debugPanel", Qt::FindChildrenRecursively); QObject* debugPanel = m_view->findChild<QObject*>("debugPanel", Qt::FindChildrenRecursively);
QMetaObject::invokeMethod(debugPanel, "update"); QMetaObject::invokeMethod(debugPanel, "update", Q_ARG(QVariant, true));
} }

5
mix/ClientModel.cpp

@ -80,7 +80,10 @@ void ClientModel::debugState(QVariantMap _state)
TransactionSettings transactionSettings(functionId, value, gas, gasPrice); TransactionSettings transactionSettings(functionId, value, gas, gasPrice);
for (auto p = params.cbegin(); p != params.cend(); ++p) for (auto p = params.cbegin(); p != params.cend(); ++p)
transactionSettings.parameterValues.insert(std::make_pair(p.key(), (qvariant_cast<QEther*>(p.value()))->toU256Wei())); {
QBigInt* param = qvariant_cast<QBigInt*>(p.value());
transactionSettings.parameterValues.insert(std::make_pair(p.key(), boost::get<dev::u256>(param->internalValue())));
}
transactionSequence.push_back(transactionSettings); transactionSequence.push_back(transactionSettings);
} }

5
mix/DebuggingStateWrapper.cpp

@ -86,9 +86,8 @@ QBigInt* DebuggingStateWrapper::newMemSize()
QStringList DebuggingStateWrapper::debugStack() QStringList DebuggingStateWrapper::debugStack()
{ {
QStringList stack; QStringList stack;
for (auto i: m_state.stack) for (std::vector<u256>::reverse_iterator i = m_state.stack.rbegin(); i != m_state.stack.rend(); ++i)
stack.append(QString::fromStdString(prettyU256(i))); stack.append(QString::fromStdString(prettyU256(*i)));
return fillList(stack, ""); return fillList(stack, "");
} }

1
mix/qml.qrc

@ -43,5 +43,6 @@
<file>qml/Ether.qml</file> <file>qml/Ether.qml</file>
<file>qml/EtherValue.qml</file> <file>qml/EtherValue.qml</file>
<file>qml/BigIntValue.qml</file> <file>qml/BigIntValue.qml</file>
<file>qml/Splitter.qml</file>
</qresource> </qresource>
</RCC> </RCC>

4
mix/qml/DebugBasicInfo.qml

@ -5,8 +5,6 @@ import QtQuick.Controls.Styles 1.1
RowLayout { RowLayout {
property string titleStr property string titleStr
width: parent.width
height: parent.height / 4
function update(_value) function update(_value)
{ {
@ -14,7 +12,7 @@ RowLayout {
} }
Rectangle { Rectangle {
width: parent.width / 2 width: 120
height: parent.height height: parent.height
color: "#e5e5e5" color: "#e5e5e5"
Text Text

96
mix/qml/DebugInfoList.qml

@ -9,6 +9,23 @@ ColumnLayout {
property bool collapsible; property bool collapsible;
property Component itemDelegate property Component itemDelegate
spacing: 0 spacing: 0
function collapse()
{
storageContainer.state = "collapsed";
}
function show()
{
storageContainer.state = "";
}
Component.onCompleted:
{
if (storageContainer.parent.parent.height === 25)
storageContainer.state = "collapsed";
}
RowLayout { RowLayout {
height: 25 height: 25
id: header id: header
@ -17,7 +34,6 @@ ColumnLayout {
width: 15 width: 15
sourceSize.width: 15 sourceSize.width: 15
id: storageImgArrow id: storageImgArrow
visible: collapsible
} }
Text { Text {
@ -32,52 +48,50 @@ ColumnLayout {
enabled: collapsible enabled: collapsible
anchors.fill: parent anchors.fill: parent
onClicked: { onClicked: {
if (storageContainer.state == "collapsed") if (collapsible)
storageContainer.state = ""; {
else if (storageContainer.state == "collapsed")
storageContainer.state = "collapsed"; {
storageContainer.state = "";
storageContainer.parent.parent.height = storageContainer.parent.parent.Layout.maximumHeight;
}
else
storageContainer.state = "collapsed";
}
} }
} }
} }
Rectangle
RowLayout
{ {
height: parent.height - header.height border.width: 3
clip: true border.color: "#deddd9"
Rectangle Layout.fillWidth: true
{ Layout.fillHeight: true
height: parent.height states: [
border.width: 3 State {
border.color: "#deddd9" name: "collapsed"
Layout.fillWidth: true PropertyChanges {
states: [ target: storageImgArrow
State { source: "qrc:/qml/img/closedtriangleindicator.png"
name: "collapsed" }
PropertyChanges { PropertyChanges {
target: storageContainer.parent target: storageContainer.parent.parent
height: 0 height: 25
visible: false
}
PropertyChanges {
target: storageImgArrow
source: "qrc:/qml/img/closedtriangleindicator.png"
}
} }
]
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
} }
} }
} }

700
mix/qml/Debugger.qml

@ -3,6 +3,7 @@ import QtQuick.Controls.Styles 1.1
import QtQuick.Controls 1.1 import QtQuick.Controls 1.1
import QtQuick.Dialogs 1.1 import QtQuick.Dialogs 1.1
import QtQuick.Layouts 1.1 import QtQuick.Layouts 1.1
import Qt.labs.settings 1.0
import "js/Debugger.js" as Debugger import "js/Debugger.js" as Debugger
import "js/ErrorLocationFormater.js" as ErrorLocationFormater import "js/ErrorLocationFormater.js" as ErrorLocationFormater
@ -20,7 +21,13 @@ Rectangle {
Debugger.moveSelection(-1); Debugger.moveSelection(-1);
} }
function update() onVisibleChanged:
{
if (visible)
forceActiveFocus();
}
function update(giveFocus)
{ {
if (statusPane.result.successful) if (statusPane.result.successful)
{ {
@ -39,11 +46,13 @@ Rectangle {
errorDetail.text = errorInfo.errorDetail; errorDetail.text = errorInfo.errorDetail;
errorLine.text = errorInfo.errorLine; errorLine.text = errorInfo.errorLine;
} }
if (giveFocus)
forceActiveFocus();
} }
Connections { Connections {
target: codeModel target: codeModel
onCompilationComplete: update() onCompilationComplete: update(false)
} }
Rectangle Rectangle
@ -95,413 +104,452 @@ Rectangle {
} }
} }
Flickable { Flickable {
property int firstColumnWidth: 170 property int firstColumnWidth: 180
property int secondColumnWidth: 250 property int secondColumnWidth: 250
id: debugScrollArea id: debugScrollArea
flickableDirection: Flickable.VerticalFlick flickableDirection: Flickable.VerticalFlick
anchors.fill: parent anchors.fill: parent
contentHeight: machineStates.height + 300 contentHeight: 4000
contentWidth: machineStates.width contentWidth: parent.width
Rectangle
GridLayout
{ {
property int sideMargin: 10 anchors.fill: parent
id: machineStates ColumnLayout
anchors.top: parent.top {
anchors.topMargin: 15 property int sideMargin: 10
anchors.left: parent.left; id: machineStates
anchors.leftMargin: machineStates.sideMargin anchors.top: parent.top
anchors.right: parent.right; anchors.topMargin: 15
anchors.rightMargin: machineStates.sideMargin anchors.left: parent.left;
flow: GridLayout.TopToBottom anchors.leftMargin: machineStates.sideMargin
rowSpacing: 15 anchors.right: parent.right;
RowLayout { anchors.rightMargin: machineStates.sideMargin
// step button + slider anchors.fill: parent
spacing: machineStates.sideMargin Layout.fillWidth: true
height: 27 Layout.fillHeight: true
width: debugPanel.width RowLayout {
Rectangle // step button + slider
{ id: buttonRow
height: parent.height spacing: machineStates.sideMargin
color: "transparent" height: 27
width: debugScrollArea.firstColumnWidth Layout.fillWidth: true
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
}
StepActionImage Rectangle
{ {
id: jumpIntoBackAction height: parent.height
enabledStateImg: "qrc:/qml/img/jumpintoback.png" color: "transparent"
disableStateImg: "qrc:/qml/img/jumpintobackdisabled.png" width: debugScrollArea.firstColumnWidth
onClicked: Debugger.stepIntoBack() RowLayout {
width: 25 anchors.horizontalCenter: parent.horizontalCenter
height: 27 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 StepActionImage
{ {
id: jumpOverBackAction id: jumpIntoBackAction
enabledStateImg: "qrc:/qml/img/jumpoverback.png" enabledStateImg: "qrc:/qml/img/jumpintoback.png"
disableStateImg: "qrc:/qml/img/jumpoverbackdisabled.png" disableStateImg: "qrc:/qml/img/jumpintobackdisabled.png"
onClicked: Debugger.stepOverBack() onClicked: Debugger.stepIntoBack()
width: 25 width: 28
height: 27 height: 30
} buttonTooltip: qsTr("Step Into Back")
}
StepActionImage StepActionImage
{ {
id: jumpOverForwardAction id: jumpOverBackAction
enabledStateImg: "qrc:/qml/img/jumpoverforward.png" enabledStateImg: "qrc:/qml/img/jumpoverback.png"
disableStateImg: "qrc:/qml/img/jumpoverforwarddisabled.png" disableStateImg: "qrc:/qml/img/jumpoverbackdisabled.png"
onClicked: Debugger.stepOverForward() onClicked: Debugger.stepOverBack()
width: 25 width: 28
height: 27 height: 30
} buttonTooltip: qsTr("Step Over Back")
}
StepActionImage StepActionImage
{ {
id: jumpIntoForwardAction id: jumpOverForwardAction
enabledStateImg: "qrc:/qml/img/jumpintoforward.png" enabledStateImg: "qrc:/qml/img/jumpoverforward.png"
disableStateImg: "qrc:/qml/img/jumpintoforwarddisabled.png" disableStateImg: "qrc:/qml/img/jumpoverforwarddisabled.png"
onClicked: Debugger.stepIntoForward() onClicked: Debugger.stepOverForward()
width: 25 width: 28
height: 27 height: 30
} buttonTooltip: qsTr("Step Over Forward")
}
StepActionImage StepActionImage
{ {
id: jumpOutForwardAction id: jumpIntoForwardAction
enabledStateImg: "qrc:/qml/img/jumpoutforward.png" enabledStateImg: "qrc:/qml/img/jumpintoforward.png"
disableStateImg: "qrc:/qml/img/jumpoutforwarddisabled.png" disableStateImg: "qrc:/qml/img/jumpintoforwarddisabled.png"
onClicked: Debugger.stepOutForward() onClicked: Debugger.stepIntoForward()
width: 25 width: 28
height: 27 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 { Rectangle {
color: "transparent" color: "transparent"
width: debugScrollArea.secondColumnWidth Layout.fillWidth: true
height: parent.height height: parent.height
Slider { Slider {
id: statesSlider id: statesSlider
anchors.fill: parent anchors.fill: parent
tickmarksEnabled: true tickmarksEnabled: true
stepSize: 1.0 stepSize: 1.0
onValueChanged: Debugger.jumpTo(value); onValueChanged: Debugger.jumpTo(value);
style: SliderStyle { style: SliderStyle {
groove: Rectangle { groove: Rectangle {
implicitHeight: 3 implicitHeight: 3
color: "#7da4cd" color: "#7da4cd"
radius: 8 radius: 8
} }
handle: Rectangle { handle: Rectangle {
anchors.centerIn: parent anchors.centerIn: parent
color: control.pressed ? "white" : "lightgray" color: control.pressed ? "white" : "lightgray"
border.color: "gray" border.color: "gray"
border.width: 2 border.width: 2
implicitWidth: 10 implicitWidth: 10
implicitHeight: 10 implicitHeight: 10
radius: 12 radius: 12
}
} }
} }
} }
} }
}
RowLayout { RowLayout {
// Assembly code // Assembly code
width: debugPanel.width id: assemblyCodeRow
height: 405 Layout.fillWidth: true
spacing: machineStates.sideMargin height: 405
implicitHeight: 405
spacing: machineStates.sideMargin
Rectangle Rectangle
{ {
width: debugScrollArea.firstColumnWidth id: stateListContainer
height: parent.height width: debugScrollArea.firstColumnWidth
border.width: 3 height: parent.height
border.color: "#deddd9" border.width: 3
color: "white" border.color: "#deddd9"
anchors.top: parent.top color: "white"
ListView { anchors.top: parent.top
anchors.fill: parent ListView {
anchors.leftMargin: 3 anchors.fill: parent
anchors.rightMargin: 3 anchors.leftMargin: 3
anchors.topMargin: 3 anchors.rightMargin: 3
anchors.bottomMargin: 3 anchors.topMargin: 3
clip: true anchors.bottomMargin: 3
id: statesList clip: true
delegate: renderDelegate id: statesList
highlight: highlightBar delegate: renderDelegate
highlightFollowsCurrentItem: true highlight: highlightBar
} highlightFollowsCurrentItem: false
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 } }
} }
}
Component { Component {
id: renderDelegate id: highlightBar
RowLayout { Rectangle {
id: wrapperItem radius: 4
height: 20 height: statesList.currentItem.height
width: parent.width width: statesList.currentItem.width;
spacing: 5 y: statesList.currentItem.y
Text { color: "#4A90E2"
anchors.left: parent.left Behavior on y {
anchors.leftMargin: 10 PropertyAnimation { properties: "y"; easing.type: Easing.InOutQuad; duration: 50}
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" Component {
text: line.replace(line.split(' ')[0], '') id: renderDelegate
anchors.left: id.right RowLayout {
font.pointSize: 9 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
Rectangle { Rectangle {
// Info Layout.fillWidth: true
width: parent.width height: parent.height //- 2 * stateListContainer.border.width
id: basicInfoColumn
height: 125 ColumnLayout
color: "transparent" {
ColumnLayout {
spacing: 0
width: parent.width width: parent.width
height: parent.height anchors.fill: parent
spacing: 0
DebugBasicInfo { DebugBasicInfo {
id: currentStep id: currentStep
titleStr: qsTr("Current step") titleStr: qsTr("Current Step")
Layout.fillWidth: true
height: 30
} }
DebugBasicInfo { DebugBasicInfo {
id: mem id: mem
titleStr: qsTr("Adding memory") titleStr: qsTr("Adding Memory")
Layout.fillWidth: true
height: 30
} }
DebugBasicInfo { DebugBasicInfo {
id: stepCost id: stepCost
titleStr: qsTr("Step cost") titleStr: qsTr("Step Cost")
Layout.fillWidth: true
height: 30
} }
DebugBasicInfo { DebugBasicInfo {
id: gasSpent 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 { SplitView
// Stack {
height: 275 id: splitInfoList
width: parent.width Layout.fillHeight: true
color: "transparent" 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 DebugInfoList
{ {
id: stack id: storage
width: parent.width anchors.fill: parent
height: parent.height collapsible: true
collapsible: false title : qsTr("Storage")
title : qsTr("Stack") itemDelegate:
itemDelegate: Item { Item {
id: renderedItem
height: 27 height: 27
width: parent.width width: parent.width;
RowLayout RowLayout
{ {
anchors.fill: parent id: row
width: parent.width
height: 26
Rectangle Rectangle
{ {
id: indexColumn
color: "#f7f7f7" color: "#f7f7f7"
Layout.fillWidth: true Layout.fillWidth: true
Layout.minimumWidth: 30 Layout.minimumWidth: parent.width / 2
Layout.preferredWidth: 30 Layout.preferredWidth: parent.width / 2
Layout.maximumWidth: 30 Layout.maximumWidth: parent.width / 2
Layout.minimumHeight: parent.height Layout.minimumHeight: parent.height
Layout.maximumHeight: parent.height
Text { Text {
anchors.centerIn: parent anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
font.family: "monospace"
anchors.leftMargin: 5 anchors.leftMargin: 5
color: "#8b8b8b" color: "#4a4a4a"
text: model.index; text: modelData.split(' ')[0].substring(0, 10);
font.pointSize: 9 font.pointSize: 9
} }
} }
Rectangle Rectangle
{ {
anchors.left: indexColumn.right color: "transparent"
Layout.fillWidth: true Layout.fillWidth: true
Layout.minimumWidth: 15 Layout.minimumWidth: parent.width / 2
Layout.preferredWidth: 15 Layout.preferredWidth: parent.width / 2
Layout.maximumWidth: 60 Layout.maximumWidth: parent.width / 2
Layout.minimumHeight: parent.height Layout.minimumHeight: parent.height
Layout.maximumHeight: parent.height
Text { Text {
anchors.left: parent.left
anchors.leftMargin: 5 anchors.leftMargin: 5
width: parent.width - 5
wrapMode: Text.Wrap
anchors.left: parent.left
font.family: "monospace"
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
color: "#8b8b8b" color: "#4a4a4a"
text: modelData text: modelData.split(' ')[1].substring(0, 10);
font.pointSize: 9 font.pointSize: 9
} }
} }
} }
Rectangle { Rectangle {
id: separator anchors.top: row.bottom
width: parent.width; width: parent.width;
height: 1; height: 1;
color: "#cccccc" color: "#cccccc"
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
} }
} }
} }
} }
}
}
Rectangle {
width: debugPanel.width - 2 * machineStates.sideMargin
height: 2;
color: "#e3e3e3"
radius: 3
}
DebugInfoList Rectangle
{
id: storage
width: debugPanel.width - 2 * machineStates.sideMargin
height: 223
collapsible: true
title : qsTr("Storage")
itemDelegate:
Item {
height: 27
width: parent.width;
RowLayout
{ {
id: row id: memoryRect;
height: 25
width: parent.width width: parent.width
height: 26 Layout.minimumHeight: 25
Rectangle Layout.maximumHeight: 223
{ DebugInfoList {
color: "#f7f7f7" id: memoryDump
Layout.fillWidth: true anchors.fill: parent
Layout.minimumWidth: parent.width / 2 collapsible: true
Layout.preferredWidth: parent.width / 2 title: qsTr("Memory Dump")
Layout.maximumWidth: parent.width / 2 itemDelegate:
Layout.minimumHeight: parent.height Item {
Layout.maximumHeight: parent.height height: 29
Text { width: parent.width - 3;
anchors.verticalCenter: parent.verticalCenter ItemDelegateDataDump {}
anchors.left: parent.left
anchors.leftMargin: 5
color: "#8b8b8b"
text: modelData.split(' ')[0].substring(0, 10);
font.pointSize: 9
} }
} }
Rectangle }
{
color: "transparent" Rectangle
Layout.fillWidth: true {
Layout.minimumWidth: parent.width / 2 id: callDataRect
Layout.preferredWidth: parent.width / 2 height: 25
Layout.maximumWidth: parent.width / 2 width: parent.width
Layout.minimumHeight: parent.height Layout.minimumHeight: 25
Layout.maximumHeight: parent.height Layout.maximumHeight: 223
Text { DebugInfoList {
anchors.leftMargin: 5 id: callDataDump
width: parent.width - 5 anchors.fill: parent
wrapMode: Text.Wrap collapsible: true
anchors.left: parent.left title: qsTr("Call Data")
anchors.verticalCenter: parent.verticalCenter itemDelegate:
color: "#8b8b8b" Item {
text: modelData.split(' ')[1].substring(0, 10); height: 29
font.pointSize: 9 width: parent.width - 3;
ItemDelegateDataDump {}
} }
} }
} }
Rectangle
Rectangle { {
anchors.top: row.bottom width: parent.width
width: parent.width; Layout.minimumHeight: 25
height: 1; color: "transparent"
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 {}
} }
} }
} }

36
mix/qml/ItemDelegateDataDump.qml

@ -20,29 +20,33 @@ Rectangle {
Layout.maximumWidth: 35 Layout.maximumWidth: 35
Layout.minimumHeight: parent.height Layout.minimumHeight: parent.height
Text { Text {
anchors.centerIn: parent anchors.verticalCenter: parent.verticalCenter
anchors.leftMargin: 5 anchors.left: parent.left
color: "#8b8b8b" anchors.leftMargin: 3
font.family: "monospace"
font.bold: true
color: "#4a4a4a"
text: modelData[0] text: modelData[0]
font.pointSize: 9; font.pointSize: 8;
} }
} }
Rectangle Rectangle
{ {
anchors.left: firstCol.right
Layout.fillWidth: true Layout.fillWidth: true
Layout.minimumWidth: 90 Layout.minimumWidth: 110
Layout.preferredWidth: 90 Layout.preferredWidth: 110
Layout.maximumWidth: 90 Layout.maximumWidth: 110
Layout.minimumHeight: parent.height Layout.minimumHeight: parent.height
Text { Text {
anchors.left: parent.left font.family: "monospace"
anchors.leftMargin: 7 font.bold: true
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
color: "#8b8b8b" anchors.left: parent.left
anchors.leftMargin: 4
color: "#4a4a4a"
text: modelData[1] text: modelData[1]
font.pointSize: 9 font.pointSize: 8
} }
} }
@ -52,12 +56,12 @@ Rectangle {
Layout.minimumWidth: 50 Layout.minimumWidth: 50
Layout.minimumHeight: parent.height Layout.minimumHeight: parent.height
Text { Text {
anchors.left: parent.left
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
color: "#ededed" anchors.horizontalCenter: parent.horizontalCenter
font.bold: true font.family: "monospace"
color: "#4a4a4a"
text: modelData[2] text: modelData[2]
font.pointSize: 10 font.pointSize: 8
} }
} }
} }

61
mix/qml/MainContent.qml

@ -3,6 +3,7 @@ import QtQuick.Controls 1.1
import QtQuick.Layouts 1.0 import QtQuick.Layouts 1.0
import QtQuick.Controls.Styles 1.1 import QtQuick.Controls.Styles 1.1
import CodeEditorExtensionManager 1.0 import CodeEditorExtensionManager 1.0
import Qt.labs.settings 1.0
Rectangle { Rectangle {
@ -17,6 +18,14 @@ Rectangle {
anchors.fill: parent anchors.fill: parent
id: root id: root
onWidthChanged:
{
if (rightView.visible)
contentView.width = parent.width - projectList.width - rightView.width;
else
contentView.width = parent.width - projectList.width;
}
function toggleRightView() function toggleRightView()
{ {
if (!rightView.visible) if (!rightView.visible)
@ -37,6 +46,11 @@ Rectangle {
rightView.hide(); rightView.hide();
} }
function rightViewVisible()
{
return rightView.visible;
}
CodeEditorExtensionManager { CodeEditorExtensionManager {
headerView: headerPaneTabs; headerView: headerPaneTabs;
rightView: rightPaneTabs; rightView: rightPaneTabs;
@ -78,21 +92,37 @@ Rectangle {
} }
} }
SplitView { Rectangle {
resizing: false
Layout.row: 1
orientation: Qt.Horizontal;
Layout.fillWidth: true Layout.fillWidth: true
Layout.preferredHeight: root.height - headerView.height; 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 { ProjectList {
anchors.left: parent.left
id: projectList id: projectList
width: 200 width: 200
height: parent.height height: parent.height
Layout.minimumWidth: 200 Layout.minimumWidth: 200
} }
Splitter
{
id: resizeLeft
itemToStick: projectList
itemMinimumWidth: projectList.Layout.minimumWidth
direction: "right"
brother: contentView
color: "#a2a2a2"
}
Rectangle { Rectangle {
anchors.left: projectList.right
id: contentView id: contentView
width: parent.width - projectList.width width: parent.width - projectList.width
height: parent.height 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 { Rectangle {
visible: false; visible: false;
id: rightView; id: rightView;
Keys.onEscapePressed: Keys.onEscapePressed: hide()
{
hide();
}
function show() { function show() {
visible = true; visible = true;
resizeRight.visible = true;
contentView.width = parent.width - projectList.width - rightView.width; contentView.width = parent.width - projectList.width - rightView.width;
} }
function hide() { function hide() {
resizeRight.visible = false;
visible = false; visible = false;
contentView.width = parent.width - projectList.width; contentView.width = parent.width - projectList.width;
} }
height: parent.height; height: parent.height;
width: 450 width: 515
Layout.minimumWidth: 450 Layout.minimumWidth: 515
anchors.right: parent.right
Rectangle { Rectangle {
anchors.fill: parent; anchors.fill: parent;
id: rightPaneView id: rightPaneView

2
mix/qml/NewProjectDialog.qml

@ -64,7 +64,7 @@ Window {
Button { Button {
enabled: titleField.text != "" && pathField.text != "" enabled: titleField.text != "" && pathField.text != ""
text: qsTr("Ok"); text: qsTr("OK");
onClicked: { onClicked: {
close(); close();
accepted(); accepted();

4
mix/qml/ProjectModel.qml

@ -85,7 +85,7 @@ Item {
FileDialog { FileDialog {
id: openProjectFileDialog id: openProjectFileDialog
visible: false visible: false
title: qsTr("Open a project") title: qsTr("Open a Project")
selectFolder: true selectFolder: true
onAccepted: { onAccepted: {
var path = openProjectFileDialog.fileUrl.toString(); var path = openProjectFileDialog.fileUrl.toString();
@ -97,7 +97,7 @@ Item {
FileDialog { FileDialog {
id: addExistingFileDialog id: addExistingFileDialog
visible: false visible: false
title: qsTr("Add a file") title: qsTr("Add a File")
selectFolder: false selectFolder: false
onAccepted: { onAccepted: {
var paths = addExistingFileDialog.fileUrls; var paths = addExistingFileDialog.fileUrls;

47
mix/qml/Splitter.qml

@ -0,0 +1,47 @@
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
}
}

2
mix/qml/StateDialog.qml

@ -99,7 +99,7 @@ Window {
anchors.right: parent.right; anchors.right: parent.right;
Button { Button {
text: qsTr("Ok"); text: qsTr("OK");
onClicked: { onClicked: {
close(); close();
accepted(); accepted();

17
mix/qml/StatusPane.qml

@ -14,6 +14,7 @@ Rectangle {
status.state = ""; status.state = "";
status.text = qsTr("Compile without errors."); status.text = qsTr("Compile without errors.");
logslink.visible = false; logslink.visible = false;
debugImg.state = "active";
} }
else else
{ {
@ -21,6 +22,7 @@ Rectangle {
var errorInfo = ErrorLocationFormater.extractErrorInfo(statusPane.result.compilerMessage, true); var errorInfo = ErrorLocationFormater.extractErrorInfo(statusPane.result.compilerMessage, true);
status.text = errorInfo.errorLocation + " " + errorInfo.errorDetail; status.text = errorInfo.errorLocation + " " + errorInfo.errorDetail;
logslink.visible = true; logslink.visible = true;
debugImg.state = "";
} }
debugRunActionIcon.enabled = statusPane.result.successful; debugRunActionIcon.enabled = statusPane.result.successful;
} }
@ -65,7 +67,7 @@ Rectangle {
visible: false visible: false
font.pointSize: 9 font.pointSize: 9
height: 9 height: 9
text: qsTr("See log.") text: qsTr("See Log.")
font.family: "Monospace" font.family: "Monospace"
objectName: "status" objectName: "status"
id: logslink id: logslink
@ -96,17 +98,24 @@ Rectangle {
Button Button
{ {
anchors.right: parent.right anchors.right: parent.right
anchors.rightMargin: 7 anchors.rightMargin: 9
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
id: debugImg id: debugImg
iconSource: "qrc:/qml/img/bugiconinactive.png" iconSource: "qrc:/qml/img/bugiconinactive.png"
action: debugRunActionIcon action: debugRunActionIcon
states: [
State{
name: "active"
PropertyChanges { target: debugImg; iconSource: "qrc:/qml/img/bugiconactive.png"}
}
]
} }
Action { Action {
id: debugRunActionIcon id: debugRunActionIcon
onTriggered: { onTriggered: {
mainContent.ensureRightView(); mainContent.toggleRightView();
clientModel.debugDeployment(); if (mainContent.rightViewVisible())
clientModel.debugDeployment();
} }
enabled: false enabled: false
} }

3
mix/qml/StepActionImage.qml

@ -8,6 +8,7 @@ Rectangle {
id: buttonActionContainer id: buttonActionContainer
property string disableStateImg property string disableStateImg
property string enabledStateImg property string enabledStateImg
property string buttonTooltip
signal clicked signal clicked
function enabled(state) function enabled(state)
@ -19,7 +20,6 @@ Rectangle {
debugImg.iconSource = disableStateImg; debugImg.iconSource = disableStateImg;
} }
color: "transparent"
Button Button
{ {
anchors.fill: parent anchors.fill: parent
@ -31,6 +31,7 @@ Rectangle {
} }
Action { Action {
tooltip: buttonTooltip
id: buttonAction id: buttonAction
onTriggered: { onTriggered: {
buttonActionContainer.clicked(); buttonActionContainer.clicked();

4
mix/qml/TransactionDialog.qml

@ -136,7 +136,7 @@ Window {
} }
Label { Label {
text: qsTr("Gas price") text: qsTr("Gas Price")
} }
Rectangle Rectangle
{ {
@ -183,7 +183,7 @@ Window {
anchors.right: parent.right; anchors.right: parent.right;
Button { Button {
text: qsTr("Ok"); text: qsTr("OK");
onClicked: { onClicked: {
close(); close();
accepted(); accepted();

26
mix/qml/js/Debugger.js

@ -7,7 +7,7 @@ var currentSelectedState = null;
var jumpStartingPoint = null; var jumpStartingPoint = null;
function init() function init()
{ {
if (debugStates === undefined) if (typeof(debugStates) === "undefined")
return; return;
statesSlider.maximumValue = debugStates.length - 1; statesSlider.maximumValue = debugStates.length - 1;
@ -24,6 +24,9 @@ function init()
function moveSelection(incr) function moveSelection(incr)
{ {
if (typeof(debugStates) === "undefined")
return;
if (currentSelectedState + incr >= 0) if (currentSelectedState + incr >= 0)
{ {
if (currentSelectedState + incr < debugStates.length) if (currentSelectedState + incr < debugStates.length)
@ -34,6 +37,9 @@ function moveSelection(incr)
function select(stateIndex) function select(stateIndex)
{ {
if (typeof(debugStates) === "undefined")
return;
var codeLine = codeStr(stateIndex); var codeLine = codeStr(stateIndex);
var state = debugStates[stateIndex]; var state = debugStates[stateIndex];
highlightSelection(codeLine); highlightSelection(codeLine);
@ -53,6 +59,9 @@ function select(stateIndex)
function codeStr(stateIndex) function codeStr(stateIndex)
{ {
if (typeof(debugStates) === "undefined")
return;
var state = debugStates[stateIndex]; var state = debugStates[stateIndex];
return bytesCodeMapping.getValue(state.curPC); return bytesCodeMapping.getValue(state.curPC);
} }
@ -64,6 +73,9 @@ function highlightSelection(index)
function completeCtxInformation(state) function completeCtxInformation(state)
{ {
if (typeof(debugStates) === "undefined")
return;
currentStep.update(state.step); currentStep.update(state.step);
mem.update(state.newMemSize.value() + " " + qsTr("words")); mem.update(state.newMemSize.value() + " " + qsTr("words"));
stepCost.update(state.gasCost.value()); stepCost.update(state.gasCost.value());
@ -83,6 +95,9 @@ function displayReturnValue()
function stepOutBack() function stepOutBack()
{ {
if (typeof(debugStates) === "undefined")
return;
if (jumpStartingPoint != null) if (jumpStartingPoint != null)
{ {
select(jumpStartingPoint); select(jumpStartingPoint);
@ -99,6 +114,9 @@ function stepIntoBack()
function stepOverBack() function stepOverBack()
{ {
if (typeof(debugStates) === "undefined")
return;
var state = debugStates[currentSelectedState]; var state = debugStates[currentSelectedState];
if (state.instruction === "JUMPDEST") if (state.instruction === "JUMPDEST")
{ {
@ -118,6 +136,9 @@ function stepOverBack()
function stepOverForward() function stepOverForward()
{ {
if (typeof(debugStates) === "undefined")
return;
var state = debugStates[currentSelectedState]; var state = debugStates[currentSelectedState];
if (state.instruction === "JUMP") if (state.instruction === "JUMP")
{ {
@ -137,6 +158,9 @@ function stepOverForward()
function stepIntoForward() function stepIntoForward()
{ {
if (typeof(debugStates) === "undefined")
return;
var state = debugStates[currentSelectedState]; var state = debugStates[currentSelectedState];
if (state.instruction === "JUMP") if (state.instruction === "JUMP")
{ {

16
mix/qml/main.qml

@ -97,7 +97,7 @@ ApplicationWindow {
Action { Action {
id: createProjectAction id: createProjectAction
text: qsTr("&New project") text: qsTr("&New Project")
shortcut: "Ctrl+N" shortcut: "Ctrl+N"
enabled: true; enabled: true;
onTriggered: projectModel.createProject(); onTriggered: projectModel.createProject();
@ -105,7 +105,7 @@ ApplicationWindow {
Action { Action {
id: openProjectAction id: openProjectAction
text: qsTr("&Open project") text: qsTr("&Open Project")
shortcut: "Ctrl+O" shortcut: "Ctrl+O"
enabled: true; enabled: true;
onTriggered: projectModel.browseProject(); onTriggered: projectModel.browseProject();
@ -113,7 +113,7 @@ ApplicationWindow {
Action { Action {
id: addNewJsFileAction id: addNewJsFileAction
text: qsTr("New JavaScript file") text: qsTr("New JavaScript File")
shortcut: "Ctrl+Alt+J" shortcut: "Ctrl+Alt+J"
enabled: !projectModel.isEmpty enabled: !projectModel.isEmpty
onTriggered: projectModel.newJsFile(); onTriggered: projectModel.newJsFile();
@ -121,7 +121,7 @@ ApplicationWindow {
Action { Action {
id: addNewHtmlFileAction id: addNewHtmlFileAction
text: qsTr("New HTML file") text: qsTr("New HTML File")
shortcut: "Ctrl+Alt+H" shortcut: "Ctrl+Alt+H"
enabled: !projectModel.isEmpty enabled: !projectModel.isEmpty
onTriggered: projectModel.newHtmlFile(); onTriggered: projectModel.newHtmlFile();
@ -129,7 +129,7 @@ ApplicationWindow {
Action { Action {
id: addNewContractAction id: addNewContractAction
text: qsTr("New contract") text: qsTr("New Contract")
shortcut: "Ctrl+Alt+C" shortcut: "Ctrl+Alt+C"
enabled: !projectModel.isEmpty enabled: !projectModel.isEmpty
onTriggered: projectModel.newContract(); onTriggered: projectModel.newContract();
@ -137,7 +137,7 @@ ApplicationWindow {
Action { Action {
id: addExistingFileAction id: addExistingFileAction
text: qsTr("Add existing file") text: qsTr("Add Existing File")
shortcut: "Ctrl+Alt+A" shortcut: "Ctrl+Alt+A"
enabled: !projectModel.isEmpty enabled: !projectModel.isEmpty
onTriggered: projectModel.addExistingFile(); onTriggered: projectModel.addExistingFile();
@ -145,7 +145,7 @@ ApplicationWindow {
Action { Action {
id: saveAllFilesAction id: saveAllFilesAction
text: qsTr("Save all") text: qsTr("Save All")
shortcut: "Ctrl+S" shortcut: "Ctrl+S"
enabled: !projectModel.isEmpty enabled: !projectModel.isEmpty
onTriggered: projectModel.saveAll(); onTriggered: projectModel.saveAll();
@ -153,7 +153,7 @@ ApplicationWindow {
Action { Action {
id: closeProjectAction id: closeProjectAction
text: qsTr("Close project") text: qsTr("Close Project")
shortcut: "Ctrl+W" shortcut: "Ctrl+W"
enabled: !projectModel.isEmpty enabled: !projectModel.isEmpty
onTriggered: projectModel.closeProject(); onTriggered: projectModel.closeProject();

Loading…
Cancel
Save