week-view: Add a zoom gesture

This will help the week view work well on small touchscreens and it also
works with touchpads.
This commit is contained in:
Adrien Plazas
2022-06-22 12:04:21 +00:00
committed by Georges Basile Stavracas Neto
parent 0bd11799dc
commit f0021fcffb
2 changed files with 66 additions and 2 deletions
+56
View File
@@ -38,6 +38,7 @@ struct _GcalWeekView
{
GtkBox parent;
GtkWidget *content;
GtkWidget *header;
GcalWeekHourBar *hours_bar;
GtkWidget *scrolled_window;
@@ -51,6 +52,9 @@ struct _GcalWeekView
gulong stack_page_changed_id;
gint clicked_cell;
gdouble gesture_zoom_center;
gint gesture_zoom_initial_height;
};
static void schedule_position_scroll (GcalWeekView *self);
@@ -73,6 +77,13 @@ G_DEFINE_TYPE_WITH_CODE (GcalWeekView, gcal_week_view, GTK_TYPE_BOX,
G_IMPLEMENT_INTERFACE (GCAL_TYPE_TIMELINE_SUBSCRIBER,
gcal_timeline_subscriber_interface_init));
/* 60px * ⅓ * 48 rows + 1px * 47 lines = 1007px */
#define HEIGHT_MIN 1007
/* 60px * 1 * 48 rows + 1px * 47 lines = 2927px */
#define HEIGHT_DEFAULT 2927
/* 60px * 3 * 48 rows + 1px * 47 lines = 8687px */
#define HEIGHT_MAX 8687
/* Callbacks */
static void
on_event_activated (GcalWeekView *self,
@@ -81,6 +92,46 @@ on_event_activated (GcalWeekView *self,
g_signal_emit_by_name (self, "event-activated", widget);
}
static void
on_zoom_gesture_scale_changed_cb (GcalWeekView *self,
gdouble scale,
GtkGestureZoom *gesture)
{
GtkAdjustment *vadjustment;
gdouble view_center_x, view_center_y;
gdouble height;
gtk_gesture_get_bounding_box_center (GTK_GESTURE (gesture), &view_center_x, &view_center_y);
vadjustment = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (self->scrolled_window));
height = self->gesture_zoom_initial_height * scale;
height = CLAMP (height, HEIGHT_MIN, HEIGHT_MAX);
gtk_widget_set_size_request (self->content, -1, height);
gtk_adjustment_set_lower (vadjustment, 0);
gtk_adjustment_set_upper (vadjustment, height);
gtk_adjustment_set_value (vadjustment, (self->gesture_zoom_center * height) - view_center_y);
}
static void
on_zoom_gesture_begin_cb (GcalWeekView *self,
GdkEventSequence *sequence,
GtkGesture *gesture)
{
GtkAdjustment *vadjustment;
gdouble view_center_x, view_center_y;
gdouble center, height;
gtk_gesture_get_bounding_box_center (gesture, &view_center_x, &view_center_y);
vadjustment = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (self->scrolled_window));
center = gtk_adjustment_get_value (vadjustment) + view_center_y - gtk_adjustment_get_lower (vadjustment);
height = gtk_adjustment_get_upper (vadjustment) - gtk_adjustment_get_lower (vadjustment);
self->gesture_zoom_center = center / height;
self->gesture_zoom_initial_height = gtk_widget_get_allocated_height (self->content);
}
static void
stack_visible_child_changed_cb (AdwViewStack *stack,
GParamSpec *pspec,
@@ -424,12 +475,15 @@ gcal_week_view_class_init (GcalWeekViewClass *klass)
gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/calendar/ui/views/gcal-week-view.ui");
gtk_widget_class_bind_template_child (widget_class, GcalWeekView, content);
gtk_widget_class_bind_template_child (widget_class, GcalWeekView, header);
gtk_widget_class_bind_template_child (widget_class, GcalWeekView, hours_bar);
gtk_widget_class_bind_template_child (widget_class, GcalWeekView, scrolled_window);
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_zoom_gesture_scale_changed_cb);
gtk_widget_class_bind_template_callback (widget_class, on_zoom_gesture_begin_cb);
gtk_widget_class_set_css_name (widget_class, "calendar-view");
}
@@ -441,6 +495,8 @@ gcal_week_view_init (GcalWeekView *self)
gtk_widget_init_template (GTK_WIDGET (self));
gtk_widget_set_size_request (self->content, -1, HEIGHT_DEFAULT);
size_group = gcal_week_header_get_sidebar_size_group (GCAL_WEEK_HEADER (self->header));
gtk_size_group_add_widget (size_group, GTK_WIDGET (self->hours_bar));
}
+10 -2
View File
@@ -14,14 +14,22 @@
<object class="GtkScrolledWindow" id="scrolled_window">
<property name="hexpand">True</property>
<property name="vexpand">True</property>
<!-- Zoom Gesture -->
<child>
<object class="GtkGestureZoom">
<signal name="scale-changed" handler="on_zoom_gesture_scale_changed_cb" object="GcalWeekView" swapped="yes" />
<signal name="begin" handler="on_zoom_gesture_begin_cb" object="GcalWeekView" swapped="yes" />
</object>
</child>
<child>
<object class="GtkViewport">
<child>
<object class="GtkBox">
<object class="GtkBox" id="content">
<property name="orientation">horizontal</property>
<child>
<object class="GcalWeekHourBar" id="hours_bar">
<property name="height-request">2568</property>
</object>
</child>
<child>