@@ -5,7 +5,6 @@ import QtQuick.Layouts
55import MaterialIcons 2.2
66import Utils 1.0
77
8-
98Item {
109 id: root
1110
3433 if (! nodeRepeater)
3534 return null
3635
37- for (var i = 0 ; i < nodeRepeater .count ; ++ i) {
36+ for (var i = 0 ; i < nodeRepeater .count ; ++ i) {
3837 if (nodeRepeater .itemAt (i).node === node)
3938 return nodeRepeater .itemAt (i)
4039 }
@@ -45,45 +44,36 @@ Item {
4544 Rectangle {
4645 id: actionHeader
4746
48- function hasSelectedNode () {
49- return uigraph && uigraph .nodeSelection .selectedIndexes .length === 1
50- }
51-
52- readonly property var selectedNode: hasSelectedNode () ? uigraph .selectedNode : null
47+ readonly property bool hasSelectedNode: uigraph && uigraph .nodeSelection .selectedIndexes .length === 1
48+ readonly property var selectedNode: hasSelectedNode ? uigraph .selectedNode : null
5349 readonly property var selectedNodeDelegate: selectedNode ? root .nodeDelegate (selectedNode) : null
5450
5551 visible: selectedNodeDelegate !== null
5652 color: " transparent"
5753 width: actionItemsRow .width
5854 height: actionItemsRow .height
5955
60- // Properties depending on selectedNode
61- readonly property string currentExecMode: selectedNode ? selectedNode .globalExecMode : " NONE"
62- readonly property string currentStatus: selectedNode ? selectedNode .globalStatus : " NONE"
63- readonly property bool nodeCanBeStopped: selectedNode ? selectedNode .canBeStopped () : false
64- readonly property bool nodeIsExternal: selectedNode ? selectedNode .isExternal : false
65- readonly property bool nodeLocked: selectedNode ? selectedNode .locked : false
56+ // State properties
57+ property string currentExecMode: selectedNode ? selectedNode .globalExecMode : " NONE"
58+ property string currentStatus: selectedNode ? selectedNode .globalStatus : " NONE"
59+ property bool nodeCanBeStopped: selectedNode ? selectedNode .canBeStopped () : false
60+ property bool nodeIsExternal: selectedNode ? selectedNode .isExternal : false
61+ property bool nodeLocked: selectedNode ? selectedNode .locked : false
6662
67- Connections {
68- target: actionHeader .selectedNode
69- function onGlobalStatusChanged () {
70- actionHeader .currentStatusChanged ()
71- }
72- function onGlobalExecModeChanged () {
73- actionHeader .currentExecModeChanged ()
74- }
75- ignoreUnknownSignals: true
76- }
63+ // Derived values
64+ readonly property bool runningExternally: currentExecMode === " EXTERN"
65+ && [" SUBMITTED" , " RUNNING" ].includes (currentStatus)
66+ readonly property bool stoppable: selectedNode && currentStatus === " RUNNING" && nodeCanBeStopped
67+ readonly property bool launchable: selectedNode &&
68+ (nodeCanBeStopped || [" NONE" ," STOPPED" ," KILLED" ," ERROR" ].includes (currentStatus))
7769
7870 // Prevents losing focus on the node when we click on buttons of the actionItems
7971 MouseArea {
8072 anchors .fill : parent
81- // Consume all mouse events to prevent propagation to GraphEditor
8273 onPressed : function (mouse ) { mouse .accepted = true }
8374 onReleased : function (mouse ) { mouse .accepted = true }
8475 onClicked : function (mouse ) { mouse .accepted = true }
8576 onDoubleClicked : function (mouse ) { mouse .accepted = true }
86- // Allow the buttons to receive hover events
8777 hoverEnabled: false
8878 }
8979
@@ -116,29 +106,29 @@ Item {
116106 ignoreUnknownSignals: true
117107 }
118108
119- // Initial position update
109+ // Set initial position
120110 onSelectedNodeDelegateChanged: updatePosition ()
121111
122- function isRunningExternally () {
123- return actionHeader .currentExecMode === " EXTERN" && [" SUBMITTED" , " RUNNING" ].includes (actionHeader .currentStatus )
124- }
125-
126- function isRunningLocally () {
127- if (! actionHeader .selectedNode ) return false
128- if (actionHeader .nodeIsExternal ) return false
129- return actionHeader .currentStatus === " RUNNING"
130- }
131-
132- function canBeStopped () {
133- if (! actionHeader .selectedNode ) return false
134- if (actionHeader .currentStatus !== " RUNNING" ) return false
135- return actionHeader .nodeCanBeStopped
112+ // Listen to updates to status
113+ Connections {
114+ target: actionHeader .selectedNode
115+ function onGlobalStatusChanged () { actionHeader .currentStatus = target .globalStatus }
116+ function onGlobalExecModeChanged () { actionHeader .currentExecMode = target .globalExecMode }
117+ function onIsComputedChanged () { actionHeader .nodeCanBeStopped = target .canBeStopped () }
118+ function onLockedChanged () { actionHeader .nodeLocked = target .locked }
119+ ignoreUnknownSignals: true
136120 }
137121
138- function canBeLaunched () {
139- if (! actionHeader .selectedNode ) return false
140- if (actionHeader .nodeCanBeStopped ) return true
141- return [" NONE" , " STOPPED" , " KILLED" , " ERROR" ].includes (actionHeader .currentStatus )
122+ // Also listen to uigraph for status updates
123+ Connections {
124+ target: root .uigraph
125+ function onComputationStatusChanged () {
126+ actionHeader .currentStatus = actionHeader .selectedNode ? actionHeader .selectedNode .globalStatus : " NONE"
127+ }
128+ function onNodeStatusUpdated () {
129+ actionHeader .currentStatus = actionHeader .selectedNode ? actionHeader .selectedNode .globalStatus : " NONE"
130+ }
131+ ignoreUnknownSignals: true
142132 }
143133
144134 Row {
@@ -150,12 +140,12 @@ Item {
150140 MaterialToolButton {
151141 id: computeButton
152142 font .pointSize : 16
153- text: actionHeader .canBeStopped () ? MaterialIcons .cancel_schedule_send : MaterialIcons .send
143+ text: actionHeader .stoppable ? MaterialIcons .cancel_schedule_send : MaterialIcons .send
154144 padding: 6
155145 ToolTip .text : " Start/Stop Compute"
156146 ToolTip .visible : hovered
157147 ToolTip .delay : 1000
158- enabled: actionHeader .selectedNode && actionHeader .canBeLaunched ()
148+ enabled: actionHeader .selectedNode && actionHeader .launchable
159149 background: Rectangle {
160150 color: {
161151 if (! computeButton .enabled ) return activePalette .button
@@ -173,7 +163,7 @@ Item {
173163 radius: 3
174164 }
175165 onClicked: {
176- if (actionHeader .isRunningLocally () ) {
166+ if (actionHeader .selectedNode && ! actionHeader . nodeIsExternal && actionHeader . currentStatus === " RUNNING " ) {
177167 root .stopComputeRequest (actionHeader .selectedNode )
178168 } else {
179169 root .computeRequest (actionHeader .selectedNode )
@@ -190,12 +180,12 @@ Item {
190180 ToolTip .text : " Re-compute"
191181 ToolTip .visible : hovered
192182 ToolTip .delay : 1000
193- enabled: actionHeader .selectedNode && ! actionHeader .isRunningExternally ()
183+ enabled: actionHeader .selectedNode && ! actionHeader .runningExternally
194184 background: Rectangle {
195185 color: {
196186 if (! reComputeButton .enabled ) return activePalette .button
197- if (reComputeButton .hovered ) return activePalette .highlight ;
198- return activePalette .button ;
187+ if (reComputeButton .hovered ) return activePalette .highlight
188+ return activePalette .button
199189 }
200190 opacity: reComputeButton .hovered ? 1 : root ._opacity
201191 border .color : reComputeButton .hovered ? activePalette .highlight : Qt .darker (activePalette .window , 1.3 )
@@ -219,14 +209,13 @@ Item {
219209 ToolTip .visible : hovered
220210 ToolTip .delay : 1000
221211 visible: root .uigraph ? root .uigraph .canSubmit : false
222- enabled: actionHeader .selectedNode ? ! actionHeader .selectedNode .locked : false
223-
212+ enabled: actionHeader .selectedNode ? ! actionHeader .nodeLocked : false
224213 background: Rectangle {
225214 color: {
226215 if (! submitButton .enabled ) return activePalette .button
227- if (actionHeader .isRunningExternally ()) return Colors .statusColors [" SUBMITTED" ];
228- if (submitButton .hovered ) return activePalette .highlight ;
229- return activePalette .button ;
216+ if (actionHeader .runningExternally ) return Colors .statusColors [" SUBMITTED" ]
217+ if (submitButton .hovered ) return activePalette .highlight
218+ return activePalette .button
230219 }
231220 opacity: submitButton .hovered ? 1 : root ._opacity
232221 border .color : submitButton .hovered ? activePalette .highlight : Qt .darker (activePalette .window , 1.3 )
@@ -255,8 +244,8 @@ Item {
255244 background: Rectangle {
256245 color: {
257246 if (! actionHeader .selectedNode ) return activePalette .button
258- if (reSubmitButton .hovered ) return activePalette .highlight ;
259- return activePalette .button ;
247+ if (reSubmitButton .hovered ) return activePalette .highlight
248+ return activePalette .button
260249 }
261250 opacity: reSubmitButton .hovered ? 1 : root ._opacity
262251 border .color : reSubmitButton .hovered ? activePalette .highlight : Qt .darker (activePalette .window , 1.3 )
0 commit comments