gnome-calendar: Fix week #s in year view

Changed year view to use ISO 8601 standard to display the week #s
correctly when showing first and last weeks.

Year view was always starting week #s as 1, based on Jan 1st, and it
kept count the weeks until Dec 31st. But according to ISO 8601 standard,
that's not always true, i.e. Jan 1st 2016, is still in the 53th week of
2015, while Dec 31st 2014 is already in the 1st week of 2015.

Now the code is using ISO 8601 GDate function to get the correct week
number for the first and the last weeks of the year only. Other weeks
continue to use the same logic.

More about ISO 6801: https://en.wikipedia.org/wiki/ISO_8601#Week_dates

https://bugzilla.gnome.org/show_bug.cgi?id=757622
This commit is contained in:
Isaque Galdino
2016-01-19 18:09:30 -02:00
committed by Georges Basile Stavracas Neto
parent bbf0f10203
commit c4853dd855
+21 -4
View File
@@ -74,7 +74,11 @@ struct _GcalYearViewPrivate
* 0 for Sunday, 1 for Monday and so on */
gint first_weekday;
/**
/* first and last weeks of the year */
guint first_week_of_year;
guint last_week_of_year;
/**
* clock format from GNOME desktop settings
*/
gboolean use_24h_format;
@@ -719,9 +723,15 @@ draw_month_grid (GcalYearView *year_view,
for (i = 0; i < shown_rows; i++)
{
if (i == 0)
/* special condition for first and last weeks of the year */
if (month_nr == 0 && priv->first_week_of_year > 1 && i == 1)
*weeks_counter = 1;
else if (month_nr == 11 && (i + 1) == shown_rows)
*weeks_counter = priv->last_week_of_year;
/* other weeks */
else if (i == 0)
{
if (days_delay == 0)
if (days_delay == 0 && month_nr != 0)
*weeks_counter = *weeks_counter + 1;
}
else
@@ -764,6 +774,7 @@ draw_navigator (GcalYearView *year_view,
gint header_padding_left, header_padding_top, header_height, layout_width, layout_height;
gint real_padding_left, real_padding_top, i, sw, weeks_counter;
gdouble width, height, box_side;
GDate day_of_year;
gchar *header_str;
@@ -815,7 +826,13 @@ draw_navigator (GcalYearView *year_view,
real_padding_top = (height - (7 * 3 * box_side)) / 4.0;
priv->navigator_grid->box_side = box_side;
weeks_counter = 1;
/* get first and last weeks of the year */
g_date_set_dmy (&day_of_year, 1, G_DATE_JANUARY, priv->date->year);
priv->first_week_of_year = g_date_get_iso8601_week_of_year (&day_of_year);
g_date_set_dmy (&day_of_year, 31, G_DATE_DECEMBER, priv->date->year);
priv->last_week_of_year = g_date_get_iso8601_week_of_year (&day_of_year);
weeks_counter = priv->first_week_of_year;
for (i = 0; i < 12; i++)
{
gint row = i / 4;