[evolution] I#1917 - Calendar: Add option to change 'today' background color



commit 18a6e47fe7eaa7210b6edb2117a504a2d0ee882a
Author: Milan Crha <mcrha redhat com>
Date:   Thu May 26 09:29:33 2022 +0200

    I#1917 - Calendar: Add option to change 'today' background color
    
    Closes https://gitlab.gnome.org/GNOME/evolution/-/issues/1917

 data/org.gnome.evolution.calendar.gschema.xml.in |  5 ++
 src/calendar/gui/e-day-view.c                    | 76 ++++++++++++++++++++++--
 src/calendar/gui/e-day-view.h                    |  5 ++
 src/calendar/gui/e-week-view.c                   | 69 ++++++++++++++++++++-
 src/calendar/gui/e-week-view.h                   |  5 ++
 src/modules/settings/e-settings-calendar-view.c  | 10 ++++
 6 files changed, 163 insertions(+), 7 deletions(-)
---
diff --git a/data/org.gnome.evolution.calendar.gschema.xml.in 
b/data/org.gnome.evolution.calendar.gschema.xml.in
index b4142699b4..01f61f2992 100644
--- a/data/org.gnome.evolution.calendar.gschema.xml.in
+++ b/data/org.gnome.evolution.calendar.gschema.xml.in
@@ -509,6 +509,11 @@
       <_summary>Shorten event end time by minutes</_summary>
       <_description>By how many minutes to shorted new event end time</_description>
     </key>
+    <key name="today-background-color" type="s">
+      <default>''</default>
+      <_summary>Background color for the 'today' day</_summary>
+      <_description>Leave empty to use a yellow color derived from the current theme, otherwise use the 
color of form `#RRGGBB`</_description>
+    </key>
 
     <!-- The following keys are deprecated. -->
 
diff --git a/src/calendar/gui/e-day-view.c b/src/calendar/gui/e-day-view.c
index 7550dec93a..d838a0ba38 100644
--- a/src/calendar/gui/e-day-view.c
+++ b/src/calendar/gui/e-day-view.c
@@ -171,6 +171,8 @@ struct _EDayViewPrivate {
 
        GdkDragContext *drag_context;
 
+       gchar *today_background_color;
+
        gboolean draw_flat_events;
 };
 
@@ -493,6 +495,7 @@ enum {
        PROP_MARCUS_BAINS_SHOW_LINE,
        PROP_MARCUS_BAINS_DAY_VIEW_COLOR,
        PROP_MARCUS_BAINS_TIME_BAR_COLOR,
+       PROP_TODAY_BACKGROUND_COLOR,
        PROP_IS_EDITING
 };
 
@@ -922,6 +925,12 @@ day_view_set_property (GObject *object,
                                E_DAY_VIEW (object),
                                g_value_get_string (value));
                        return;
+
+               case PROP_TODAY_BACKGROUND_COLOR:
+                       e_day_view_set_today_background_color (
+                               E_DAY_VIEW (object),
+                               g_value_get_string (value));
+                       return;
        }
 
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -962,6 +971,13 @@ day_view_get_property (GObject *object,
                                E_DAY_VIEW (object)));
                        return;
 
+               case PROP_TODAY_BACKGROUND_COLOR:
+                       g_value_set_string (
+                               value,
+                               e_day_view_get_today_background_color (
+                               E_DAY_VIEW (object)));
+                       return;
+
                case PROP_IS_EDITING:
                        g_value_set_boolean (value, e_day_view_is_editing (E_DAY_VIEW (object)));
                        return;
@@ -1212,11 +1228,9 @@ day_view_dispose (GObject *object)
        g_clear_object (&day_view->priv->model);
        g_clear_object (&day_view->priv->drag_context);
 
-       g_free (day_view->priv->marcus_bains_day_view_color);
-       day_view->priv->marcus_bains_day_view_color = NULL;
-
-       g_free (day_view->priv->marcus_bains_time_bar_color);
-       day_view->priv->marcus_bains_time_bar_color = NULL;
+       g_clear_pointer (&day_view->priv->marcus_bains_day_view_color, g_free);
+       g_clear_pointer (&day_view->priv->marcus_bains_time_bar_color, g_free);
+       g_clear_pointer (&day_view->priv->today_background_color, g_free);
 
        /* Chain up to parent's dispose() method. */
        G_OBJECT_CLASS (e_day_view_parent_class)->dispose (object);
@@ -2164,6 +2178,17 @@ e_day_view_class_init (EDayViewClass *class)
                        G_PARAM_READWRITE |
                        G_PARAM_STATIC_STRINGS));
 
+       g_object_class_install_property (
+               object_class,
+               PROP_TODAY_BACKGROUND_COLOR,
+               g_param_spec_string (
+                       "today-background-color",
+                       "Today Background Color",
+                       NULL,
+                       NULL,
+                       G_PARAM_READWRITE |
+                       G_PARAM_STATIC_STRINGS));
+
        g_object_class_override_property (
                object_class,
                PROP_IS_EDITING,
@@ -3047,7 +3072,8 @@ e_day_view_set_colors (EDayView *day_view)
        e_rgba_to_color (&base_bg, &day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BACKGROUND]);
        e_rgba_to_color (&dark_bg, &day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BORDER]);
 
-       day_view->colors[E_DAY_VIEW_COLOR_BG_MULTIDAY_TODAY] = get_today_background 
(day_view->colors[E_DAY_VIEW_COLOR_BG_WORKING]);
+       if (!day_view->priv->today_background_color)
+               day_view->colors[E_DAY_VIEW_COLOR_BG_MULTIDAY_TODAY] = get_today_background 
(day_view->colors[E_DAY_VIEW_COLOR_BG_WORKING]);
 
        bg_bg.red = 0.5;
        bg_bg.green = 1.0;
@@ -4085,6 +4111,44 @@ e_day_view_marcus_bains_set_time_bar_color (EDayView *day_view,
        g_object_notify (G_OBJECT (day_view), "marcus-bains-time-bar-color");
 }
 
+const gchar *
+e_day_view_get_today_background_color (EDayView *day_view)
+{
+       g_return_val_if_fail (E_IS_DAY_VIEW (day_view), NULL);
+
+       return day_view->priv->today_background_color;
+}
+
+void
+e_day_view_set_today_background_color (EDayView *day_view,
+                                      const gchar *color)
+{
+       GdkRGBA rgba;
+
+       g_return_if_fail (E_IS_DAY_VIEW (day_view));
+
+       if (g_strcmp0 (color, day_view->priv->today_background_color) == 0)
+               return;
+
+       if (color && gdk_rgba_parse (&rgba, color)) {
+               g_free (day_view->priv->today_background_color);
+               day_view->priv->today_background_color = g_strdup (color);
+               day_view->colors[E_DAY_VIEW_COLOR_BG_MULTIDAY_TODAY].red = 0xFFFF * rgba.red;
+               day_view->colors[E_DAY_VIEW_COLOR_BG_MULTIDAY_TODAY].green = 0xFFFF * rgba.green;
+               day_view->colors[E_DAY_VIEW_COLOR_BG_MULTIDAY_TODAY].blue = 0xFFFF * rgba.blue;
+       } else if (day_view->priv->today_background_color) {
+               g_free (day_view->priv->today_background_color);
+               day_view->priv->today_background_color = NULL;
+               day_view->colors[E_DAY_VIEW_COLOR_BG_MULTIDAY_TODAY] = get_today_background 
(day_view->colors[E_DAY_VIEW_COLOR_BG_WORKING]);
+       } else {
+               return;
+       }
+
+       gtk_widget_queue_draw (day_view->main_canvas);
+
+       g_object_notify (G_OBJECT (day_view), "today-background-color");
+}
+
 /* Whether we display event end times in the main canvas. */
 gboolean
 e_day_view_get_show_event_end_times (EDayView *day_view)
diff --git a/src/calendar/gui/e-day-view.h b/src/calendar/gui/e-day-view.h
index 4bf03099ed..3e30c051b5 100644
--- a/src/calendar/gui/e-day-view.h
+++ b/src/calendar/gui/e-day-view.h
@@ -484,6 +484,11 @@ const gchar *      e_day_view_marcus_bains_get_time_bar_color
 void           e_day_view_marcus_bains_set_time_bar_color
                                                (EDayView *day_view,
                                                 const gchar *time_bar_color);
+const gchar *  e_day_view_get_today_background_color
+                                               (EDayView *day_view);
+void           e_day_view_set_today_background_color
+                                               (EDayView *day_view,
+                                                const gchar *color);
 
 /* Whether we display event end times in the main canvas. */
 gboolean       e_day_view_get_show_event_end_times
diff --git a/src/calendar/gui/e-week-view.c b/src/calendar/gui/e-week-view.c
index ce6840866e..8398941ac7 100644
--- a/src/calendar/gui/e-week-view.c
+++ b/src/calendar/gui/e-week-view.c
@@ -101,6 +101,8 @@ struct _EWeekViewPrivate {
        gboolean show_icons_month_view;
        gboolean draw_flat_events;
        gboolean days_left_to_right;
+
+       gchar *today_background_color;
 };
 
 typedef struct {
@@ -202,6 +204,7 @@ enum {
        PROP_DAYS_LEFT_TO_RIGHT,
        PROP_SHOW_EVENT_END_TIMES,
        PROP_SHOW_ICONS_MONTH_VIEW,
+       PROP_TODAY_BACKGROUND_COLOR,
        PROP_IS_EDITING
 };
 
@@ -800,6 +803,12 @@ week_view_set_property (GObject *object,
                                E_WEEK_VIEW (object),
                                g_value_get_boolean (value));
                        return;
+
+               case PROP_TODAY_BACKGROUND_COLOR:
+                       e_week_view_set_today_background_color (
+                               E_WEEK_VIEW (object),
+                               g_value_get_string (value));
+                       return;
        }
 
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -847,6 +856,13 @@ week_view_get_property (GObject *object,
                                E_WEEK_VIEW (object)));
                        return;
 
+               case PROP_TODAY_BACKGROUND_COLOR:
+                       g_value_set_string (
+                               value,
+                               e_week_view_get_today_background_color (
+                               E_WEEK_VIEW (object)));
+                       return;
+
                case PROP_IS_EDITING:
                        g_value_set_boolean (value, e_week_view_is_editing (E_WEEK_VIEW (object)));
                        return;
@@ -878,6 +894,7 @@ week_view_dispose (GObject *object)
        }
 
        g_clear_pointer (&week_view->small_font_desc, pango_font_description_free);
+       g_clear_pointer (&week_view->priv->today_background_color, g_free);
        g_clear_object (&week_view->normal_cursor);
        g_clear_object (&week_view->move_cursor);
        g_clear_object (&week_view->resize_width_cursor);
@@ -1761,6 +1778,17 @@ e_week_view_class_init (EWeekViewClass *class)
                        G_PARAM_READWRITE |
                        G_PARAM_STATIC_STRINGS));
 
+       g_object_class_install_property (
+               object_class,
+               PROP_TODAY_BACKGROUND_COLOR,
+               g_param_spec_string (
+                       "today-background-color",
+                       "Today Background Color",
+                       NULL,
+                       NULL,
+                       G_PARAM_READWRITE |
+                       G_PARAM_STATIC_STRINGS));
+
        g_object_class_override_property (
                object_class,
                PROP_IS_EDITING,
@@ -2004,7 +2032,8 @@ e_week_view_set_colors (EWeekView *week_view)
        e_rgba_to_color (&selected_fg, &week_view->colors[E_WEEK_VIEW_COLOR_DATES_SELECTED]);
        e_rgba_to_color (&selected_bg, &week_view->colors[E_WEEK_VIEW_COLOR_TODAY]);
 
-       week_view->colors[E_WEEK_VIEW_COLOR_TODAY_BACKGROUND] = get_today_background 
(week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BACKGROUND]);
+       if (!week_view->priv->today_background_color)
+               week_view->colors[E_WEEK_VIEW_COLOR_TODAY_BACKGROUND] = get_today_background 
(week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BACKGROUND]);
        week_view->colors[E_WEEK_VIEW_COLOR_MONTH_NONWORKING_DAY] = color_inc 
(week_view->colors[E_WEEK_VIEW_COLOR_EVEN_MONTHS], -0x0A0A);
 }
 
@@ -5310,3 +5339,41 @@ e_week_view_is_editing (EWeekView *week_view)
 
        return week_view->editing_event_num != -1;
 }
+
+const gchar *
+e_week_view_get_today_background_color (EWeekView *week_view)
+{
+       g_return_val_if_fail (E_IS_WEEK_VIEW (week_view), NULL);
+
+       return week_view->priv->today_background_color;
+}
+
+void
+e_week_view_set_today_background_color (EWeekView *week_view,
+                                       const gchar *color)
+{
+       GdkRGBA rgba;
+
+       g_return_if_fail (E_IS_WEEK_VIEW (week_view));
+
+       if (g_strcmp0 (color, week_view->priv->today_background_color) == 0)
+               return;
+
+       if (color && gdk_rgba_parse (&rgba, color)) {
+               g_free (week_view->priv->today_background_color);
+               week_view->priv->today_background_color = g_strdup (color);
+               week_view->colors[E_WEEK_VIEW_COLOR_TODAY_BACKGROUND].red = 0xFFFF * rgba.red;
+               week_view->colors[E_WEEK_VIEW_COLOR_TODAY_BACKGROUND].green = 0xFFFF * rgba.green;
+               week_view->colors[E_WEEK_VIEW_COLOR_TODAY_BACKGROUND].blue = 0xFFFF * rgba.blue;
+       } else if (week_view->priv->today_background_color) {
+               g_free (week_view->priv->today_background_color);
+               week_view->priv->today_background_color = NULL;
+               week_view->colors[E_WEEK_VIEW_COLOR_TODAY_BACKGROUND] = get_today_background 
(week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BACKGROUND]);
+       } else {
+               return;
+       }
+
+       gtk_widget_queue_draw (week_view->main_canvas);
+
+       g_object_notify (G_OBJECT (week_view), "today-background-color");
+}
diff --git a/src/calendar/gui/e-week-view.h b/src/calendar/gui/e-week-view.h
index 1276c765c1..f1a3a071b3 100644
--- a/src/calendar/gui/e-week-view.h
+++ b/src/calendar/gui/e-week-view.h
@@ -456,6 +456,11 @@ void               e_week_view_scroll_a_step       (EWeekView *week_view,
                                                 ECalViewMoveDirection direction);
 
 gboolean       e_week_view_is_editing          (EWeekView *week_view);
+const gchar *  e_week_view_get_today_background_color
+                                               (EWeekView *week_view);
+void           e_week_view_set_today_background_color
+                                               (EWeekView *week_view,
+                                                const gchar *color);
 
 G_END_DECLS
 
diff --git a/src/modules/settings/e-settings-calendar-view.c b/src/modules/settings/e-settings-calendar-view.c
index 614ed27d10..7bf080ca31 100644
--- a/src/modules/settings/e-settings-calendar-view.c
+++ b/src/modules/settings/e-settings-calendar-view.c
@@ -85,6 +85,11 @@ settings_calendar_view_constructed (GObject *object)
                        settings, "marcus-bains-color-timebar",
                        extensible, "marcus-bains-time-bar-color",
                        G_SETTINGS_BIND_GET);
+
+               g_settings_bind (
+                       settings, "today-background-color",
+                       extensible, "today-background-color",
+                       G_SETTINGS_BIND_GET);
        }
 
        /*** EWeekView ***/
@@ -115,6 +120,11 @@ settings_calendar_view_constructed (GObject *object)
                        settings, "show-icons-month-view",
                        extensible, "show-icons-month-view",
                        G_SETTINGS_BIND_GET);
+
+               g_settings_bind (
+                       settings, "today-background-color",
+                       extensible, "today-background-color",
+                       G_SETTINGS_BIND_GET);
        }
 
        g_object_unref (settings);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]