calendar: Set marked days immediately
authorCorey Berla <corey@berla.me>
Sat, 7 Jan 2023 04:18:53 +0000 (20:18 -0800)
committerCorey Berla <corey@berla.me>
Sat, 7 Jan 2023 04:37:54 +0000 (20:37 -0800)
The marked days are set only as part of gtk_calendar_select_day().
This is insufficient, especially because the day-selected signal
is emitted after the marked days are set in gtk_calendar_select_day().

gtk/gtkcalendar.c

index c671fb118585e22fd7fe2275c681c4aff3ef0188..7a619cfa85d6a13c5764ed4936576f757eae93ae 100644 (file)
@@ -1525,6 +1525,14 @@ gtk_calendar_clear_marks (GtkCalendar *calendar)
 
   g_return_if_fail (GTK_IS_CALENDAR (calendar));
 
+  for (int y = 0; y < 6; y ++)
+    for (int x = 0; x < 7; x ++)
+      {
+        GtkWidget *label = calendar->day_number_labels[y][x];
+
+        gtk_widget_unset_state_flags (label, GTK_STATE_FLAG_CHECKED);
+      }
+
   for (day = 0; day < 31; day++)
     {
       calendar->marked_date[day] = FALSE;
@@ -1534,6 +1542,27 @@ gtk_calendar_clear_marks (GtkCalendar *calendar)
   calendar_queue_refresh (calendar);
 }
 
+static void
+update_mark_state (GtkCalendar *calendar,
+                   guint        day,
+                   gboolean     mark)
+{
+  for (int y = 0; y < 6; y ++)
+    for (int x = 0; x < 7; x ++)
+      {
+        GtkWidget *label = calendar->day_number_labels[y][x];
+
+        if (day != calendar->day[y][x])
+          continue;
+
+        if (mark && calendar->marked_date[day-1] &&
+            calendar->day_month[y][x] == MONTH_CURRENT)
+          gtk_widget_set_state_flags (label, GTK_STATE_FLAG_CHECKED, FALSE);
+        else
+          gtk_widget_unset_state_flags (label, GTK_STATE_FLAG_CHECKED);
+      }
+}
+
 /**
  * gtk_calendar_mark_day:
  * @calendar: a `GtkCalendar`
@@ -1551,6 +1580,7 @@ gtk_calendar_mark_day (GtkCalendar *calendar,
     {
       calendar->marked_date[day - 1] = TRUE;
       calendar->num_marked_dates++;
+      update_mark_state (calendar, day, TRUE);
       calendar_invalidate_day_num (calendar, day);
     }
 }
@@ -1593,6 +1623,7 @@ gtk_calendar_unmark_day (GtkCalendar *calendar,
     {
       calendar->marked_date[day - 1] = FALSE;
       calendar->num_marked_dates--;
+      update_mark_state (calendar, day, FALSE);
       calendar_invalidate_day_num (calendar, day);
     }
 }