Index: app/gwenviewui.rc =================================================================== --- app/gwenviewui.rc +++ app/gwenviewui.rc @@ -29,6 +29,8 @@ + + Index: app/viewmainpage.h =================================================================== --- app/viewmainpage.h +++ app/viewmainpage.h @@ -133,6 +133,8 @@ void goToBrowseModeRequested(); void captionUpdateRequested(const QString&); + + void birdEyeViewChanged(bool); public Q_SLOTS: void setStatusBarVisible(bool); @@ -150,6 +152,8 @@ void deselectView(DocumentView*); void slotDirModelItemsAddedOrRemoved(); + + void toggleBirdEyeView(bool); protected: bool eventFilter(QObject* watched, QEvent* event) override; Index: app/viewmainpage.cpp =================================================================== --- app/viewmainpage.cpp +++ app/viewmainpage.cpp @@ -130,6 +130,7 @@ ThumbnailBarView* mThumbnailBar; KToggleAction* mToggleThumbnailBarAction; KToggleAction* mSynchronizeAction; + KToggleAction* mToggleBirdEyeViewAction; QCheckBox* mSynchronizeCheckBox; KSqueezedTextLabel* mDocumentCountLabel; @@ -254,6 +255,8 @@ QObject::connect(view, &DocumentView::hudDeselectClicked, q, &ViewMainPage::deselectView); QObject::connect(view, &DocumentView::videoFinished, mSlideShow, &SlideShow::resumeAndGoToNextUrl); + + QObject::connect(q, &ViewMainPage::birdEyeViewChanged, view, &DocumentView::toggleBirdEyeView); mDocumentViews << view; #ifdef KF5Activities_FOUND @@ -465,6 +468,12 @@ this, &ViewMainPage::slotDirModelItemsAddedOrRemoved); connect(d->mThumbnailBar, &ThumbnailBarView::rowsRemovedSignal, this, &ViewMainPage::slotDirModelItemsAddedOrRemoved); + + d->mToggleBirdEyeViewAction = view->add("toggle_bird_eye_view"); + d->mToggleBirdEyeViewAction->setCheckable(true); + d->mToggleBirdEyeViewAction->setText(i18n("Bird's eye view")); + d->mToggleBirdEyeViewAction->setChecked(GwenviewConfig::birdEyeView()); + connect(d->mToggleBirdEyeViewAction, &QAction::toggled, this, &ViewMainPage::toggleBirdEyeView); installEventFilter(this); } @@ -715,6 +724,7 @@ DocumentView* view = it.value(); DocumentView::Setup savedSetup = d->mDocumentViewContainer->savedSetup(url); view->openUrl(url, d->mZoomMode == ZoomMode::Individual && savedSetup.valid ? savedSetup : setup); + view->toggleBirdEyeView(GwenviewConfig::birdEyeView()); #ifdef KF5Activities_FOUND d->mActivityResources.value(view)->setUri(url); d->mActivityResources.value(view)->setMimetype(MimeTypeUtils::urlMimeType(url)); @@ -873,4 +883,10 @@ d->updateDocumentCountLabel(); } +void ViewMainPage::toggleBirdEyeView(bool checked) +{ + GwenviewConfig::setBirdEyeView(checked); + emit birdEyeViewChanged(checked); +} + } // namespace Index: lib/documentview/birdeyeview.h =================================================================== --- lib/documentview/birdeyeview.h +++ lib/documentview/birdeyeview.h @@ -55,6 +55,7 @@ public Q_SLOTS: void slotZoomOrSizeChanged(); + void toggleBirdEyeView(bool); protected: void mousePressEvent(QGraphicsSceneMouseEvent* event) override; Index: lib/documentview/birdeyeview.cpp =================================================================== --- lib/documentview/birdeyeview.cpp +++ lib/documentview/birdeyeview.cpp @@ -60,6 +60,7 @@ QRectF mVisibleRect; QPointF mStartDragMousePos; QPointF mStartDragViewPos; + bool enabled; void updateCursor(const QPointF& pos) { @@ -69,25 +70,32 @@ void updateVisibility() { bool visible; - if (!mDocView->canZoom() || mDocView->zoomToFit()) { - // No need to show - visible = false; - } else if (mDocView->isAnimated()) { - // Do not show while animated - visible = false; - } else if (mVisibleRect == q->boundingRect()) { - // All of the image is visible - visible = false; - } else if (q->isUnderMouse() || !mStartDragMousePos.isNull()) { - // User is interacting or about to interact with birdeyeview - visible = true; - } else if (mAutoHideTimer->isActive()) { - // User triggered some activity recently (move mouse, scroll, zoom) - visible = true; - } else { - // No recent activity - visible = false; + + if (enabled) { + if (!mDocView->canZoom() || mDocView->zoomToFit()) { + // No need to show + visible = false; + } else if (mDocView->isAnimated()) { + // Do not show while animated + visible = false; + } else if (mVisibleRect == q->boundingRect()) { + // All of the image is visible + visible = false; + } else if (q->isUnderMouse() || !mStartDragMousePos.isNull()) { + // User is interacting or about to interact with birdeyeview + visible = true; + } else if (mAutoHideTimer->isActive()) { + // User triggered some activity recently (move mouse, scroll, zoom) + visible = true; + } else { + // No recent activity + visible = false; + } } + else { + visible = false; + } + qreal wantedOpacity = visible ? 1 : 0; if (!qFuzzyCompare(wantedOpacity, q->opacity())) { mOpacityAnim->setEndValue(wantedOpacity); @@ -106,6 +114,7 @@ { d->q = this; d->mDocView = docView; + d->enabled = true; setFlag(ItemIsSelectable); setCursor(Qt::ArrowCursor); setAcceptHoverEvents(true); @@ -126,6 +135,7 @@ connect(docView, &DocumentView::zoomChanged, this, &BirdEyeView::slotZoomOrSizeChanged); connect(docView, &DocumentView::zoomToFitChanged, this, &BirdEyeView::slotZoomOrSizeChanged); connect(docView, &DocumentView::positionChanged, this, &BirdEyeView::slotPositionChanged); + connect(docView, &DocumentView::birdEyeViewChanged, this, &BirdEyeView::toggleBirdEyeView); } BirdEyeView::~BirdEyeView() @@ -200,6 +210,12 @@ d->updateVisibility(); } +void BirdEyeView::toggleBirdEyeView(bool enabled) +{ + d->enabled = enabled; + d->updateVisibility(); +} + void BirdEyeView::slotPositionChanged() { adjustVisibleRect(); Index: lib/documentview/documentview.h =================================================================== --- lib/documentview/documentview.h +++ lib/documentview/documentview.h @@ -150,6 +150,8 @@ void setZoomToFill(bool); void toggleZoomToFill(); + + void toggleBirdEyeView(bool); void setPosition(const QPoint&); @@ -186,6 +188,8 @@ void zoomToFitChanged(bool); void zoomToFillChanged(bool); + + void birdEyeViewChanged(bool); void positionChanged(); Index: lib/documentview/documentview.cpp =================================================================== --- lib/documentview/documentview.cpp +++ lib/documentview/documentview.cpp @@ -465,7 +465,7 @@ connect(d->mTouch, &Touch::swipeLeftTriggered, this, &DocumentView::swipeLeft); connect(d->mTouch, &Touch::PanTriggered, this, &DocumentView::panGesture); connect(d->mTouch, &Touch::tapHoldAndMovingTriggered, this, &DocumentView::startDragFromTouch); - + // We use an opacity effect instead of using the opacity property directly, because the latter operates at // the painter level, which means if you draw multiple layers in paint(), all layers get the specified // opacity, resulting in all layers being visible when 0 < opacity < 1. @@ -670,6 +670,10 @@ } } +void DocumentView::toggleBirdEyeView(bool enabled) { + emit birdEyeViewChanged(enabled); +} + bool DocumentView::zoomToFit() const { return d->mAdapter->zoomToFit(); Index: lib/gwenviewconfig.kcfg =================================================================== --- lib/gwenviewconfig.kcfg +++ lib/gwenviewconfig.kcfg @@ -148,6 +148,10 @@ false + + + true + true