Skip to content

Commit a417207

Browse files
committed
[graph] Prevent several bugs in the node rename feature
1 parent eb9082a commit a417207

File tree

2 files changed

+34
-2
lines changed

2 files changed

+34
-2
lines changed

meshroom/ui/graph.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from collections.abc import Iterable
33
import logging
44
import os
5+
import re
56
import json
67
from enum import Enum
78
from threading import Thread, Event, Lock
@@ -936,6 +937,11 @@ def addNewNode(self, nodeType, position=None, **kwargs):
936937

937938
@Slot(Node, str, result=str)
938939
def renameNode(self, node, newName):
940+
newName = "_".join(newName.split("_")[:-1]) if "_" in newName else newName
941+
# Eliminate all characters except digits and letters
942+
newName = re.sub(r"[^0-9a-zA-Z]", "", newName)
943+
if not newName:
944+
return ""
939945
return self.push(commands.RenameNodeCommand(self._graph, node, newName))
940946

941947
def moveNode(self, node: Node, position: Position):

meshroom/ui/qml/GraphEditor/NodeEditor.qml

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,13 @@ Panel {
8585
function validateNodeNameChange(name) {
8686
if (root.node && name.trim() !== "") {
8787
const newNodeName = _reconstruction.renameNode(_reconstruction.selectedNode, name.trim())
88-
root.displayNodeName = newNodeName
89-
root.validatedNodeName = newNodeName
88+
if (newNodeName == "") {
89+
root.displayNodeName = root.nodeName
90+
root.validatedNodeName = root.nodeName
91+
} else {
92+
root.displayNodeName = newNodeName
93+
root.validatedNodeName = newNodeName
94+
}
9095
}
9196
}
9297
function cancelNodeNameChange() {
@@ -110,6 +115,7 @@ Panel {
110115
id: nodeNameField
111116
visible: root.node !== null
112117
text: root.displayNodeName
118+
validator: RegularExpressionValidator { regularExpression: /^[0-9A-Za-z]+$/ }
113119
font.bold: true
114120
readOnly: true
115121
selectByMouse: false
@@ -125,6 +131,10 @@ Panel {
125131
radius: 2
126132
}
127133

134+
function refreshText() {
135+
nodeNameField.text = Qt.binding(function() { return root.displayNodeName })
136+
}
137+
128138
MouseArea {
129139
anchors.fill: parent
130140
enabled: nodeNameField.readOnly
@@ -141,6 +151,7 @@ Panel {
141151
Keys.onReturnPressed: {
142152
if (!readOnly) {
143153
root.validateNodeNameChange(text)
154+
nodeNameField.refreshText()
144155
readOnly = true
145156
selectByMouse = false
146157
}
@@ -149,6 +160,7 @@ Panel {
149160
Keys.onEnterPressed: {
150161
if (!readOnly) {
151162
root.validateNodeNameChange(text)
163+
nodeNameField.refreshText()
152164
readOnly = true
153165
selectByMouse = false
154166
}
@@ -157,6 +169,7 @@ Panel {
157169
Keys.onEscapePressed: {
158170
if (!readOnly) {
159171
root.cancelNodeNameChange()
172+
nodeNameField.refreshText()
160173
readOnly = true
161174
selectByMouse = false
162175
}
@@ -166,10 +179,23 @@ Panel {
166179
if (!activeFocus && !readOnly) {
167180
// Focus lost without pressing Enter - discard changes
168181
root.cancelNodeNameChange()
182+
nodeNameField.refreshText()
169183
readOnly = true
170184
selectByMouse = false
171185
}
172186
}
187+
188+
Connections {
189+
target: _reconstruction
190+
function onSelectedNodeChanged() {
191+
if (!activeFocus && !readOnly) {
192+
root.cancelNodeNameChange()
193+
nodeNameField.refreshText()
194+
nodeNameField.readOnly = true
195+
nodeNameField.selectByMouse = false
196+
}
197+
}
198+
}
173199
}
174200

175201
// Show node type if the node name does not start with "nodeType_"

0 commit comments

Comments
 (0)