Skip to content

Instantly share code, notes, and snippets.

@asavonic
Created June 15, 2016 21:50
Show Gist options
  • Save asavonic/5b3c5e72f90d2b8da8d48ecadabb2cd6 to your computer and use it in GitHub Desktop.
Save asavonic/5b3c5e72f90d2b8da8d48ecadabb2cd6 to your computer and use it in GitHub Desktop.
From a5033180f1fd14ae810449b45ca11783e042fa5a Mon Sep 17 00:00:00 2001
From: Andrew Savonichev <andrew.savonichev@gmail.com>
Date: Thu, 16 Jun 2016 00:39:27 +0300
Subject: [PATCH] Zoom to 100% on middle click
---
ImageLounge/src/DkGui/DkViewPort.cpp | 25 +++++++++++++++++++------
ImageLounge/src/DkGui/DkViewPort.h | 4 ++++
2 files changed, 23 insertions(+), 6 deletions(-)
diff --git a/ImageLounge/src/DkGui/DkViewPort.cpp b/ImageLounge/src/DkGui/DkViewPort.cpp
index 4be5f35..73bdf5d 100644
--- a/ImageLounge/src/DkGui/DkViewPort.cpp
+++ b/ImageLounge/src/DkGui/DkViewPort.cpp
@@ -357,6 +357,10 @@ void DkViewPort::tcpSendImage(bool silent) {
emit sendImageSignal(mImgStorage.getImage(), "nomacs - Image Lounge");
}
+float DkViewPort::getZoomFactor() {
+ return mImgMatrix.m11()*mWorldMatrix.m11();
+}
+
void DkViewPort::zoom(float factor, QPointF center) {
if (mImgStorage.getImage().isNull() || mBlockZooming)
@@ -448,10 +452,10 @@ void DkViewPort::zoom(float factor, QPointF center) {
DkStatusBarManager::instance().setMessage(QString::number(qRound((float)(mWorldMatrix.m11()*mImgMatrix.m11() * 100))) + "%", DkStatusBar::status_zoom_info);
}
-void DkViewPort::zoomTo(float zoomLevel, const QPoint&) {
+void DkViewPort::zoomTo(float zoomLevel, const QPoint& center) {
mWorldMatrix.reset();
- zoom(zoomLevel/(float)mImgMatrix.m11());
+ zoom(zoomLevel/(float)mImgMatrix.m11(), center);
}
void DkViewPort::resetView() {
@@ -487,8 +491,8 @@ void DkViewPort::fullView() {
void DkViewPort::showZoom() {
QString zoomStr;
- zoomStr.sprintf("%.1f%%", mImgMatrix.m11()*mWorldMatrix.m11()*100);
-
+ zoomStr.sprintf("%.1f%%", getZoomFactor()*100);
+
if (!mController->getZoomWidget()->isVisible())
mController->setInfo(zoomStr, 3000, DkControlWidget::bottom_left_label);
}
@@ -915,7 +919,13 @@ void DkViewPort::mousePressEvent(QMouseEvent *event) {
repeatZoom();
mRepeatZoomTimer->start();
}
-
+
+ // zoom to 100% on middle click
+ if(event->button() & Qt::MidButton) {
+ mBeforeZoom = getZoomFactor();
+ zoomTo(1.0f, event->pos());
+ }
+
// ok, start panning
if (mWorldMatrix.m11() > 1 && !imageInside() && event->buttons() == Qt::LeftButton) {
setCursor(Qt::ClosedHandCursor);
@@ -935,7 +945,10 @@ void DkViewPort::mousePressEvent(QMouseEvent *event) {
}
void DkViewPort::mouseReleaseEvent(QMouseEvent *event) {
-
+ if (mBeforeZoom > 0) {
+ zoomTo(mBeforeZoom);
+ mBeforeZoom = -1.f;
+ }
mRepeatZoomTimer->stop();
int sa = swipeRecognition(event->pos(), mPosGrab.toPoint());
diff --git a/ImageLounge/src/DkGui/DkViewPort.h b/ImageLounge/src/DkGui/DkViewPort.h
index 3430967..835d904 100644
--- a/ImageLounge/src/DkGui/DkViewPort.h
+++ b/ImageLounge/src/DkGui/DkViewPort.h
@@ -188,6 +188,8 @@ public slots:
void animateFade();
virtual void togglePattern(bool show);
+ float getZoomFactor();
+
protected:
// events
@@ -226,6 +228,8 @@ protected:
QSharedPointer<DkImageLoader> mLoader;
QPoint mCurrentPixelPos;
+
+ float mBeforeZoom = -1.f;
// functions
#if QT_VERSION < 0x050000
--
2.7.4
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment