Skip to content

Commit d0bc1ab

Browse files
committed
[ui] NodeActions: Fix issues in properties binding
1 parent f6338ae commit d0bc1ab

File tree

1 file changed

+46
-57
lines changed

1 file changed

+46
-57
lines changed

meshroom/ui/qml/Controls/NodeActions.qml

Lines changed: 46 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import QtQuick.Layouts
55
import MaterialIcons 2.2
66
import Utils 1.0
77

8-
98
Item {
109
id: root
1110

@@ -34,7 +33,7 @@ Item {
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

Comments
 (0)