views/dazzling-month-view: Implement differential date change
Should make the Today button work properly now.
This commit is contained in:
@@ -115,35 +115,6 @@ update_weekday_labels (GcalDazzlingMonthView *self)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
update_week_ranges (GcalDazzlingMonthView *self)
|
|
||||||
{
|
|
||||||
gint n_weeks_before;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The current date corresponds to the week of the first
|
|
||||||
* visible row.
|
|
||||||
*/
|
|
||||||
n_weeks_before = N_ROWS_PER_PAGE * (N_PAGES - 1) / 2;
|
|
||||||
|
|
||||||
for (gint i = 0; i < self->week_rows->len; i++)
|
|
||||||
{
|
|
||||||
g_autoptr (GDateTime) week_start = NULL;
|
|
||||||
g_autoptr (GDateTime) week_end = NULL;
|
|
||||||
g_autoptr (GcalRange) range = NULL;
|
|
||||||
g_autoptr (GDateTime) date = NULL;
|
|
||||||
GcalMonthViewRow *row;
|
|
||||||
|
|
||||||
date = g_date_time_add_weeks (self->date, i - n_weeks_before);
|
|
||||||
week_start = gcal_date_time_get_start_of_week (date);
|
|
||||||
week_end = gcal_date_time_get_end_of_week (date);
|
|
||||||
range = gcal_range_new (week_start, week_end, GCAL_RANGE_DATE_ONLY);
|
|
||||||
|
|
||||||
row = g_ptr_array_index (self->week_rows, i);
|
|
||||||
gcal_month_view_row_set_range (row, range);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
cancel_deceleration (GcalDazzlingMonthView *self)
|
cancel_deceleration (GcalDazzlingMonthView *self)
|
||||||
{
|
{
|
||||||
@@ -259,6 +230,71 @@ dump_row_ranges (GcalDazzlingMonthView *self)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
update_week_ranges (GcalDazzlingMonthView *self,
|
||||||
|
GDateTime *new_date)
|
||||||
|
{
|
||||||
|
g_autoptr (GcalRange) current_range = NULL;
|
||||||
|
g_autoptr (GDateTime) current_date = NULL;
|
||||||
|
gint n_weeks_before;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The current date corresponds to the week of the first
|
||||||
|
* visible row.
|
||||||
|
*/
|
||||||
|
n_weeks_before = N_ROWS_PER_PAGE * (N_PAGES - 1) / 2;
|
||||||
|
|
||||||
|
current_range = gcal_timeline_subscriber_get_range (GCAL_TIMELINE_SUBSCRIBER (self));
|
||||||
|
current_date = g_steal_pointer (&self->date);
|
||||||
|
|
||||||
|
gcal_set_date_time (&self->date, new_date);
|
||||||
|
|
||||||
|
if (gcal_range_contains_datetime (current_range, new_date))
|
||||||
|
{
|
||||||
|
g_autoptr (GcalRange) row_range = NULL;
|
||||||
|
GcalMonthViewRow *row;
|
||||||
|
gint diff;
|
||||||
|
|
||||||
|
diff = g_date_time_compare (new_date, current_date);
|
||||||
|
row = g_ptr_array_index (self->week_rows, n_weeks_before);
|
||||||
|
row_range = gcal_month_view_row_get_range (row);
|
||||||
|
|
||||||
|
while (!gcal_range_contains_datetime (row_range, new_date))
|
||||||
|
{
|
||||||
|
if (diff > 0)
|
||||||
|
move_top_row_to_bottom (self);
|
||||||
|
else
|
||||||
|
move_bottom_row_to_top (self);
|
||||||
|
|
||||||
|
g_clear_pointer (&row_range, gcal_range_unref);
|
||||||
|
|
||||||
|
row = g_ptr_array_index (self->week_rows, n_weeks_before);
|
||||||
|
row_range = gcal_month_view_row_get_range (row);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (gint i = 0; i < self->week_rows->len; i++)
|
||||||
|
{
|
||||||
|
g_autoptr (GDateTime) week_start = NULL;
|
||||||
|
g_autoptr (GDateTime) week_end = NULL;
|
||||||
|
g_autoptr (GcalRange) range = NULL;
|
||||||
|
g_autoptr (GDateTime) date = NULL;
|
||||||
|
GcalMonthViewRow *row;
|
||||||
|
|
||||||
|
date = g_date_time_add_weeks (self->date, i - n_weeks_before);
|
||||||
|
week_start = gcal_date_time_get_start_of_week (date);
|
||||||
|
week_end = gcal_date_time_get_end_of_week (date);
|
||||||
|
range = gcal_range_new (week_start, week_end, GCAL_RANGE_DATE_ONLY);
|
||||||
|
|
||||||
|
row = g_ptr_array_index (self->week_rows, i);
|
||||||
|
gcal_month_view_row_set_range (row, range);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dump_row_ranges (self);
|
||||||
|
}
|
||||||
|
|
||||||
static inline gint
|
static inline gint
|
||||||
get_grid_height (GcalDazzlingMonthView *self)
|
get_grid_height (GcalDazzlingMonthView *self)
|
||||||
{
|
{
|
||||||
@@ -699,8 +735,6 @@ gcal_dazzling_month_view_set_date (GcalView *view,
|
|||||||
g_date_time_get_month (self->date) != g_date_time_get_month (date) ||
|
g_date_time_get_month (self->date) != g_date_time_get_month (date) ||
|
||||||
g_date_time_get_year (self->date) != g_date_time_get_year (date);
|
g_date_time_get_year (self->date) != g_date_time_get_year (date);
|
||||||
|
|
||||||
gcal_set_date_time (&self->date, date);
|
|
||||||
|
|
||||||
if (!month_changed)
|
if (!month_changed)
|
||||||
GCAL_RETURN ();
|
GCAL_RETURN ();
|
||||||
|
|
||||||
@@ -711,8 +745,8 @@ gcal_dazzling_month_view_set_date (GcalView *view,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
update_week_ranges (self, date);
|
||||||
update_header_labels (self);
|
update_header_labels (self);
|
||||||
update_week_ranges (self);
|
|
||||||
|
|
||||||
gcal_timeline_subscriber_range_changed (GCAL_TIMELINE_SUBSCRIBER (view));
|
gcal_timeline_subscriber_range_changed (GCAL_TIMELINE_SUBSCRIBER (view));
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user