mirror of
https://github.com/alicevision/Meshroom.git
synced 2025-04-29 10:17:27 +02:00
Merge pull request #2624 from alicevision/fix/NodeEditorTab
[ui] NodeEditor: Addressed Tab Retention when switching Node selection
This commit is contained in:
commit
05863369f5
4 changed files with 217 additions and 182 deletions
|
@ -215,6 +215,7 @@ class Graph(BaseObject):
|
|||
super(Graph, self).__init__(parent)
|
||||
self.name = name
|
||||
self._loading = False
|
||||
self._saving = False
|
||||
self._updateEnabled = True
|
||||
self._updateRequested = False
|
||||
self.dirtyTopology = False
|
||||
|
@ -252,6 +253,11 @@ class Graph(BaseObject):
|
|||
""" Return True if the graph is currently being loaded. """
|
||||
return self._loading
|
||||
|
||||
@property
|
||||
def isSaving(self):
|
||||
""" Return True if the graph is currently being saved. """
|
||||
return self._saving
|
||||
|
||||
@Slot(str)
|
||||
def load(self, filepath, setupProjectFile=True, importProject=False, publishOutputs=False):
|
||||
"""
|
||||
|
@ -1347,6 +1353,23 @@ class Graph(BaseObject):
|
|||
return str(self.toDict())
|
||||
|
||||
def save(self, filepath=None, setupProjectFile=True, template=False):
|
||||
"""
|
||||
Save the current Meshroom graph as a serialized ".mg" file.
|
||||
|
||||
Args:
|
||||
filepath: project filepath to save as.
|
||||
setupProjectFile: Store the reference to the project file and setup the cache directory.
|
||||
If false, it only saves the graph of the project file as a template.
|
||||
template: If true, saves the current graph as a template.
|
||||
"""
|
||||
# Update the saving flag indicating that the current graph is being saved
|
||||
self._saving = True
|
||||
try:
|
||||
self._save(filepath=filepath, setupProjectFile=setupProjectFile, template=template)
|
||||
finally:
|
||||
self._saving = False
|
||||
|
||||
def _save(self, filepath=None, setupProjectFile=True, template=False):
|
||||
path = filepath or self._filepath
|
||||
if not path:
|
||||
raise ValueError("filepath must be specified for unsaved files.")
|
||||
|
@ -1636,6 +1659,7 @@ class Graph(BaseObject):
|
|||
edges = Property(BaseObject, edges.fget, constant=True)
|
||||
filepathChanged = Signal()
|
||||
filepath = Property(str, lambda self: self._filepath, notify=filepathChanged)
|
||||
isSaving = Property(bool, isSaving.fget, constant=True)
|
||||
fileReleaseVersion = Property(str, lambda self: self.header.get(Graph.IO.Keys.ReleaseVersion, "0.0"),
|
||||
notify=filepathChanged)
|
||||
fileDateVersion = Property(float, fileDateVersion.fget, fileDateVersion.fset, notify=filepathChanged)
|
||||
|
|
|
@ -20,6 +20,16 @@ Page {
|
|||
property alias unsavedDialog: unsavedDialog
|
||||
property alias workspaceView: workspaceView
|
||||
|
||||
readonly property var scenefile: _reconstruction ? _reconstruction.graph.filepath : "";
|
||||
|
||||
onScenefileChanged: {
|
||||
// Check if we're not currently saving and emit the currentProjectChanged signal
|
||||
if (! _reconstruction.graph.isSaving) {
|
||||
// Refresh the NodeEditor
|
||||
nodeEditor.refresh();
|
||||
}
|
||||
}
|
||||
|
||||
Settings {
|
||||
id: settingsUILayout
|
||||
category: "UILayout"
|
||||
|
|
|
@ -42,6 +42,14 @@ Panel {
|
|||
}
|
||||
}
|
||||
|
||||
function refresh() {
|
||||
/**
|
||||
* Refresh properties of the Node Editor.
|
||||
*/
|
||||
// Reset tab bar's current index
|
||||
tabBar.currentIndex = 0;
|
||||
}
|
||||
|
||||
headerBar: RowLayout {
|
||||
Label {
|
||||
id: computationInfo
|
||||
|
@ -372,6 +380,9 @@ Panel {
|
|||
|
||||
property bool isComputable: root.node !== null && root.node.isComputable
|
||||
|
||||
// The indices of the tab bar which can be shown for incomputable nodes
|
||||
readonly property var nonComputableTabIndices: [0, 4, 5];
|
||||
|
||||
Layout.fillWidth: true
|
||||
width: childrenRect.width
|
||||
position: TabBar.Footer
|
||||
|
@ -415,9 +426,11 @@ Panel {
|
|||
rightPadding: leftPadding
|
||||
}
|
||||
|
||||
onIsComputableChanged: {
|
||||
if (!isComputable) {
|
||||
tabBar.currentIndex = 0
|
||||
onVisibleChanged: {
|
||||
// If we have a node selected and the node is not Computable
|
||||
// Reset the currentIndex to 0, if the current index is not allowed for an incomputable node
|
||||
if ((root.node && !root.node.isComputable) && (nonComputableTabIndices.indexOf(tabBar.currentIndex) === -1)) {
|
||||
tabBar.currentIndex = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -310,9 +310,6 @@ Item {
|
|||
*** CPU UI ***
|
||||
**************************/
|
||||
|
||||
ColumnLayout {
|
||||
Layout.fillWidth: true
|
||||
|
||||
Button {
|
||||
id: toggleCpuBtn
|
||||
Layout.fillWidth: true
|
||||
|
@ -419,15 +416,11 @@ Item {
|
|||
labelsColor: textColor
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**************************
|
||||
*** RAM UI ***
|
||||
**************************/
|
||||
|
||||
ColumnLayout {
|
||||
|
||||
InteractiveChartView {
|
||||
id: ramChart
|
||||
margins.top: 0
|
||||
|
@ -472,15 +465,11 @@ Item {
|
|||
labelsColor: textColor
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**************************
|
||||
*** GPU UI ***
|
||||
**************************/
|
||||
|
||||
ColumnLayout {
|
||||
|
||||
InteractiveChartView {
|
||||
id: gpuChart
|
||||
|
||||
|
@ -528,4 +517,3 @@ Item {
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue