You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
425 lines
9.3 KiB
425 lines
9.3 KiB
import QtQuick 2.2
|
|
import QtQuick.Controls 1.1
|
|
import QtQuick.Layouts 1.1
|
|
import QtQuick.Controls.Styles 1.3
|
|
import org.ethereum.qml.InverseMouseArea 1.0
|
|
import QtGraphicalEffects 1.0
|
|
import "js/ErrorLocationFormater.js" as ErrorLocationFormater
|
|
import "."
|
|
|
|
Rectangle {
|
|
id: statusHeader
|
|
objectName: "statusPane"
|
|
property variant webPreview
|
|
property alias currentStatus: logPane.currentStatus
|
|
function updateStatus(message)
|
|
{
|
|
if (!message)
|
|
{
|
|
status.state = "";
|
|
status.text = qsTr("Compile successfully.");
|
|
debugImg.state = "active";
|
|
currentStatus = { "type": "Comp", "date": Qt.formatDateTime(new Date(), "hh:mm:ss"), "content": status.text, "level": "info" }
|
|
}
|
|
else
|
|
{
|
|
status.state = "error";
|
|
var errorInfo = ErrorLocationFormater.extractErrorInfo(message, true);
|
|
status.text = errorInfo.errorLocation + " " + errorInfo.errorDetail;
|
|
debugImg.state = "";
|
|
currentStatus = { "type": "Comp", "date": Qt.formatDateTime(new Date(), "hh:mm:ss"), "content": status.text, "level": "error" }
|
|
}
|
|
}
|
|
|
|
function infoMessage(text, type)
|
|
{
|
|
status.state = "";
|
|
status.text = text
|
|
logPane.push("info", type, text);
|
|
currentStatus = { "type": type, "date": Qt.formatDateTime(new Date(), "hh:mm:ss"), "content": text, "level": "info" }
|
|
}
|
|
|
|
function warningMessage(text, type)
|
|
{
|
|
status.state = "warning";
|
|
status.text = text
|
|
logPane.push("warning", type, text);
|
|
currentStatus = { "type": type, "date": Qt.formatDateTime(new Date(), "hh:mm:ss"), "content": text, "level": "warning" }
|
|
}
|
|
|
|
function errorMessage(text, type)
|
|
{
|
|
status.state = "error";
|
|
status.text = text;
|
|
logPane.push("error", type, text);
|
|
currentStatus = { "type": type, "date": Qt.formatDateTime(new Date(), "hh:mm:ss"), "content": text, "level": "error" }
|
|
}
|
|
|
|
function clear()
|
|
{
|
|
status.state = "";
|
|
status.text = "";
|
|
}
|
|
|
|
StatusPaneStyle {
|
|
id: statusPaneStyle
|
|
}
|
|
|
|
Connections {
|
|
target: webPreview
|
|
onJavaScriptMessage:
|
|
{
|
|
if (_level === 0)
|
|
infoMessage(_content, "JavaScript")
|
|
else
|
|
{
|
|
var message = _sourceId.substring(_sourceId.lastIndexOf("/") + 1) + " - " + qsTr("line") + " " + _lineNb + " - " + _content;
|
|
if (_level === 1)
|
|
warningMessage(message, "JavaScript")
|
|
else
|
|
errorMessage(message, "JavaScript")
|
|
}
|
|
}
|
|
}
|
|
|
|
Connections {
|
|
target:clientModel
|
|
onRunStarted:
|
|
{
|
|
logPane.clear()
|
|
infoMessage(qsTr("Running transactions..."), "Run");
|
|
}
|
|
onRunFailed: errorMessage(format(_message), "Run");
|
|
onRunComplete: infoMessage(qsTr("Run complete"), "Run");
|
|
onNewBlock: infoMessage(qsTr("New block created"), "State");
|
|
|
|
function format(_message)
|
|
{
|
|
var formatted = _message.match(/(?:<dev::eth::)(.+)(?:>)/);
|
|
if (!formatted)
|
|
formatted = _message.match(/(?:<dev::)(.+)(?:>)/);
|
|
if (formatted && formatted.length > 1)
|
|
formatted = formatted[1];
|
|
else
|
|
return _message;
|
|
var exceptionInfos = _message.match(/(?:tag_)(.+)/g);
|
|
if (exceptionInfos !== null && exceptionInfos.length > 0)
|
|
formatted += ": "
|
|
for (var k in exceptionInfos)
|
|
formatted += " " + exceptionInfos[k].replace("*]", "").replace("tag_", "").replace("=", "");
|
|
return formatted;
|
|
}
|
|
}
|
|
|
|
Connections {
|
|
target:projectModel
|
|
onDeploymentStarted: infoMessage(qsTr("Running deployment..."), "Deployment");
|
|
onDeploymentError: errorMessage(error, "Deployment");
|
|
onDeploymentComplete: infoMessage(qsTr("Deployment complete"), "Deployment");
|
|
onDeploymentStepChanged: infoMessage(message, "Deployment");
|
|
}
|
|
Connections {
|
|
target: codeModel
|
|
onCompilationComplete:
|
|
{
|
|
goToLine.visible = false;
|
|
updateStatus();
|
|
}
|
|
|
|
onCompilationError:
|
|
{
|
|
goToLine.visible = true
|
|
updateStatus(_error);
|
|
}
|
|
}
|
|
|
|
color: "transparent"
|
|
anchors.fill: parent
|
|
|
|
Rectangle {
|
|
id: statusContainer
|
|
anchors.horizontalCenter: parent.horizontalCenter
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
radius: 3
|
|
width: 600
|
|
height: 30
|
|
color: "#fcfbfc"
|
|
Text {
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
anchors.horizontalCenter: parent.horizontalCenter
|
|
font.pointSize: appStyle.absoluteSize(-1)
|
|
font.family: "sans serif"
|
|
objectName: "status"
|
|
wrapMode: Text.WrapAnywhere
|
|
elide: Text.ElideRight
|
|
maximumLineCount: 1
|
|
clip: true
|
|
id: status
|
|
states: [
|
|
State {
|
|
name: "error"
|
|
PropertyChanges {
|
|
target: status
|
|
color: "red"
|
|
}
|
|
PropertyChanges {
|
|
target: statusContainer
|
|
color: "#fffcd5"
|
|
}
|
|
},
|
|
State {
|
|
name: "warning"
|
|
PropertyChanges {
|
|
target: status
|
|
color: "orange"
|
|
}
|
|
PropertyChanges {
|
|
target: statusContainer
|
|
color: "#fffcd5"
|
|
}
|
|
}
|
|
]
|
|
onTextChanged:
|
|
{
|
|
updateWidth()
|
|
toolTipInfo.tooltip = text;
|
|
}
|
|
|
|
function updateWidth()
|
|
{
|
|
if (text.length > 80)
|
|
width = parent.width - 10
|
|
else
|
|
width = undefined
|
|
}
|
|
}
|
|
|
|
Button
|
|
{
|
|
anchors.fill: parent
|
|
id: toolTip
|
|
action: toolTipInfo
|
|
text: ""
|
|
z: 3;
|
|
style:
|
|
ButtonStyle {
|
|
background:Rectangle {
|
|
color: "transparent"
|
|
}
|
|
}
|
|
MouseArea {
|
|
anchors.fill: parent
|
|
onClicked: {
|
|
var globalCoord = goToLineBtn.mapToItem(statusContainer, 0, 0);
|
|
if (mouseX > globalCoord.x
|
|
&& mouseX < globalCoord.x + goToLineBtn.width
|
|
&& mouseY > globalCoord.y
|
|
&& mouseY < globalCoord.y + goToLineBtn.height)
|
|
goToCompilationError.trigger(goToLineBtn);
|
|
else
|
|
logsContainer.toggle();
|
|
}
|
|
}
|
|
}
|
|
|
|
Rectangle
|
|
{
|
|
visible: false
|
|
color: "transparent"
|
|
width: 40
|
|
height: parent.height
|
|
anchors.top: parent.top
|
|
anchors.left: status.right
|
|
anchors.leftMargin: 15
|
|
id: goToLine
|
|
RowLayout
|
|
{
|
|
anchors.fill: parent
|
|
Rectangle
|
|
{
|
|
color: "transparent"
|
|
anchors.fill: parent
|
|
Button
|
|
{
|
|
z: 4
|
|
anchors.centerIn: parent
|
|
id: goToLineBtn
|
|
text: ""
|
|
width: 30
|
|
height: 30
|
|
action: goToCompilationError
|
|
style: ButtonStyle {
|
|
background: Rectangle {
|
|
color: "transparent"
|
|
|
|
Image {
|
|
source: "qrc:/qml/img/warningicon.png"
|
|
height: 30
|
|
width: 30
|
|
sourceSize.width: 30
|
|
sourceSize.height: 30
|
|
anchors.centerIn: parent
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
Action {
|
|
id: toolTipInfo
|
|
tooltip: ""
|
|
}
|
|
|
|
Rectangle
|
|
{
|
|
id: logsShadow
|
|
width: logsContainer.width + 5
|
|
height: 0
|
|
opacity: 0.3
|
|
clip: true
|
|
anchors.top: logsContainer.top
|
|
anchors.margins: 4
|
|
Rectangle {
|
|
color: "gray"
|
|
anchors.top: parent.top
|
|
radius: 10
|
|
id: roundRect
|
|
height: 400
|
|
width: parent.width
|
|
}
|
|
}
|
|
|
|
|
|
|
|
Rectangle
|
|
{
|
|
InverseMouseArea
|
|
{
|
|
id: outsideClick
|
|
anchors.fill: parent
|
|
active: false
|
|
onClickedOutside: {
|
|
logsContainer.toggle();
|
|
}
|
|
}
|
|
|
|
function toggle()
|
|
{
|
|
if (logsContainer.state === "opened")
|
|
{
|
|
statusContainer.visible = true
|
|
logsContainer.state = "closed"
|
|
}
|
|
else
|
|
{
|
|
statusContainer.visible = false
|
|
logsContainer.state = "opened";
|
|
logsContainer.focus = true;
|
|
forceActiveFocus();
|
|
calCoord()
|
|
move()
|
|
}
|
|
}
|
|
|
|
id: logsContainer
|
|
width: 750
|
|
anchors.top: statusContainer.bottom
|
|
anchors.topMargin: 4
|
|
visible: false
|
|
radius: 10
|
|
|
|
function calCoord()
|
|
{
|
|
if (!logsContainer.parent.parent)
|
|
return
|
|
var top = logsContainer;
|
|
while (top.parent)
|
|
top = top.parent
|
|
var coordinates = logsContainer.mapToItem(top, 0, 0);
|
|
logsContainer.parent = top;
|
|
logsShadow.parent = top;
|
|
top.onWidthChanged.connect(move)
|
|
top.onHeightChanged.connect(move)
|
|
}
|
|
|
|
function move()
|
|
{
|
|
var statusGlobalCoord = status.mapToItem(null, 0, 0);
|
|
logsContainer.x = statusGlobalCoord.x - logPane.contentXPos
|
|
logsShadow.x = statusGlobalCoord.x - logPane.contentXPos
|
|
logsShadow.z = 1
|
|
logsContainer.z = 2
|
|
if (Qt.platform.os === "osx")
|
|
{
|
|
logsContainer.y = statusGlobalCoord.y;
|
|
logsShadow.y = statusGlobalCoord.y;
|
|
}
|
|
}
|
|
|
|
LogsPaneStyle {
|
|
id: logStyle
|
|
}
|
|
|
|
LogsPane
|
|
{
|
|
id: logPane;
|
|
statusPane: statusHeader
|
|
onContentXPosChanged:
|
|
{
|
|
parent.move();
|
|
}
|
|
}
|
|
|
|
states: [
|
|
State {
|
|
name: "opened";
|
|
PropertyChanges { target: logsContainer; height: 500; visible: true }
|
|
PropertyChanges { target: logsShadow; height: 500; visible: true }
|
|
PropertyChanges { target: outsideClick; active: true }
|
|
|
|
},
|
|
State {
|
|
name: "closed";
|
|
PropertyChanges { target: logsContainer; height: 0; visible: false }
|
|
PropertyChanges { target: statusContainer; width: 600; height: 30 }
|
|
PropertyChanges { target: outsideClick; active: false }
|
|
PropertyChanges { target: logsShadow; height: 0; visible: false }
|
|
}
|
|
]
|
|
transitions: Transition {
|
|
NumberAnimation { properties: "height"; easing.type: Easing.InOutQuad; duration: 200 }
|
|
NumberAnimation { target: logsContainer; properties: "visible"; easing.type: Easing.InOutQuad; duration: 200 }
|
|
}
|
|
}
|
|
}
|
|
|
|
Rectangle
|
|
{
|
|
color: "transparent"
|
|
width: 100
|
|
height: parent.height
|
|
anchors.top: parent.top
|
|
anchors.right: parent.right
|
|
RowLayout
|
|
{
|
|
anchors.fill: parent
|
|
Rectangle
|
|
{
|
|
color: "transparent"
|
|
anchors.fill: parent
|
|
Button
|
|
{
|
|
anchors.right: parent.right
|
|
anchors.rightMargin: 9
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
id: debugImg
|
|
text: ""
|
|
iconSource: "qrc:/qml/img/bugiconactive.png"
|
|
action: showHideRightPanelAction
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|