@@ -106,7 +106,7 @@ MainWindow::MainWindow()
106106 m_interactiveQueue(std::make_unique<ProcessingTaskQueue>()),
107107 m_outOfMemoryDialog(std::make_unique<OutOfMemoryDialog>()),
108108 m_curFilter(0 ),
109- m_savedZoomLevel( 1.0 ),
109+ m_savedMainAreaViewState( ),
110110 m_ignoreSelectionChanges(0 ),
111111 m_ignorePageOrderingChanges(0 ),
112112 m_debug(false ),
@@ -710,6 +710,54 @@ void MainWindow::setOptionsWidget(FilterOptionsWidget* widget, const Ownership o
710710 connect (widget, SIGNAL (fixDpiRequested ()), this , SLOT (fixDpiDialogRequested ()));
711711} // MainWindow::setOptionsWidget
712712
713+ ImageViewBase* MainWindow::findPrimaryImageView (QWidget* root) {
714+ if (!root) {
715+ return nullptr ;
716+ }
717+ if (auto * tabs = qobject_cast<output::TabbedImageView*>(root)) {
718+ QWidget* const page = tabs->currentWidget ();
719+ if (page) {
720+ return Utils::castOrFindChild<ImageViewBase*>(page);
721+ }
722+ return nullptr ;
723+ }
724+ return Utils::castOrFindChild<ImageViewBase*>(root);
725+ }
726+
727+ void MainWindow::applySavedMainAreaViewState (ImageViewBase* view, const SavedMainAreaViewState& state) {
728+ if (!view) {
729+ return ;
730+ }
731+ view->setZoomLevel (state.zoom );
732+ if (!state.hasScrollNorm ) {
733+ return ;
734+ }
735+ QScrollBar* const h = view->horizontalScrollBar ();
736+ QScrollBar* const v = view->verticalScrollBar ();
737+ const int hr = h->maximum () - h->minimum ();
738+ const int vr = v->maximum () - v->minimum ();
739+ if (hr <= 0 || vr <= 0 ) {
740+ return ;
741+ }
742+ const double nx = qBound (0.0 , state.scrollNormX , 1.0 );
743+ const double ny = qBound (0.0 , state.scrollNormY , 1.0 );
744+ h->setValue (h->minimum () + qRound (nx * hr));
745+ v->setValue (v->minimum () + qRound (ny * vr));
746+ }
747+
748+ void MainWindow::scheduleSavedMainAreaViewStateRestore (const QPointer<ImageViewBase>& view) {
749+ if (view.isNull ()) {
750+ return ;
751+ }
752+ const SavedMainAreaViewState state = m_savedMainAreaViewState;
753+ QTimer::singleShot (0 , this , [view, state]() {
754+ if (view.isNull ()) {
755+ return ;
756+ }
757+ MainWindow::applySavedMainAreaViewState (view.data (), state);
758+ });
759+ }
760+
713761void MainWindow::setImageWidget (QWidget* widget, const Ownership ownership, DebugImages* debugImages, bool overlay) {
714762 if (isBatchProcessingInProgress () && (widget != m_batchProcessingWidget.get ())) {
715763 if (ownership == TRANSFER_OWNERSHIP ) {
@@ -720,8 +768,19 @@ void MainWindow::setImageWidget(QWidget* widget, const Ownership ownership, Debu
720768
721769 if (!overlay && m_imageFrameLayout->count () > 0 ) {
722770 QWidget* oldW = m_imageFrameLayout->widget (0 );
723- if (ImageViewBase* oldView = Utils::castOrFindChild<ImageViewBase*>(oldW)) {
724- m_savedZoomLevel = oldView->zoomLevel ();
771+ if (ImageViewBase* oldView = findPrimaryImageView (oldW)) {
772+ m_savedMainAreaViewState.zoom = oldView->zoomLevel ();
773+ QScrollBar* const h = oldView->horizontalScrollBar ();
774+ QScrollBar* const v = oldView->verticalScrollBar ();
775+ const int hr = h->maximum () - h->minimum ();
776+ const int vr = v->maximum () - v->minimum ();
777+ if (hr > 0 && vr > 0 ) {
778+ m_savedMainAreaViewState.hasScrollNorm = true ;
779+ m_savedMainAreaViewState.scrollNormX = double (h->value () - h->minimum ()) / hr;
780+ m_savedMainAreaViewState.scrollNormY = double (v->value () - v->minimum ()) / vr;
781+ } else {
782+ m_savedMainAreaViewState.hasScrollNorm = false ;
783+ }
725784 }
726785 }
727786
@@ -739,8 +798,8 @@ void MainWindow::setImageWidget(QWidget* widget, const Ownership ownership, Debu
739798 if (overlay) {
740799 m_imageFrameLayout->setCurrentWidget (widget);
741800 }
742- if (ImageViewBase* newView = Utils::castOrFindChild<ImageViewBase*> (widget)) {
743- newView-> setZoomLevel (m_savedZoomLevel );
801+ if (ImageViewBase* newView = findPrimaryImageView (widget)) {
802+ scheduleSavedMainAreaViewStateRestore (QPointer<ImageViewBase>(newView) );
744803 }
745804 }
746805 } else {
0 commit comments