[evolution] Bug #582649 - Toggle for coloring today and overdue tasks



commit 017f373b5284b4d7177c19e5ac2a142a5362a15c
Author: Milan Crha <mcrha redhat com>
Date:   Wed Dec 14 14:48:34 2011 +0100

    Bug #582649 - Toggle for coloring today and overdue tasks

 calendar/gui/e-cal-model-tasks.c                 |  113 +++++++++++++++++++++-
 calendar/gui/e-cal-model-tasks.h                 |   10 ++
 calendar/gui/e-task-table.c                      |   33 +++++++
 data/org.gnome.evolution.calendar.gschema.xml.in |   14 +++-
 modules/calendar/e-cal-config-model.c            |   10 ++
 modules/calendar/e-cal-shell-settings.c          |   10 ++
 modules/calendar/e-calendar-preferences.c        |   22 ++++
 modules/calendar/e-calendar-preferences.ui       |   18 ++--
 8 files changed, 215 insertions(+), 15 deletions(-)
---
diff --git a/calendar/gui/e-cal-model-tasks.c b/calendar/gui/e-cal-model-tasks.c
index 8602ce5..fdbcd37 100644
--- a/calendar/gui/e-cal-model-tasks.c
+++ b/calendar/gui/e-cal-model-tasks.c
@@ -38,7 +38,9 @@
 #include "misc.h"
 
 struct _ECalModelTasksPrivate {
+	gboolean highlight_due_today;
 	gchar *color_due_today;
+	gboolean highlight_overdue;
 	gchar *color_overdue;
 };
 
@@ -61,7 +63,9 @@ G_DEFINE_TYPE (ECalModelTasks, e_cal_model_tasks, E_TYPE_CAL_MODEL)
 
 enum {
 	PROP_0,
+	PROP_HIGHLIGHT_DUE_TODAY,
 	PROP_COLOR_DUE_TODAY,
+	PROP_HIGHLIGHT_OVERDUE,
 	PROP_COLOR_OVERDUE
 };
 
@@ -72,12 +76,24 @@ cal_model_tasks_set_property (GObject *object,
                               GParamSpec *pspec)
 {
 	switch (property_id) {
+		case PROP_HIGHLIGHT_DUE_TODAY:
+			e_cal_model_tasks_set_highlight_due_today (
+				E_CAL_MODEL_TASKS (object),
+				g_value_get_boolean (value));
+			return;
+
 		case PROP_COLOR_DUE_TODAY:
 			e_cal_model_tasks_set_color_due_today (
 				E_CAL_MODEL_TASKS (object),
 				g_value_get_string (value));
 			return;
 
+		case PROP_HIGHLIGHT_OVERDUE:
+			e_cal_model_tasks_set_highlight_overdue (
+				E_CAL_MODEL_TASKS (object),
+				g_value_get_boolean (value));
+			return;
+
 		case PROP_COLOR_OVERDUE:
 			e_cal_model_tasks_set_color_overdue (
 				E_CAL_MODEL_TASKS (object),
@@ -95,6 +111,13 @@ cal_model_tasks_get_property (GObject *object,
                               GParamSpec *pspec)
 {
 	switch (property_id) {
+		case PROP_HIGHLIGHT_DUE_TODAY:
+			g_value_set_boolean (
+				value,
+				e_cal_model_tasks_get_highlight_due_today (
+				E_CAL_MODEL_TASKS (object)));
+			return;
+
 		case PROP_COLOR_DUE_TODAY:
 			g_value_set_string (
 				value,
@@ -102,6 +125,13 @@ cal_model_tasks_get_property (GObject *object,
 				E_CAL_MODEL_TASKS (object)));
 			return;
 
+		case PROP_HIGHLIGHT_OVERDUE:
+			g_value_set_boolean (
+				value,
+				e_cal_model_tasks_get_highlight_overdue (
+				E_CAL_MODEL_TASKS (object)));
+			return;
+
 		case PROP_COLOR_OVERDUE:
 			g_value_set_string (
 				value,
@@ -158,6 +188,16 @@ e_cal_model_tasks_class_init (ECalModelTasksClass *class)
 
 	g_object_class_install_property (
 		object_class,
+		PROP_HIGHLIGHT_DUE_TODAY,
+		g_param_spec_boolean (
+			"highlight-due-today",
+			"Highlight Due Today",
+			NULL,
+			TRUE,
+			G_PARAM_READWRITE));
+
+	g_object_class_install_property (
+		object_class,
 		PROP_COLOR_DUE_TODAY,
 		g_param_spec_string (
 			"color-due-today",
@@ -168,6 +208,16 @@ e_cal_model_tasks_class_init (ECalModelTasksClass *class)
 
 	g_object_class_install_property (
 		object_class,
+		PROP_HIGHLIGHT_OVERDUE,
+		g_param_spec_boolean (
+			"highlight-overdue",
+			"Highlight Overdue",
+			NULL,
+			TRUE,
+			G_PARAM_READWRITE));
+
+	g_object_class_install_property (
+		object_class,
 		PROP_COLOR_OVERDUE,
 		g_param_spec_string (
 			"color-overdue",
@@ -183,6 +233,9 @@ e_cal_model_tasks_init (ECalModelTasks *model)
 	model->priv = G_TYPE_INSTANCE_GET_PRIVATE (
 		model, E_TYPE_CAL_MODEL_TASKS, ECalModelTasksPrivate);
 
+	model->priv->highlight_due_today = TRUE;
+	model->priv->highlight_overdue = TRUE;
+
 	e_cal_model_set_component_kind (
 		E_CAL_MODEL (model), ICAL_VTODO_COMPONENT);
 }
@@ -1104,19 +1157,25 @@ static const gchar *
 ecmt_get_color_for_component (ECalModel *model,
                               ECalModelComponent *comp_data)
 {
+	ECalModelTasks *tasks;
+
 	g_return_val_if_fail (E_IS_CAL_MODEL_TASKS (model), NULL);
 	g_return_val_if_fail (comp_data != NULL, NULL);
 
+	tasks = E_CAL_MODEL_TASKS (model);
+
 	/* XXX ECalModel's get_color_for_component() method should really
 	 *     get a GdkColor instead of a color specification string. */
 
-	switch (get_due_status ((ECalModelTasks *) model, comp_data)) {
+	switch (get_due_status (tasks, comp_data)) {
 	case E_CAL_MODEL_TASKS_DUE_TODAY:
-		return e_cal_model_tasks_get_color_due_today (
-			E_CAL_MODEL_TASKS (model));
+		if (!e_cal_model_tasks_get_highlight_due_today (tasks))
+			break;
+		return e_cal_model_tasks_get_color_due_today (tasks);
 	case E_CAL_MODEL_TASKS_DUE_OVERDUE:
-		return e_cal_model_tasks_get_color_overdue (
-			E_CAL_MODEL_TASKS (model));
+		if (!e_cal_model_tasks_get_highlight_overdue (tasks))
+			break;
+		return e_cal_model_tasks_get_color_overdue (tasks);
 	case E_CAL_MODEL_TASKS_DUE_NEVER:
 	case E_CAL_MODEL_TASKS_DUE_FUTURE:
 	case E_CAL_MODEL_TASKS_DUE_COMPLETE:
@@ -1167,6 +1226,28 @@ e_cal_model_tasks_new (void)
 	return g_object_new (E_TYPE_CAL_MODEL_TASKS, NULL);
 }
 
+gboolean
+e_cal_model_tasks_get_highlight_due_today (ECalModelTasks *model)
+{
+	g_return_val_if_fail (E_IS_CAL_MODEL_TASKS (model), FALSE);
+
+	return model->priv->highlight_due_today;
+}
+
+void
+e_cal_model_tasks_set_highlight_due_today (ECalModelTasks *model,
+					   gboolean highlight)
+{
+	g_return_if_fail (E_IS_CAL_MODEL_TASKS (model));
+
+	if ((highlight ? 1 : 0) == (model->priv->highlight_due_today ? 1 : 0))
+		return;
+
+	model->priv->highlight_due_today = highlight;
+
+	g_object_notify (G_OBJECT (model), "highlight-due-today");
+}
+
 const gchar *
 e_cal_model_tasks_get_color_due_today (ECalModelTasks *model)
 {
@@ -1188,6 +1269,28 @@ e_cal_model_tasks_set_color_due_today (ECalModelTasks *model,
 	g_object_notify (G_OBJECT (model), "color-due-today");
 }
 
+gboolean
+e_cal_model_tasks_get_highlight_overdue (ECalModelTasks *model)
+{
+	g_return_val_if_fail (E_IS_CAL_MODEL_TASKS (model), FALSE);
+
+	return model->priv->highlight_overdue;
+}
+
+void
+e_cal_model_tasks_set_highlight_overdue (ECalModelTasks *model,
+					 gboolean highlight)
+{
+	g_return_if_fail (E_IS_CAL_MODEL_TASKS (model));
+
+	if ((highlight ? 1 : 0) == (model->priv->highlight_overdue ? 1 : 0))
+		return;
+
+	model->priv->highlight_overdue = highlight;
+
+	g_object_notify (G_OBJECT (model), "highlight-overdue");
+}
+
 const gchar *
 e_cal_model_tasks_get_color_overdue (ECalModelTasks *model)
 {
diff --git a/calendar/gui/e-cal-model-tasks.h b/calendar/gui/e-cal-model-tasks.h
index f35f8dd..54d31cb 100644
--- a/calendar/gui/e-cal-model-tasks.h
+++ b/calendar/gui/e-cal-model-tasks.h
@@ -80,11 +80,21 @@ struct _ECalModelTasksClass {
 
 GType		e_cal_model_tasks_get_type	(void);
 ECalModel *	e_cal_model_tasks_new		(void);
+gboolean	e_cal_model_tasks_get_highlight_due_today
+						(ECalModelTasks *model);
+void		e_cal_model_tasks_set_highlight_due_today
+						(ECalModelTasks *model,
+						 gboolean highlight);
 const gchar *	e_cal_model_tasks_get_color_due_today
 						(ECalModelTasks *model);
 void		e_cal_model_tasks_set_color_due_today
 						(ECalModelTasks *model,
 						 const gchar *color_due_today);
+gboolean	e_cal_model_tasks_get_highlight_overdue
+						(ECalModelTasks *model);
+void		e_cal_model_tasks_set_highlight_overdue
+						(ECalModelTasks *model,
+						 gboolean highlight);
 const gchar *	e_cal_model_tasks_get_color_overdue
 						(ECalModelTasks *model);
 void		e_cal_model_tasks_set_color_overdue
diff --git a/calendar/gui/e-task-table.c b/calendar/gui/e-task-table.c
index e052e82..4efe8d0 100644
--- a/calendar/gui/e-task-table.c
+++ b/calendar/gui/e-task-table.c
@@ -288,6 +288,16 @@ delete_selected_components (ETaskTable *task_table)
 }
 
 static void
+task_table_queue_draw_cb (ECalModelTasks *tasks_model,
+			  GParamSpec *param,
+			  GtkWidget *task_table)
+{
+	g_return_if_fail (task_table != NULL);
+
+	gtk_widget_queue_draw (task_table);
+}
+
+static void
 task_table_set_model (ETaskTable *task_table,
                       ECalModel *model)
 {
@@ -304,6 +314,28 @@ task_table_set_model (ETaskTable *task_table,
 		model, "cal-view-complete",
 		G_CALLBACK (task_table_model_cal_view_complete_cb),
 		task_table);
+
+	/* redraw on drawing options change */
+	g_signal_connect (
+		model, "notify::highlight-due-today",
+		G_CALLBACK (task_table_queue_draw_cb),
+		task_table);
+
+	g_signal_connect (
+		model, "notify::color-due-today",
+		G_CALLBACK (task_table_queue_draw_cb),
+		task_table);
+
+	g_signal_connect (
+		model, "notify::highlight-overdue",
+		G_CALLBACK (task_table_queue_draw_cb),
+		task_table);
+
+	g_signal_connect (
+		model, "notify::color-overdue",
+		G_CALLBACK (task_table_queue_draw_cb),
+		task_table);
+
 }
 
 static void
@@ -397,6 +429,7 @@ task_table_dispose (GObject *object)
 	}
 
 	if (priv->model != NULL) {
+		g_signal_handlers_disconnect_by_func (priv->model, task_table_queue_draw_cb, object);
 		g_object_unref (priv->model);
 		priv->model = NULL;
 	}
diff --git a/data/org.gnome.evolution.calendar.gschema.xml.in b/data/org.gnome.evolution.calendar.gschema.xml.in
index 3fd0607..90d3192 100644
--- a/data/org.gnome.evolution.calendar.gschema.xml.in
+++ b/data/org.gnome.evolution.calendar.gschema.xml.in
@@ -250,10 +250,15 @@
       <_summary>Vertical position for the tag pane</_summary>
       <_description>Vertical position for the tag pane</_description>
     </key>
+    <key name="task-due-today-highlight" type="b">
+      <default>true</default>
+      <_summary>Highlight tasks due today</_summary>
+      <_description>Whether highlight tasks due today with a special color (task-due-today-color)</_description>
+    </key>
     <key name="task-due-today-color" type="s">
       <default>'#1e90ff'</default>
       <_summary>Tasks due today color</_summary>
-      <_description>Background color of tasks that are due today, in "#rrggbb" format</_description>
+      <_description>Background color of tasks that are due today, in "#rrggbb" format. Used together with task-due-today-highlight</_description>
     </key>
     <key name="task-hpane-position" type="i">
       <default>200</default>
@@ -270,10 +275,15 @@
       <_summary>Task preview pane position (vertical)</_summary>
       <_description>Position of the task preview pane when oriented vertically</_description>
     </key>
+    <key name="task-overdue-highlight" type="b">
+      <default>true</default>
+      <_summary>Highlight overdue tasks</_summary>
+      <_description>Whether highlight overdue tasks with a special color (task-overdue-color)</_description>
+    </key>
     <key name="task-overdue-color" type="s">
       <default>'#ff0000'</default>
       <_summary>Overdue tasks color</_summary>
-      <_description>Background color of tasks that are overdue, in "#rrggbb" format</_description>
+      <_description>Background color of tasks that are overdue, in "#rrggbb" format. Used together with task-overdue-highlight.</_description>
     </key>
     <key name="time-divisions" type="i">
       <default>30</default>
diff --git a/modules/calendar/e-cal-config-model.c b/modules/calendar/e-cal-config-model.c
index 9898942..f7a0e16 100644
--- a/modules/calendar/e-cal-config-model.c
+++ b/modules/calendar/e-cal-config-model.c
@@ -111,11 +111,21 @@ cal_config_model_constructed (GObject *object)
 	if (E_IS_CAL_MODEL_TASKS (extensible)) {
 
 		g_object_bind_property (
+			shell_settings, "cal-tasks-highlight-due-today",
+			extensible, "highlight-due-today",
+			G_BINDING_SYNC_CREATE);
+
+		g_object_bind_property (
 			shell_settings, "cal-tasks-color-due-today",
 			extensible, "color-due-today",
 			G_BINDING_SYNC_CREATE);
 
 		g_object_bind_property (
+			shell_settings, "cal-tasks-highlight-overdue",
+			extensible, "highlight-overdue",
+			G_BINDING_SYNC_CREATE);
+
+		g_object_bind_property (
 			shell_settings, "cal-tasks-color-overdue",
 			extensible, "color-overdue",
 			G_BINDING_SYNC_CREATE);
diff --git a/modules/calendar/e-cal-shell-settings.c b/modules/calendar/e-cal-shell-settings.c
index 88b961e..9810d81 100644
--- a/modules/calendar/e-cal-shell-settings.c
+++ b/modules/calendar/e-cal-shell-settings.c
@@ -633,11 +633,21 @@ e_cal_shell_backend_init_settings (EShell *shell)
 		"show-week-numbers");
 
 	e_shell_settings_install_property_for_key (
+		"cal-tasks-highlight-due-today",
+		CALENDAR_SCHEMA,
+		"task-due-today-highlight");
+
+	e_shell_settings_install_property_for_key (
 		"cal-tasks-color-due-today",
 		CALENDAR_SCHEMA,
 		"task-due-today-color");
 
 	e_shell_settings_install_property_for_key (
+		"cal-tasks-highlight-overdue",
+		CALENDAR_SCHEMA,
+		"task-overdue-highlight");
+
+	e_shell_settings_install_property_for_key (
 		"cal-tasks-color-overdue",
 		CALENDAR_SCHEMA,
 		"task-overdue-color");
diff --git a/modules/calendar/e-calendar-preferences.c b/modules/calendar/e-calendar-preferences.c
index 5578f39..55a91ac 100644
--- a/modules/calendar/e-calendar-preferences.c
+++ b/modules/calendar/e-calendar-preferences.c
@@ -797,6 +797,13 @@ calendar_preferences_construct (ECalendarPreferences *prefs,
 		G_BINDING_BIDIRECTIONAL |
 		G_BINDING_SYNC_CREATE);
 
+	widget = e_builder_get_widget (prefs->builder, "tasks_due_today_highlight");
+	g_object_bind_property (
+		shell_settings, "cal-tasks-highlight-due-today",
+		widget, "active",
+		G_BINDING_BIDIRECTIONAL |
+		G_BINDING_SYNC_CREATE);
+
 	widget = e_builder_get_widget (prefs->builder, "tasks_due_today_color");
 	g_object_bind_property_full (
 		shell_settings, "cal-tasks-color-due-today",
@@ -806,6 +813,17 @@ calendar_preferences_construct (ECalendarPreferences *prefs,
 		e_binding_transform_string_to_color,
 		e_binding_transform_color_to_string,
 		NULL, (GDestroyNotify) NULL);
+	g_object_bind_property (
+		shell_settings, "cal-tasks-highlight-due-today",
+		widget, "sensitive",
+		G_BINDING_SYNC_CREATE);
+
+	widget = e_builder_get_widget (prefs->builder, "tasks_overdue_highlight");
+	g_object_bind_property (
+		shell_settings, "cal-tasks-highlight-overdue",
+		widget, "active",
+		G_BINDING_BIDIRECTIONAL |
+		G_BINDING_SYNC_CREATE);
 
 	widget = e_builder_get_widget (prefs->builder, "tasks_overdue_color");
 	g_object_bind_property_full (
@@ -816,6 +834,10 @@ calendar_preferences_construct (ECalendarPreferences *prefs,
 		e_binding_transform_string_to_color,
 		e_binding_transform_color_to_string,
 		(GDestroyNotify) NULL, NULL);
+	g_object_bind_property (
+		shell_settings, "cal-tasks-highlight-overdue",
+		widget, "sensitive",
+		G_BINDING_SYNC_CREATE);
 
 	widget = e_builder_get_widget (prefs->builder, "tasks_hide_completed");
 	g_object_bind_property (
diff --git a/modules/calendar/e-calendar-preferences.ui b/modules/calendar/e-calendar-preferences.ui
index 44ffc19..5cbc82f 100644
--- a/modules/calendar/e-calendar-preferences.ui
+++ b/modules/calendar/e-calendar-preferences.ui
@@ -1032,12 +1032,13 @@
                     <property name="visible">True</property>
                     <property name="spacing">12</property>
                     <child>
-                      <object class="GtkLabel" id="label21">
+                      <object class="GtkCheckButton" id="tasks_due_today_highlight">
+                        <property name="label" translatable="yes">Highlight t_asks due today</property>
                         <property name="visible">True</property>
-                        <property name="xalign">0</property>
-                        <property name="label" translatable="yes">T_asks due today:</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
                         <property name="use_underline">True</property>
-                        <property name="mnemonic_widget">tasks_due_today_color</property>
+                        <property name="draw_indicator">True</property>
                       </object>
                       <packing>
                         <property name="expand">False</property>
@@ -1071,12 +1072,13 @@
                     <property name="visible">True</property>
                     <property name="spacing">12</property>
                     <child>
-                      <object class="GtkLabel" id="label22">
+                      <object class="GtkCheckButton" id="tasks_overdue_highlight">
+                        <property name="label" translatable="yes">Highlight _overdue tasks</property>
                         <property name="visible">True</property>
-                        <property name="xalign">0</property>
-                        <property name="label" translatable="yes">_Overdue tasks:</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
                         <property name="use_underline">True</property>
-                        <property name="mnemonic_widget">tasks_overdue_color</property>
+                        <property name="draw_indicator">True</property>
                       </object>
                       <packing>
                         <property name="expand">False</property>



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