views/dazzling-month-view: Implement differential date change

Should make the Today button work properly now.
This commit is contained in:
Georges Basile Stavracas Neto
2023-08-11 15:13:44 -03:00
parent 1c307de688
commit 66cb36e855
+66 -32
View File
@@ -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
cancel_deceleration (GcalDazzlingMonthView *self)
{
@@ -259,6 +230,71 @@ dump_row_ranges (GcalDazzlingMonthView *self)
#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
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_year (self->date) != g_date_time_get_year (date);
gcal_set_date_time (&self->date, date);
if (!month_changed)
GCAL_RETURN ();
@@ -711,8 +745,8 @@ gcal_dazzling_month_view_set_date (GcalView *view,
}
#endif
update_week_ranges (self, date);
update_header_labels (self);
update_week_ranges (self);
gcal_timeline_subscriber_range_changed (GCAL_TIMELINE_SUBSCRIBER (view));