[ui] Detect if the reconstruction has been set yet or reset

An `active` property is added to the `Reconstruction` object to share
whether it has been initialized or not.
This commit is contained in:
Candice Bentéjac 2024-08-14 11:10:21 +01:00 committed by Aurore LAFAURIE
parent da2c3fda05
commit cb062a4b4c
3 changed files with 13 additions and 10 deletions

View file

@ -97,8 +97,6 @@ class MeshroomApp(QApplication):
args = parser.parse_args(args[1:]) args = parser.parse_args(args[1:])
self._projectOpened = True if getattr(args, "import", None) or args.project or args.importRecursive or args.save or args.pipeline else False
logStringToPython = { logStringToPython = {
'fatal': logging.FATAL, 'fatal': logging.FATAL,
'error': logging.ERROR, 'error': logging.ERROR,
@ -492,10 +490,6 @@ class MeshroomApp(QApplication):
activeProjectChanged = Signal() activeProjectChanged = Signal()
activeProject = Property(Variant, lambda self: self._activeProject, notify=activeProjectChanged) activeProject = Property(Variant, lambda self: self._activeProject, notify=activeProjectChanged)
# As activeProject is a Reconstruction, we can't use it directly in QML to know if a project is opened or not
# So we expose a boolean property to know if a project is opened or not
# TODO: find a way to have empty activeProject property
projectOpened = Property(bool, lambda self: self._projectOpened, constant=True)
changelogModel = Property("QVariantList", _changelogModel, constant=True) changelogModel = Property("QVariantList", _changelogModel, constant=True)
licensesModel = Property("QVariantList", _licensesModel, constant=True) licensesModel = Property("QVariantList", _licensesModel, constant=True)
pipelineTemplateFilesChanged = Signal() pipelineTemplateFilesChanged = Signal()

View file

@ -609,7 +609,7 @@ ApplicationWindow {
anchors.fill: parent anchors.fill: parent
Component.onCompleted: { Component.onCompleted: {
if (MeshroomApp.projectOpened) { if (_reconstruction.active) {
mainStack.push("Application.qml") mainStack.push("Application.qml")
} else { } else {
mainStack.push("Homepage.qml") mainStack.push("Homepage.qml")

View file

@ -434,11 +434,11 @@ class Reconstruction(UIGraph):
"matchProvider": ["FeatureMatching", "StructureFromMotion"] "matchProvider": ["FeatureMatching", "StructureFromMotion"]
} }
def __init__(self, undoStack, taskManager, defaultPipeline='', parent=None): def __init__(self, undoStack, taskManager, defaultPipeline="", parent=None):
super(Reconstruction, self).__init__(undoStack, taskManager, parent) super(Reconstruction, self).__init__(undoStack, taskManager, parent)
# initialize member variables for key steps of the 3D reconstruction pipeline # initialize member variables for key steps of the 3D reconstruction pipeline
self._active = False
self._activeNodes = meshroom.common.DictModel(keyAttrName="nodeType") self._activeNodes = meshroom.common.DictModel(keyAttrName="nodeType")
self.initActiveNodes() self.initActiveNodes()
@ -477,10 +477,14 @@ class Reconstruction(UIGraph):
self._workerThreads.terminate() self._workerThreads.terminate()
self._workerThreads.join() self._workerThreads.join()
def setActive(self, active):
self._active = active
@Slot() @Slot()
def clear(self): def clear(self):
self.clearActiveNodes() self.clearActiveNodes()
super(Reconstruction, self).clear() super(Reconstruction, self).clear()
self.setActive(False)
def setDefaultPipeline(self, defaultPipeline): def setDefaultPipeline(self, defaultPipeline):
self._defaultPipeline = defaultPipeline self._defaultPipeline = defaultPipeline
@ -534,7 +538,7 @@ class Reconstruction(UIGraph):
"Data might have been lost in the process.", "Data might have been lost in the process.",
"Open it with the corresponding version of Meshroom to recover your data." "Open it with the corresponding version of Meshroom to recover your data."
)) ))
self.setActive(True)
return status return status
except FileNotFoundError as e: except FileNotFoundError as e:
self.error.emit( self.error.emit(
@ -1273,6 +1277,11 @@ class Reconstruction(UIGraph):
currentViewPathChanged = Signal() currentViewPathChanged = Signal()
currentViewPath = Property(str, lambda self: self._currentViewPath, setCurrentViewPath, notify=currentViewPathChanged) currentViewPath = Property(str, lambda self: self._currentViewPath, setCurrentViewPath, notify=currentViewPathChanged)
# Whether the Reconstruction object has been set ("new" has been called) or not ("new" has never
# been called or "clear" has been called)
activeChanged = Signal()
active = Property(bool, lambda self: self._active, setActive, notify=activeChanged)
# Signals to propagate high-level messages # Signals to propagate high-level messages
error = Signal(Message) error = Signal(Message)
warning = Signal(Message) warning = Signal(Message)