week-view: center grid on date change
This commit is contained in:
@@ -14,7 +14,7 @@
|
|||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkScrolledWindow">
|
<object class="GtkScrolledWindow" id="scrolled_window">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="hexpand">True</property>
|
<property name="hexpand">True</property>
|
||||||
<property name="vexpand">True</property>
|
<property name="vexpand">True</property>
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ struct _GcalWeekView
|
|||||||
|
|
||||||
GtkWidget *header;
|
GtkWidget *header;
|
||||||
GtkWidget *hours_bar;
|
GtkWidget *hours_bar;
|
||||||
|
GtkWidget *scrolled_window;
|
||||||
GtkWidget *week_grid;
|
GtkWidget *week_grid;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -130,6 +131,42 @@ on_event_activated (GcalWeekView *self,
|
|||||||
g_signal_emit (self, signals[EVENT_ACTIVATED], 0, widget);
|
g_signal_emit (self, signals[EVENT_ACTIVATED], 0, widget);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Auxiliary methods */
|
||||||
|
static void
|
||||||
|
update_grid_scroll_position (GcalWeekView *self)
|
||||||
|
{
|
||||||
|
g_autoptr(GDateTime) now, week_start, week_end;
|
||||||
|
GtkAdjustment *vadjustment;
|
||||||
|
gdouble minutes, real_value;
|
||||||
|
gdouble max, page, page_increment, value;
|
||||||
|
|
||||||
|
now = g_date_time_new_now_local ();
|
||||||
|
week_start = get_start_of_week (self->date);
|
||||||
|
week_end = get_end_of_week (self->date);
|
||||||
|
|
||||||
|
/* Don't animate when not today */
|
||||||
|
if (datetime_compare_date (now, week_start) < 0 || datetime_compare_date (now, week_end) >= 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
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);
|
||||||
|
page = gtk_adjustment_get_page_size (vadjustment);
|
||||||
|
max = gtk_adjustment_get_upper (vadjustment);
|
||||||
|
|
||||||
|
real_value = max / MINUTES_PER_DAY * minutes - (page / 2.0);
|
||||||
|
page_increment = gtk_adjustment_get_page_increment (vadjustment);
|
||||||
|
value = gtk_adjustment_get_value (vadjustment);
|
||||||
|
|
||||||
|
gtk_adjustment_set_page_increment (vadjustment, real_value - value);
|
||||||
|
|
||||||
|
g_signal_emit_by_name (self->scrolled_window,
|
||||||
|
"scroll-child",
|
||||||
|
GTK_SCROLL_PAGE_FORWARD,
|
||||||
|
FALSE);
|
||||||
|
|
||||||
|
gtk_adjustment_set_page_increment (vadjustment, page_increment);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gcal_week_view_get_initial_date:
|
* gcal_week_view_get_initial_date:
|
||||||
*
|
*
|
||||||
@@ -431,6 +468,7 @@ gcal_week_view_class_init (GcalWeekViewClass *klass)
|
|||||||
|
|
||||||
gtk_widget_class_bind_template_child (widget_class, GcalWeekView, header);
|
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, 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_child (widget_class, GcalWeekView, week_grid);
|
||||||
|
|
||||||
gtk_widget_class_bind_template_callback (widget_class, gcal_week_view_draw_hours);
|
gtk_widget_class_bind_template_callback (widget_class, gcal_week_view_draw_hours);
|
||||||
@@ -495,6 +533,9 @@ gcal_week_view_set_property (GObject *object,
|
|||||||
case PROP_DATE:
|
case PROP_DATE:
|
||||||
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);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|||||||
Reference in New Issue
Block a user