[ui] new concept of pickedViewId to scroll in 2D viewer without constantly updating selectedViewId

This commit is contained in:
Loïc Vital 2023-04-20 10:47:12 +02:00
parent f1de96127d
commit 4c58d4b93f
3 changed files with 31 additions and 4 deletions

View file

@ -39,6 +39,16 @@ FloatingPane {
return viewIds;
}
function updateReconstructionView() {
if (_reconstruction && m.frame >= 0 && m.frame < m.sortedViewIds.length) {
if (m.syncSelected) {
_reconstruction.selectedViewId = m.sortedViewIds[m.frame];
} else {
_reconstruction.pickedViewId = m.sortedViewIds[m.frame];
}
}
}
// Sequence player model:
// - ordered set of viewpoints
// - current frame
@ -50,14 +60,17 @@ FloatingPane {
property var viewpoints: currentCameraInit ? currentCameraInit.attribute('viewpoints').value : undefined
property var sortedViewIds: viewpoints ? sequence(viewpoints) : []
property int frame: 0
property bool syncSelected: true
property bool playing: false
property bool repeat: false
property real fps: 1
onFrameChanged: {
if (_reconstruction && frame >= 0 && frame < sortedViewIds.length) {
_reconstruction.selectedViewId = sortedViewIds[frame];
}
updateReconstructionView();
}
onSyncSelectedChanged: {
updateReconstructionView();
}
}
@ -179,6 +192,10 @@ FloatingPane {
m.frame = value;
}
onPressedChanged: {
m.syncSelected = !pressed;
}
Connections {
target: m
onFrameChanged: {

View file

@ -201,7 +201,7 @@ FocusScope {
return sourceExternal;
}
if (_reconstruction && (!displayedNode || outputAttribute.name == "gallery")) {
return Filepath.stringToUrl(getViewpointAttribute("path",_reconstruction.selectedViewId));
return Filepath.stringToUrl(getViewpointAttribute("path",_reconstruction.pickedViewId));
}
var viewId = -1;

View file

@ -441,6 +441,7 @@ class Reconstruction(UIGraph):
self._solvedIntrinsics = None
self._selectedViewId = None
self._selectedViewpoint = None
self._pickedViewId = None
self._liveSfmManager = LiveSfmManager(self)
self._workerThreads = ThreadPool(processes=1)
@ -1067,6 +1068,7 @@ class Reconstruction(UIGraph):
if viewId == self._selectedViewId:
return
self._selectedViewId = viewId
self.setPickedViewId(viewId)
vp = None
if self.viewpoints:
vp = next((v for v in self.viewpoints if str(v.viewId.value) == self._selectedViewId), None)
@ -1079,6 +1081,12 @@ class Reconstruction(UIGraph):
self._selectedViewpoint.deleteLater()
self._selectedViewpoint = ViewpointWrapper(viewpointAttribute, self) if viewpointAttribute else None
def setPickedViewId(self, viewId):
if viewId == self._pickedViewId:
return
self._pickedViewId = viewId
self.pickedViewIdChanged.emit()
def reconstructedCamerasCount(self):
""" Get the number of reconstructed cameras in the current context. """
viewpoints = self.getViewpoints()
@ -1124,6 +1132,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)
pickedViewIdChanged = Signal()
pickedViewId = Property(str, lambda self: self._pickedViewId, setPickedViewId, notify=pickedViewIdChanged)
sfmChanged = Signal()
sfm = Property(QObject, getSfm, setSfm, notify=sfmChanged)