From 5afb9cb2c8af075946e5633495cf26e08447788c Mon Sep 17 00:00:00 2001 From: Aurore LAFAURIE Date: Thu, 4 Apr 2024 15:55:41 +0200 Subject: [PATCH] [ui] Sync Viewer3D according to updateSelectedViewpoint --- meshroom/ui/qml/Viewer/SequencePlayer.qml | 17 +++++++++++++++++ meshroom/ui/reconstruction.py | 12 +++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/meshroom/ui/qml/Viewer/SequencePlayer.qml b/meshroom/ui/qml/Viewer/SequencePlayer.qml index b7d1fd29..89e0bc14 100644 --- a/meshroom/ui/qml/Viewer/SequencePlayer.qml +++ b/meshroom/ui/qml/Viewer/SequencePlayer.qml @@ -29,6 +29,9 @@ FloatingPane { _reconstruction.selectedViewId = sortedViewIds[m.frame]; } else { _reconstruction.pickedViewId = sortedViewIds[m.frame]; + if (m.sync3DSelected) { + _reconstruction.updateSelectedViewpoint(_reconstruction.pickedViewId); + } } } } @@ -41,6 +44,7 @@ FloatingPane { property int frame: 0 property bool syncSelected: true + property bool sync3DSelected: false property bool playing: false property bool repeat: false property real fps: 24 @@ -271,6 +275,19 @@ FloatingPane { } } } + + MaterialToolButton { + id: sync3DButton + + checkable: true + checked: false + text: MaterialIcons.sync_alt + ToolTip.text: "Sync 3D Viewer and Sequence Player" + + onCheckedChanged: { + m.sync3DSelected = checked; + } + } } TextMetrics { diff --git a/meshroom/ui/reconstruction.py b/meshroom/ui/reconstruction.py index 91c4c81f..951267da 100755 --- a/meshroom/ui/reconstruction.py +++ b/meshroom/ui/reconstruction.py @@ -1115,12 +1115,21 @@ class Reconstruction(UIGraph): # Reconstruction has ownership of Viewpoint object - destroy it when not needed anymore self._selectedViewpoint.deleteLater() self._selectedViewpoint = ViewpointWrapper(viewpointAttribute, self) if viewpointAttribute else None + self.selectedViewpointChanged.emit() def setPickedViewId(self, viewId): if viewId == self._pickedViewId: return self._pickedViewId = viewId self.pickedViewIdChanged.emit() + + @Slot(str) + def updateSelectedViewpoint(self, viewId): + """ Update the currently set viewpoint if the provided view ID corresponds to one. """ + vp = None + if self.viewpoints: + vp = next((v for v in self.viewpoints if str(v.viewId.value) == viewId), None) + self._setSelectedViewpoint(vp) def reconstructedCamerasCount(self): """ Get the number of reconstructed cameras in the current context. """ @@ -1166,7 +1175,8 @@ class Reconstruction(UIGraph): selectedViewIdChanged = Signal() selectedViewId = Property(str, lambda self: self._selectedViewId, setSelectedViewId, notify=selectedViewIdChanged) - selectedViewpoint = Property(ViewpointWrapper, lambda self: self._selectedViewpoint, notify=selectedViewIdChanged) + selectedViewpointChanged = Signal() + selectedViewpoint = Property(ViewpointWrapper, lambda self: self._selectedViewpoint, notify=selectedViewpointChanged) pickedViewIdChanged = Signal() pickedViewId = Property(str, lambda self: self._pickedViewId, setPickedViewId, notify=pickedViewIdChanged)