week-view: smoothly scroll the grid when moving to today
This commit is contained in:
@@ -68,6 +68,8 @@ struct _GcalWeekView
|
|||||||
icaltimetype *current_date;
|
icaltimetype *current_date;
|
||||||
GcalManager *manager; /* weak referenced */
|
GcalManager *manager; /* weak referenced */
|
||||||
|
|
||||||
|
guint scroll_grid_timeout_id;
|
||||||
|
|
||||||
gint clicked_cell;
|
gint clicked_cell;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -132,24 +134,27 @@ on_event_activated (GcalWeekView *self,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Auxiliary methods */
|
/* Auxiliary methods */
|
||||||
static void
|
static gboolean
|
||||||
update_grid_scroll_position (GcalWeekView *self)
|
update_grid_scroll_position (GcalWeekView *self)
|
||||||
{
|
{
|
||||||
g_autoptr(GDateTime) now, week_start, week_end;
|
g_autoptr(GDateTime) week_start = NULL;
|
||||||
|
g_autoptr(GDateTime) week_end = NULL;
|
||||||
|
g_autoptr(GDateTime) now = NULL;
|
||||||
GtkAdjustment *vadjustment;
|
GtkAdjustment *vadjustment;
|
||||||
gdouble minutes, real_value;
|
gdouble minutes, real_value;
|
||||||
gdouble max, page, page_increment, value;
|
gdouble max, page, page_increment, value;
|
||||||
|
|
||||||
|
/* While the scrolled window is not mapped, we keep waiting */
|
||||||
|
if (!gtk_widget_get_mapped (self->scrolled_window))
|
||||||
|
return G_SOURCE_CONTINUE;
|
||||||
|
|
||||||
now = g_date_time_new_now_local ();
|
now = g_date_time_new_now_local ();
|
||||||
week_start = get_start_of_week (self->date);
|
week_start = get_start_of_week (self->date);
|
||||||
week_end = get_end_of_week (self->date);
|
week_end = get_end_of_week (self->date);
|
||||||
|
|
||||||
/* Don't animate when not today */
|
/* Don't animate when not today */
|
||||||
if (datetime_compare_date (now, week_start) < 0 || datetime_compare_date (now, week_end) >= 0)
|
if (datetime_compare_date (now, week_start) < 0 || datetime_compare_date (now, week_end) >= 0)
|
||||||
return;
|
goto out;
|
||||||
|
|
||||||
if (!gtk_widget_get_mapped (self->scrolled_window))
|
|
||||||
return;
|
|
||||||
|
|
||||||
vadjustment = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (self->scrolled_window));
|
vadjustment = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (self->scrolled_window));
|
||||||
minutes = g_date_time_get_hour (now) * 60 + g_date_time_get_minute (now);
|
minutes = g_date_time_get_hour (now) * 60 + g_date_time_get_minute (now);
|
||||||
@@ -168,6 +173,22 @@ update_grid_scroll_position (GcalWeekView *self)
|
|||||||
FALSE);
|
FALSE);
|
||||||
|
|
||||||
gtk_adjustment_set_page_increment (vadjustment, page_increment);
|
gtk_adjustment_set_page_increment (vadjustment, page_increment);
|
||||||
|
|
||||||
|
out:
|
||||||
|
self->scroll_grid_timeout_id = 0;
|
||||||
|
return G_SOURCE_REMOVE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
schedule_position_scroll (GcalWeekView *self)
|
||||||
|
{
|
||||||
|
/* Nothing is scheduled, we should do it now */
|
||||||
|
if (self->scroll_grid_timeout_id > 0)
|
||||||
|
g_source_remove (self->scroll_grid_timeout_id);
|
||||||
|
|
||||||
|
self->scroll_grid_timeout_id = g_timeout_add (200,
|
||||||
|
(GSourceFunc) update_grid_scroll_position,
|
||||||
|
self);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -556,7 +577,7 @@ gcal_week_view_set_property (GObject *object,
|
|||||||
g_clear_pointer (&self->date, g_free);
|
g_clear_pointer (&self->date, g_free);
|
||||||
self->date = g_value_dup_boxed (value);
|
self->date = g_value_dup_boxed (value);
|
||||||
|
|
||||||
update_grid_scroll_position (self);
|
schedule_position_scroll (self);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user