views/week: Special case discrete events
They behave slightly differently from smooth scroll events, and they don't emit 'scroll-begin' nor 'scroll-end', so we have to execute that the callbacks of these signals do inside the scroll callback itself.
This commit is contained in:
@@ -289,21 +289,48 @@ on_scroll_controller_scroll_cb (GtkEventControllerScroll *controller,
|
|||||||
gdouble dy,
|
gdouble dy,
|
||||||
GcalWeekView *self)
|
GcalWeekView *self)
|
||||||
{
|
{
|
||||||
gdouble scale, view_center_y;
|
GdkEvent *event;
|
||||||
|
gboolean discrete;
|
||||||
|
gdouble view_center_y;
|
||||||
|
gdouble scale;
|
||||||
|
|
||||||
if (!(gtk_event_controller_get_current_event_state (GTK_EVENT_CONTROLLER (controller)) & GDK_CONTROL_MASK))
|
if (!(gtk_event_controller_get_current_event_state (GTK_EVENT_CONTROLLER (controller)) & GDK_CONTROL_MASK))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
scale = dy / 100.0 + self->scroll_scale;
|
event = gtk_event_controller_get_current_event (GTK_EVENT_CONTROLLER (controller));
|
||||||
|
|
||||||
|
switch (gdk_scroll_event_get_direction (event))
|
||||||
|
{
|
||||||
|
case GDK_SCROLL_SMOOTH:
|
||||||
|
scale = dy / 100.0 + 1.0;
|
||||||
|
discrete = FALSE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GDK_SCROLL_UP:
|
||||||
|
case GDK_SCROLL_DOWN:
|
||||||
|
scale = dy / 10.0 + 1.0;
|
||||||
|
discrete = TRUE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GDK_SCROLL_LEFT:
|
||||||
|
case GDK_SCROLL_RIGHT:
|
||||||
|
default:
|
||||||
|
g_assert_not_reached ();
|
||||||
|
}
|
||||||
|
|
||||||
if (self->pointer_position_valid)
|
if (self->pointer_position_valid)
|
||||||
view_center_y = self->pointer_position_y;
|
view_center_y = self->pointer_position_y;
|
||||||
else
|
else
|
||||||
view_center_y = gtk_widget_get_allocated_height (self->scrolled_window) / 2.0;
|
view_center_y = gtk_widget_get_allocated_height (self->scrolled_window) / 2.0;
|
||||||
|
|
||||||
begin_zoom (self, view_center_y);
|
if (discrete)
|
||||||
|
begin_zoom (self, view_center_y);
|
||||||
|
|
||||||
apply_zoom (self, view_center_y, scale);
|
apply_zoom (self, view_center_y, scale);
|
||||||
|
|
||||||
|
if (discrete)
|
||||||
|
save_zoom_level (self);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user