diff --git a/src/gui/toolbarMenubar/ToolZoomSlider.cpp b/src/gui/toolbarMenubar/ToolZoomSlider.cpp index c6abd2d2..97956a9a 100644 --- a/src/gui/toolbarMenubar/ToolZoomSlider.cpp +++ b/src/gui/toolbarMenubar/ToolZoomSlider.cpp @@ -25,25 +25,26 @@ void ToolZoomSlider::sliderChanged(GtkRange* range, ToolZoomSlider* self) { XOJ_CHECK_TYPE_OBJ(self, ToolZoomSlider); - if (self->ignoreChange || !self->sliderChangingByUser) + if (!self->sliderChangingByZoomControlOrInit && + (self->sliderChangingBySliderDrag || + self->sliderChangingBySliderHoverScroll)) { - return; + double back = self->zoom->getZoom100Value() * scaleFuncInv(gtk_range_get_value(range)); + self->zoom->zoomSequnceChange(back, false); } - - double back = self->zoom->getZoom100Value() * scaleFuncInv(gtk_range_get_value(range)); - self->zoom->zoomSequnceChange(back, false); + self->sliderChangingBySliderHoverScroll = false; } bool ToolZoomSlider::sliderButtonPress(GtkRange* range, GdkEvent *event, ToolZoomSlider* self) { XOJ_CHECK_TYPE_OBJ(self, ToolZoomSlider); - if(!self->sliderChangingByUser) + if(!self->sliderChangingBySliderDrag) { - self->sliderChangingByUser = true; self->zoom->setZoomFitMode(false); self->zoom->startZoomSequence(-1, -1); } + self->sliderChangingBySliderDrag = true; return false; } @@ -51,14 +52,29 @@ bool ToolZoomSlider::sliderButtonRelease(GtkRange* range, GdkEvent *event, ToolZ { XOJ_CHECK_TYPE_OBJ(self, ToolZoomSlider); - if(self->sliderChangingByUser) + if(self->sliderChangingBySliderDrag) { + self->sliderChangingBySliderDrag = false; self->zoom->endZoomSequence(); - self->sliderChangingByUser = false; } return false; } +bool ToolZoomSlider::sliderHoverScroll(GtkWidget* range, GdkEventScroll* event, ToolZoomSlider* self) +{ + XOJ_CHECK_TYPE_OBJ(self, ToolZoomSlider); + + gint64 now = g_get_monotonic_time(); + if (now > self->sliderHoverScrollLastTime + 500) + { + self->zoom->setZoomFitMode(false); + self->zoom->startZoomSequence(-1, -1); + } + self->sliderChangingBySliderHoverScroll = true; + self->sliderHoverScrollLastTime = now; + return false; +} + gchar* ToolZoomSlider::sliderFormatValue(GtkRange *range, gdouble value, ToolZoomSlider* self) { return g_strdup_printf("%d%%", (int) (100 * scaleFuncInv(value))); @@ -68,15 +84,15 @@ void ToolZoomSlider::zoomChanged() { XOJ_CHECK_TYPE(ToolZoomSlider); - if (this->slider == NULL || this->sliderChangingByUser) + if (this->slider == NULL || this->sliderChangingBySliderDrag) { return; } - this->ignoreChange = true; + this->sliderChangingByZoomControlOrInit = true; double slider_range = scaleFunc(this->zoom->getZoomReal()); gtk_range_set_value(GTK_RANGE(this->slider), slider_range); - this->ignoreChange = false; + this->sliderChangingByZoomControlOrInit = false; } void ToolZoomSlider::zoomRangeValuesChanged() @@ -176,6 +192,8 @@ GtkToolItem* ToolZoomSlider::newItem() g_signal_handlers_disconnect_by_func(this->slider, (void* )(sliderChanged), this); g_signal_handlers_disconnect_by_func(this->slider, (void* )(sliderButtonPress), this); g_signal_handlers_disconnect_by_func(this->slider, (void* )(sliderButtonRelease), this); + g_signal_handlers_disconnect_by_func(this->slider, (void* )(sliderHoverScroll), this); + g_signal_handlers_disconnect_by_func(this->slider, (void* )(sliderFormatValue), this); } double sliderMin = scaleFunc(DEFAULT_ZOOM_MIN); @@ -196,6 +214,7 @@ GtkToolItem* ToolZoomSlider::newItem() g_signal_connect(this->slider, "value-changed", G_CALLBACK(sliderChanged), this); g_signal_connect(this->slider, "button-press-event", G_CALLBACK(sliderButtonPress), this); g_signal_connect(this->slider, "button-release-event", G_CALLBACK(sliderButtonRelease), this); + g_signal_connect(this->slider, "scroll-event", G_CALLBACK(sliderHoverScroll), this); g_signal_connect(this->slider, "format-value", G_CALLBACK(sliderFormatValue), this); gtk_scale_set_draw_value(GTK_SCALE(this->slider), true); @@ -212,10 +231,10 @@ GtkToolItem* ToolZoomSlider::newItem() gtk_container_add(GTK_CONTAINER(it), this->slider); - ignoreChange = true; + sliderChangingByZoomControlOrInit = true; double slider_range = scaleFunc(this->zoom->getZoomReal()); gtk_range_set_value(GTK_RANGE(this->slider), slider_range); - ignoreChange = false; + sliderChangingByZoomControlOrInit = false; updateScaleMarks(); diff --git a/src/gui/toolbarMenubar/ToolZoomSlider.h b/src/gui/toolbarMenubar/ToolZoomSlider.h index df6c878c..33996c62 100644 --- a/src/gui/toolbarMenubar/ToolZoomSlider.h +++ b/src/gui/toolbarMenubar/ToolZoomSlider.h @@ -30,6 +30,7 @@ public: static void sliderChanged(GtkRange* range, ToolZoomSlider* self); static bool sliderButtonPress(GtkRange* range, GdkEvent *event, ToolZoomSlider* self); static bool sliderButtonRelease(GtkRange* range, GdkEvent *event, ToolZoomSlider* self); + static bool sliderHoverScroll(GtkWidget* range, GdkEventScroll* event, ToolZoomSlider* self); static gchar* sliderFormatValue(GtkRange *range, gdouble value, ToolZoomSlider* self); virtual void zoomChanged(); @@ -53,12 +54,15 @@ private: private: XOJ_TYPE_ATTRIB; - bool ignoreChange = false; /** * The slider is currently changing by user, do not update value */ - bool sliderChangingByUser = false; + bool sliderChangingByZoomControlOrInit = false; + bool sliderChangingBySliderDrag = false; + bool sliderChangingBySliderHoverScroll = false; + gint64 sliderHoverScrollLastTime = 0; + GtkWidget* slider = NULL; ZoomControl* zoom = NULL; bool horizontal = true;