From b8bc2f0a6724f84a7095813c3746d1f74156bcbd Mon Sep 17 00:00:00 2001 From: Peter Klausing Date: Tue, 19 Feb 2019 00:59:13 +0200 Subject: [PATCH] Make zoomSteps configurable --- src/control/Control.cpp | 4 +- src/control/zoom/ZoomControl.cpp | 134 ++++++++++++++++++++++--------- src/control/zoom/ZoomControl.h | 111 +++++++++++++++++++++++-- src/gui/XournalView.cpp | 4 +- 4 files changed, 205 insertions(+), 48 deletions(-) diff --git a/src/control/Control.cpp b/src/control/Control.cpp index bbe42fb3..841061a9 100644 --- a/src/control/Control.cpp +++ b/src/control/Control.cpp @@ -1719,10 +1719,10 @@ void Control::zoomCallback(ActionType type) zoomFit(); break; case ACTION_ZOOM_IN: - zoom->zoomIn(); + zoom->zoomOneStep(ZOOM_IN); break; case ACTION_ZOOM_OUT: - zoom->zoomOut(); + zoom->zoomOneStep(ZOOM_OUT); break; default: break; diff --git a/src/control/zoom/ZoomControl.cpp b/src/control/zoom/ZoomControl.cpp index 20c959fb..3f5a3196 100644 --- a/src/control/zoom/ZoomControl.cpp +++ b/src/control/zoom/ZoomControl.cpp @@ -6,26 +6,29 @@ #include "gui/XournalView.h" ZoomControl::ZoomControl() - : view(NULL) + : view(NULL), + zoom(1.0), + zoomReal(1.0), + lastZoomValue(1.0), + zoomFitMode(true), + zoom100Value(1.0), + zoomFitValue(1.0), + zoomSequenceStart(-1), + zoomWidgetPosX(0), + zoomWidgetPosY(0), + scrollPositionX(0), + scrollPositionY(0), + zoomStepReal(DEFAULT_ZOOM_STEP), + zoomStepScrollReal(DEFAULT_ZOOM_STEP_SCROLL), + zoomMaxReal(DEFAULT_ZOOM_MAX), + zoomMinReal(DEFAULT_ZOOM_MIN) { XOJ_INIT_TYPE(ZoomControl); - this->zoom = 1.0; - this->lastZoomValue = 1.0; - this->zoom100Value = 1.0; - this->zoomFitValue = 1.0; - this->zoomFitMode = true; - - this->zoomStep = DEFAULT_ZOOM_STEP; + this->zoomStep = DEFAULT_ZOOM_STEP * this->zoom100Value; + this->zoomStepScroll = DEFAULT_ZOOM_STEP_SCROLL * this->zoom100Value; this->zoomMax = DEFAULT_ZOOM_MAX * this->zoom100Value; this->zoomMin = DEFAULT_ZOOM_MIN * this->zoom100Value; - - this->zoomSequenceStart = -1; - - this->zoomWidgetPosX = 0; - this->zoomWidgetPosY = 0; - this->scrollPositionX = 0; - this->scrollPositionY = 0; } ZoomControl::~ZoomControl() @@ -35,6 +38,38 @@ ZoomControl::~ZoomControl() XOJ_RELEASE_TYPE(ZoomControl); } +void ZoomControl::zoomOneStep(bool zoomIn, double x, double y) +{ + XOJ_CHECK_TYPE(ZoomControl); + + startZoomSequence(x, y); + + if(zoomIn) + this->zoom += this->zoomStep; + else + this->zoom -= this->zoomStep; + this->zoomFitMode = false; + fireZoomChanged(); + + endZoomSequence(); +} + +void ZoomControl::zoomScroll(bool zoomIn, double x, double y) +{ + XOJ_CHECK_TYPE(ZoomControl); + + startZoomSequence(x, y); + + if(zoomIn) + this->zoom += this->zoomStepScroll; + else + this->zoom -= this->zoomStepScroll; + this->zoomFitMode = false; + fireZoomChanged(); + + endZoomSequence(); +} + /** * Call this before any zoom is done, it saves the current page and position * @@ -197,8 +232,10 @@ void ZoomControl::setZoom100(double zoom) XOJ_CHECK_TYPE(ZoomControl); this->zoom100Value = zoom; - this->setZoomMax(DEFAULT_ZOOM_MAX * this->zoom100Value); - this->setZoomMin(DEFAULT_ZOOM_MIN * this->zoom100Value); + this->zoomStep = this->zoomStepReal * zoom; + this->zoomStepScroll = this->zoomStepScrollReal * zoom; + this->zoomMax = this->zoomMaxReal * zoom; + this->zoomMin = this->zoomMinReal * zoom; fireZoomRangeValueChanged(); } @@ -256,42 +293,48 @@ void ZoomControl::zoomFit() endZoomSequence(); } -void ZoomControl::zoomIn(double x, double y) +double ZoomControl::getZoomStep() { XOJ_CHECK_TYPE(ZoomControl); - startZoomSequence(x, y); + return this->zoomStep; +} - this->zoom += this->zoomStep; - this->zoomFitMode = false; - fireZoomChanged(); +double ZoomControl::getZoomStepReal() +{ + XOJ_CHECK_TYPE(ZoomControl); - endZoomSequence(); + return this->zoomStepReal; } -void ZoomControl::zoomOut(double x, double y) +void ZoomControl::setZoomStep(double zoomStep) { XOJ_CHECK_TYPE(ZoomControl); - startZoomSequence(x, y); + this->zoomStepReal = zoomStep; + this->zoomStepReal = zoomStep * this->zoom100Value; +} - this->zoom -= this->zoomStep; - this->zoomFitMode = false; - fireZoomChanged(); +double ZoomControl::getZoomStepScroll() +{ + XOJ_CHECK_TYPE(ZoomControl); - endZoomSequence(); + return this->zoomStepScroll; } -double ZoomControl::getZoomStep() +double ZoomControl::getZoomStepScrollReal() { - return this->zoomStep; + XOJ_CHECK_TYPE(ZoomControl); + + return this->zoomStepScrollReal; } -void ZoomControl::setZoomStep(double zoomStep) +void ZoomControl::setZoomStepScroll(double zoomStep) { XOJ_CHECK_TYPE(ZoomControl); - this->zoomStep = zoomStep; + this->zoomStepScrollReal = zoomStep; + this->zoomStepScrollReal = zoomStep * this->zoom100Value; } double ZoomControl::getZoomMax() @@ -301,11 +344,19 @@ double ZoomControl::getZoomMax() return this->zoomMax; } +double ZoomControl::getZoomMaxReal() +{ + XOJ_CHECK_TYPE(ZoomControl); + + return this->zoomMaxReal; +} + void ZoomControl::setZoomMax(double zoomMax) { XOJ_CHECK_TYPE(ZoomControl); - this->zoomMax = zoomMax; + this->zoomMaxReal = zoomMax; + this->zoomMax = zoomMax * this->zoom100Value; } double ZoomControl::getZoomMin() @@ -315,13 +366,20 @@ double ZoomControl::getZoomMin() return this->zoomMin; } -void ZoomControl::setZoomMin(double zoomMin) +double ZoomControl::getZoomMinReal() { XOJ_CHECK_TYPE(ZoomControl); - this->zoomMin = zoomMin; + return this->zoomMinReal; } +void ZoomControl::setZoomMin(double zoomMin) +{ + XOJ_CHECK_TYPE(ZoomControl); + + this->zoomMinReal = zoomMin; + this->zoomMin = zoomMin * this->zoom100Value; +} bool ZoomControl::onScrolledwindowMainScrollEvent(GdkEventScroll* event) { @@ -345,12 +403,12 @@ bool ZoomControl::onScrolledwindowMainScrollEvent(GdkEventScroll* event) if (event->direction == GDK_SCROLL_UP || (event->direction == GDK_SCROLL_SMOOTH && event->delta_y > 0)) { - zoomOut(event->x + wx, event->y + wy); + zoomScroll(ZOOM_IN, event->x + wx, event->y + wy); } else if (event->direction == GDK_SCROLL_DOWN || (event->direction == GDK_SCROLL_SMOOTH && event->delta_y < 0)) { - zoomIn(event->x + wx, event->y + wy); + zoomScroll(ZOOM_OUT, event->x + wx, event->y + wy); } return true; } diff --git a/src/control/zoom/ZoomControl.h b/src/control/zoom/ZoomControl.h index 52bcc35e..98adf243 100644 --- a/src/control/zoom/ZoomControl.h +++ b/src/control/zoom/ZoomControl.h @@ -19,7 +19,10 @@ #define DEFAULT_ZOOM_MAX 7 #define DEFAULT_ZOOM_MIN 0.3 -#define DEFAULT_ZOOM_STEP 0.04 +#define DEFAULT_ZOOM_STEP 0.1 +#define DEFAULT_ZOOM_STEP_SCROLL 0.01 +#define ZOOM_IN true +#define ZOOM_OUT false class XournalView; class XojPageView; @@ -31,20 +34,55 @@ public: ZoomControl(); virtual ~ZoomControl(); - void zoomIn(double x = -1, double y = -1); - void zoomOut(double x = -1, double y = -1); + /** + * Zoom one step + * + * @param zoomIn zoom in or out + * @param x x position of focus to zoom + * @param y y position of focus to zoom + */ + void zoomOneStep(bool zoomIn, double x = -1, double y = -1); + + /** + * Zoom one step + * + * @param zoomIn zoom in or out + * @param x x position of focus to zoom + * @param y y position of focus to zoom + */ + void zoomScroll(bool zoomIn, double x, double y); + /** + * Zoom so that the page fits the current size of the window + */ void zoomFit(); + + /** + * Zoom so that the displayed page on the screen has the same size as the real size + * The dpi has to be set correctly + */ void zoom100(); + /** + * @return zoom value depending zoom100Value + */ double getZoom(); /** * Set the current zoom, does not preserve the current page position. * Use startZoomSequence() / zoomSequnceChange() / endZoomSequence() to preserve position + * e.g. use zoomOneStep function + * + * @param zoom zoom value depending zoom100Value */ void setZoom(double zoom); + /** + * Updates the when dpi is changed. + * updates zoomMax, zoomMin, zoomStepBig, zoomStepScroll + * + * @param zoom zoom value depending zoom100Value + */ void setZoom100(double zoom); void setZoomFit(double zoom); @@ -87,12 +125,19 @@ public: Rectangle getVisibleRect(); double getZoomStep(); + double getZoomStepReal(); void setZoomStep(double zoomStep); + double getZoomStepScroll(); + double getZoomStepScrollReal(); + void setZoomStepScroll(double zoomStep); + double getZoomMax(); + double getZoomMaxReal(); void setZoomMax(double zoomMax); double getZoomMin(); + double getZoomMinReal(); void setZoomMin(double zoomMin); protected: @@ -108,15 +153,35 @@ private: std::vector listener; + /** + * current Zoom value + * depends dpi (REAL_PERCENTAGE_VALUE * zoom100Value) + */ double zoom; + /** + * Real current Zoom value + */ + double zoomReal; + /** + * for zoom sequence start zoom value + * depends dpi (REAL_PERCENTAGE_VALUE * zoom100Value) + */ double lastZoomValue; bool zoomFitMode; + /** + * Zoom value for 100% depends on the dpi + */ double zoom100Value; double zoomFitValue; + /** + * Base zoom on start, for relative zoom (Gesture) + */ + double zoomSequenceStart; + /** * Zoom point on widget, will not be zoomed! */ @@ -138,11 +203,45 @@ private: double scrollPositionY; /** - * Base zoom on start, for relative zoom (Gesture) + * Zoomstep value for Ctrl - and Zoom In and Out Button + * depends dpi (REAL_PERCENTAGE_VALUE * zoom100Value) */ - double zoomSequenceStart; - double zoomStep; + /** + * Real zoomstep value for Ctrl + and Zoom In and Out Button + */ + double zoomStepReal; + + /** + * Zoomstep value for Ctrl-Scroll zooming + * depends dpi (REAL_PERCENTAGE_VALUE * zoom100Value) + */ + double zoomStepScroll; + /** + * Real zoomstep value for Ctrl-Scroll zooming + */ + double zoomStepScrollReal; + + + /** + * Zoom maximal value + * depends dpi (REAL_PERCENTAGE_VALUE * zoom100Value) + */ double zoomMax; + /** + * Real zoom maximal value + */ + double zoomMaxReal; + + + /** + * Zoom mininmal value + * depends dpi (REAL_PERCENTAGE_VALUE * zoom100Value) + */ double zoomMin; + /** + * Real zoom mininmal value + * depends dpi (REAL_PERCENTAGE_VALUE * zoom100Value) + */ + double zoomMinReal; }; diff --git a/src/gui/XournalView.cpp b/src/gui/XournalView.cpp index ab610f5d..1b811de8 100644 --- a/src/gui/XournalView.cpp +++ b/src/gui/XournalView.cpp @@ -594,14 +594,14 @@ void XournalView::zoomIn() { XOJ_CHECK_TYPE(XournalView); - control->getZoomControl()->zoomIn(); + control->getZoomControl()->zoomOneStep(ZOOM_IN); } void XournalView::zoomOut() { XOJ_CHECK_TYPE(XournalView); - control->getZoomControl()->zoomOut(); + control->getZoomControl()->zoomOneStep(ZOOM_OUT); } void XournalView::ensureRectIsVisible(int x, int y, int width, int height)