week-view: Allow zooming with Ctrl+Scroll
So it's possible to zoom even if the device doesn't support pinching to do so.
This commit is contained in:
@@ -55,6 +55,10 @@ struct _GcalWeekView
|
|||||||
|
|
||||||
gdouble gesture_zoom_center;
|
gdouble gesture_zoom_center;
|
||||||
gint gesture_zoom_initial_height;
|
gint gesture_zoom_initial_height;
|
||||||
|
|
||||||
|
gboolean pointer_position_valid;
|
||||||
|
gdouble pointer_position_y;
|
||||||
|
gdouble scroll_scale;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void schedule_position_scroll (GcalWeekView *self);
|
static void schedule_position_scroll (GcalWeekView *self);
|
||||||
@@ -127,6 +131,73 @@ apply_zoom (GcalWeekView *self,
|
|||||||
gtk_adjustment_set_value (vadjustment, (self->gesture_zoom_center * height) - view_center_y);
|
gtk_adjustment_set_value (vadjustment, (self->gesture_zoom_center * height) - view_center_y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
on_motion_controller_enter_cb (GcalWeekView *self,
|
||||||
|
gdouble x,
|
||||||
|
gdouble y,
|
||||||
|
GtkEventControllerMotion *controller)
|
||||||
|
{
|
||||||
|
self->pointer_position_valid = TRUE;
|
||||||
|
self->pointer_position_y = y;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
on_motion_controller_motion_cb (GcalWeekView *self,
|
||||||
|
gdouble x,
|
||||||
|
gdouble y,
|
||||||
|
GtkEventControllerMotion *controller)
|
||||||
|
{
|
||||||
|
self->pointer_position_valid = TRUE;
|
||||||
|
self->pointer_position_y = y;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
on_motion_controller_leave_cb (GcalWeekView *self,
|
||||||
|
GtkEventControllerMotion *controller)
|
||||||
|
{
|
||||||
|
self->pointer_position_valid = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
on_scroll_controller_scroll_begin_cb (GcalWeekView *self,
|
||||||
|
GtkEventControllerScroll *controller)
|
||||||
|
{
|
||||||
|
gdouble view_center_y;
|
||||||
|
|
||||||
|
self->scroll_scale = 1.0;
|
||||||
|
|
||||||
|
if (self->pointer_position_valid)
|
||||||
|
view_center_y = self->pointer_position_y;
|
||||||
|
else
|
||||||
|
view_center_y = gtk_widget_get_allocated_height (self->scrolled_window) / 2.0;
|
||||||
|
|
||||||
|
begin_zoom (self, view_center_y);
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
on_scroll_controller_scroll_cb (GcalWeekView *self,
|
||||||
|
gdouble dx,
|
||||||
|
gdouble dy,
|
||||||
|
GtkEventControllerScroll *controller)
|
||||||
|
{
|
||||||
|
gdouble scale, view_center_y;
|
||||||
|
|
||||||
|
if (!(gtk_event_controller_get_current_event_state (GTK_EVENT_CONTROLLER (controller)) & GDK_CONTROL_MASK))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
scale = dy / 100.0 + self->scroll_scale;
|
||||||
|
|
||||||
|
if (self->pointer_position_valid)
|
||||||
|
view_center_y = self->pointer_position_y;
|
||||||
|
else
|
||||||
|
view_center_y = gtk_widget_get_allocated_height (self->scrolled_window) / 2.0;
|
||||||
|
|
||||||
|
begin_zoom (self, view_center_y);
|
||||||
|
apply_zoom (self, view_center_y, scale);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
on_zoom_gesture_scale_changed_cb (GcalWeekView *self,
|
on_zoom_gesture_scale_changed_cb (GcalWeekView *self,
|
||||||
gdouble scale,
|
gdouble scale,
|
||||||
@@ -501,6 +572,11 @@ gcal_week_view_class_init (GcalWeekViewClass *klass)
|
|||||||
gtk_widget_class_bind_template_child (widget_class, GcalWeekView, week_grid);
|
gtk_widget_class_bind_template_child (widget_class, GcalWeekView, week_grid);
|
||||||
|
|
||||||
gtk_widget_class_bind_template_callback (widget_class, on_event_activated);
|
gtk_widget_class_bind_template_callback (widget_class, on_event_activated);
|
||||||
|
gtk_widget_class_bind_template_callback (widget_class, on_motion_controller_enter_cb);
|
||||||
|
gtk_widget_class_bind_template_callback (widget_class, on_motion_controller_motion_cb);
|
||||||
|
gtk_widget_class_bind_template_callback (widget_class, on_motion_controller_leave_cb);
|
||||||
|
gtk_widget_class_bind_template_callback (widget_class, on_scroll_controller_scroll_begin_cb);
|
||||||
|
gtk_widget_class_bind_template_callback (widget_class, on_scroll_controller_scroll_cb);
|
||||||
gtk_widget_class_bind_template_callback (widget_class, on_zoom_gesture_scale_changed_cb);
|
gtk_widget_class_bind_template_callback (widget_class, on_zoom_gesture_scale_changed_cb);
|
||||||
gtk_widget_class_bind_template_callback (widget_class, on_zoom_gesture_begin_cb);
|
gtk_widget_class_bind_template_callback (widget_class, on_zoom_gesture_begin_cb);
|
||||||
|
|
||||||
|
|||||||
@@ -23,6 +23,26 @@
|
|||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
|
|
||||||
|
<!-- Scroll Event Controller -->
|
||||||
|
<child>
|
||||||
|
<object class="GtkEventControllerScroll">
|
||||||
|
<property name="propagation-phase">capture</property>
|
||||||
|
<property name="flags">vertical|kinetic</property>
|
||||||
|
<signal name="scroll" handler="on_scroll_controller_scroll_begin_cb" object="GcalWeekView" swapped="yes" />
|
||||||
|
<signal name="scroll" handler="on_scroll_controller_scroll_cb" object="GcalWeekView" swapped="yes" />
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
|
||||||
|
<!-- Motion Event Controller -->
|
||||||
|
<child>
|
||||||
|
<object class="GtkEventControllerMotion">
|
||||||
|
<property name="propagation-phase">capture</property>
|
||||||
|
<signal name="enter" handler="on_motion_controller_enter_cb" object="GcalWeekView" swapped="yes" />
|
||||||
|
<signal name="motion" handler="on_motion_controller_motion_cb" object="GcalWeekView" swapped="yes" />
|
||||||
|
<signal name="leave" handler="on_motion_controller_leave_cb" object="GcalWeekView" swapped="yes" />
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkViewport">
|
<object class="GtkViewport">
|
||||||
<child>
|
<child>
|
||||||
|
|||||||
Reference in New Issue
Block a user