blob: d1c285bceeb81494acf8dba30af2e70304fec194 [file] [log] [blame]
swissChiliece1ac82022-02-25 11:20:42 -08001import QtQuick 2.5
swissChili23958ca2022-02-21 19:23:34 -08002import QtQuick.Controls 2.15
3import QtQuick.Controls.Material 2.0
4import QtQuick.Layouts 1.0
5
swissChilid85daa92022-02-24 15:29:02 -08006import sh.swisschili.REFAL 1.0
7
swissChili25620b02022-02-23 17:15:16 -08008Item {
swissChili23958ca2022-02-21 19:23:34 -08009 id: root
10
swissChili4b3105a2022-02-22 16:34:39 -080011 required property string code
12 required property string result
swissChilid85daa92022-02-24 15:29:02 -080013 property int status: Cell.IDLE
swissChiliece1ac82022-02-25 11:20:42 -080014 property int resultType: Cell.EXPRESSION
swissChili06cec4e2022-02-24 19:04:32 -080015 property bool cellActive: false
swissChili4b3105a2022-02-22 16:34:39 -080016
swissChili25620b02022-02-23 17:15:16 -080017 signal insertBelowClicked()
18 signal codeEditingFinished(string code)
19 signal cellFocused()
swissChili06cec4e2022-02-24 19:04:32 -080020 signal cellUnfocused()
swissChilid85daa92022-02-24 15:29:02 -080021 signal runClicked()
swissChili8c5cefa2023-01-17 13:04:36 +010022 signal quitClicked()
swissChili06cec4e2022-02-24 19:04:32 -080023 signal deleteClicked()
swissChili23958ca2022-02-21 19:23:34 -080024
swissChili25620b02022-02-23 17:15:16 -080025 height: column.height
swissChili23958ca2022-02-21 19:23:34 -080026
swissChili732628e2022-02-25 10:35:56 -080027 Keys.onEscapePressed: {
28 root.cellUnfocused()
29 code.focus = false
30 }
swissChili25620b02022-02-23 17:15:16 -080031
32 ColumnLayout {
33 id: column
34
swissChili06cec4e2022-02-24 19:04:32 -080035 width: parent.width - 20
36 anchors.centerIn: parent
swissChili25620b02022-02-23 17:15:16 -080037
swissChili06cec4e2022-02-24 19:04:32 -080038 Item {
39 implicitWidth: row.implicitWidth
40 implicitHeight: row.implicitHeight
swissChili23958ca2022-02-21 19:23:34 -080041 Layout.fillWidth: true
swissChili23958ca2022-02-21 19:23:34 -080042
swissChili06cec4e2022-02-24 19:04:32 -080043 Pane {
44 anchors.fill: parent
45 anchors.topMargin: -5
46 anchors.bottomMargin: -5
swissChilid85daa92022-02-24 15:29:02 -080047
swissChili06cec4e2022-02-24 19:04:32 -080048 Material.elevation: root.cellActive ? 4 : 0
swissChili25620b02022-02-23 17:15:16 -080049 }
50
swissChili06cec4e2022-02-24 19:04:32 -080051 MouseArea {
52 id: selectCell
swissChili4b3105a2022-02-22 16:34:39 -080053
swissChili06cec4e2022-02-24 19:04:32 -080054 anchors.fill: row
55
56 onClicked: root.cellFocused()
57 }
58
59 RowLayout {
60 anchors.fill: parent
61 id: row
62
63 RoundButton {
64 Layout.alignment: Qt.AlignTop
swissChili8c5cefa2023-01-17 13:04:36 +010065 icon.source: iconForState(root.status)
swissChili06cec4e2022-02-24 19:04:32 -080066 icon.color: Material.color(Material.Grey, Material.Shade600)
67 flat: true
68
swissChili8c5cefa2023-01-17 13:04:36 +010069 onClicked: {
70 if (root.status == Cell.IDLE)
71 root.runClicked()
72 else if (root.status == Cell.RUNNING)
73 root.quitClicked()
74 }
swissChili06cec4e2022-02-24 19:04:32 -080075
76 function iconForState(state) {
swissChili8c5cefa2023-01-17 13:04:36 +010077 console.log("iconForState", state);
78
swissChili06cec4e2022-02-24 19:04:32 -080079 if (state === Cell.RUNNING)
80 return "qrc:///icons/square.svg"
81
82 return "qrc:///icons/play-circle.svg"
83 }
84 }
85
86 ColumnLayout {
swissChili25620b02022-02-23 17:15:16 -080087 Layout.fillWidth: true
88 Layout.fillHeight: true
swissChili25620b02022-02-23 17:15:16 -080089
swissChili06cec4e2022-02-24 19:04:32 -080090 TextArea {
swissChili732628e2022-02-25 10:35:56 -080091 id: code
92
swissChili06cec4e2022-02-24 19:04:32 -080093 Layout.fillWidth: true
94 Layout.fillHeight: true
swissChili732628e2022-02-25 10:35:56 -080095
swissChili06cec4e2022-02-24 19:04:32 -080096 font.family: "monospace"
97 text: root.code
98 selectByMouse: true
99 wrapMode: TextEdit.WrapAtWordBoundaryOrAnywhere
100
swissChilid2af6ad2022-04-16 14:42:17 -0700101 placeholderText: qsTr("Write some code...")
swissChili06cec4e2022-02-24 19:04:32 -0800102
103 Keys.onTabPressed: {
104 var pos = cursorPosition + 4
105 text = text.slice(0, cursorPosition) + " " + text.slice(cursorPosition);
106 cursorPosition = pos
107 }
108
swissChiliece1ac82022-02-25 11:20:42 -0800109 onTextChanged: {
swissChili06cec4e2022-02-24 19:04:32 -0800110 root.codeEditingFinished(text)
111 }
112
swissChiliece1ac82022-02-25 11:20:42 -0800113 onPressed: root.cellFocused()
114
swissChili06cec4e2022-02-24 19:04:32 -0800115 onFocusChanged: if (focus) root.cellFocused()
116 onActiveFocusChanged: if (activeFocus) root.cellFocused()
swissChili25620b02022-02-23 17:15:16 -0800117 }
118
swissChili06cec4e2022-02-24 19:04:32 -0800119 Label {
120 visible: root.result.length > 0
121 Layout.fillWidth: true
122 font.family: "monospace"
123 text: root.result
swissChiliece1ac82022-02-25 11:20:42 -0800124 textFormat: root.resultType === Cell.EXPRESSION ? Text.PlainText : Text.RichText
swissChili25620b02022-02-23 17:15:16 -0800125
swissChili06cec4e2022-02-24 19:04:32 -0800126 Layout.bottomMargin: 5
swissChili25620b02022-02-23 17:15:16 -0800127 }
swissChili25620b02022-02-23 17:15:16 -0800128 }
129
swissChili06cec4e2022-02-24 19:04:32 -0800130 RoundButton {
swissChili732628e2022-02-25 10:35:56 -0800131 Layout.alignment: Qt.AlignTop
132
swissChili06cec4e2022-02-24 19:04:32 -0800133 icon.source: "qrc:///icons/menu.svg"
134 icon.color: Constants.buttonGrey
135 flat: true
swissChili23958ca2022-02-21 19:23:34 -0800136
swissChili06cec4e2022-02-24 19:04:32 -0800137 onClicked: cellContextMenu.popup()
138
139 Menu {
140 id: cellContextMenu
141
142 MenuItem {
143 icon.source: "qrc:///icons/trash.svg"
144 icon.color: Material.color(Material.Red)
swissChilid2af6ad2022-04-16 14:42:17 -0700145 text: qsTr("Delete")
swissChili06cec4e2022-02-24 19:04:32 -0800146
147 onClicked: root.deleteClicked()
148 }
149 }
150 }
swissChili23958ca2022-02-21 19:23:34 -0800151 }
152 }
swissChili23958ca2022-02-21 19:23:34 -0800153
swissChili25620b02022-02-23 17:15:16 -0800154 InsertRow {
155 onInsertClicked: root.insertBelowClicked()
156 }
swissChili23958ca2022-02-21 19:23:34 -0800157 }
158}