| import QtQuick 2.0 |
| import QtQuick.Controls 2.15 |
| import QtQuick.Controls.Material 2.0 |
| import QtQuick.Layouts 1.0 |
| |
| import sh.swisschili.REFAL 1.0 |
| |
| Item { |
| id: root |
| |
| required property string code |
| required property string result |
| property int status: Cell.IDLE |
| |
| signal insertBelowClicked() |
| signal codeEditingFinished(string code) |
| signal cellFocused() |
| signal runClicked() |
| |
| height: column.height |
| |
| MouseArea { |
| id: selectCell |
| |
| anchors.fill: column |
| |
| onClicked: root.cellFocused() |
| } |
| |
| ColumnLayout { |
| id: column |
| |
| width: parent.width |
| |
| RowLayout { |
| id: row |
| Layout.fillWidth: true |
| |
| RoundButton { |
| Layout.alignment: Qt.AlignTop |
| icon.source: iconForState(root.state) |
| icon.color: Material.color(Material.Grey, Material.Shade600) |
| flat: true |
| |
| onClicked: root.runClicked() |
| |
| function iconForState(state) { |
| if (state === Cell.RUNNING) |
| return "qrc:///icons/square.svg" |
| |
| return "qrc:///icons/play-circle.svg" |
| } |
| } |
| |
| ColumnLayout { |
| Layout.fillWidth: true |
| Layout.fillHeight: true |
| |
| TextArea { |
| Layout.fillWidth: true |
| Layout.fillHeight: true |
| id: code |
| font.family: "monospace" |
| text: root.code |
| selectByMouse: true |
| wrapMode: TextEdit.WrapAtWordBoundaryOrAnywhere |
| |
| Keys.onTabPressed: { |
| var pos = cursorPosition + 4 |
| text = text.slice(0, cursorPosition) + " " + text.slice(cursorPosition); |
| cursorPosition = pos |
| } |
| |
| Keys.onEscapePressed: { |
| root.forceActiveFocus() |
| } |
| |
| onEditingFinished: { |
| root.codeEditingFinished(text) |
| } |
| |
| onFocusChanged: if (focus) root.cellFocused() |
| } |
| |
| Label { |
| visible: root.result.length > 0 |
| Layout.fillWidth: true |
| font.family: "monospace" |
| text: root.result |
| } |
| } |
| |
| RoundButton { |
| icon.source: "qrc:///icons/trash.svg" |
| icon.color: Material.color(Material.Grey, Material.theme == Material.Dark ? Material.Shade400 : Material.Shade600) |
| flat: true |
| } |
| } |
| |
| InsertRow { |
| onInsertClicked: root.insertBelowClicked() |
| } |
| } |
| } |