[gnome-calendar] manager: Rework signals to use GcalCalendar
- From: Georges Basile Stavracas Neto <gbsneto src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-calendar] manager: Rework signals to use GcalCalendar
- Date: Sat, 4 May 2019 15:07:07 +0000 (UTC)
commit ea60c95a449b3558eed4efc9814a65d257f3b4ac
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date: Fri May 3 21:33:06 2019 -0300
manager: Rework signals to use GcalCalendar
src/gcal-application.c | 4 +-
src/gcal-manager.c | 76 +++++-------
src/gcal-quick-add-popover.c | 135 ++++++++++-----------
src/gcal-source-dialog.c | 258 +++++++++++++++++-----------------------
src/gcal-window.c | 150 +++++------------------
src/search/gcal-search-engine.c | 51 ++++----
6 files changed, 260 insertions(+), 414 deletions(-)
---
diff --git a/src/gcal-application.c b/src/gcal-application.c
index 3d6f908b..cab028bd 100644
--- a/src/gcal-application.c
+++ b/src/gcal-application.c
@@ -616,8 +616,8 @@ gcal_application_init (GcalApplication *self)
self->context = gcal_context_new ();
manager = gcal_context_get_manager (self->context);
- g_signal_connect_swapped (manager, "source-added", G_CALLBACK (process_sources), self);
- g_signal_connect_swapped (manager, "source-changed", G_CALLBACK (process_sources), self);
+ g_signal_connect_swapped (manager, "calendar-added", G_CALLBACK (process_sources), self);
+ g_signal_connect_swapped (manager, "calendar-changed", G_CALLBACK (process_sources), self);
self->search_provider = gcal_shell_search_provider_new (self->context);
}
diff --git a/src/gcal-manager.c b/src/gcal-manager.c
index 7daefabe..3305e977 100644
--- a/src/gcal-manager.c
+++ b/src/gcal-manager.c
@@ -103,10 +103,9 @@ enum
enum
{
- SOURCE_ADDED,
- SOURCE_CHANGED,
- SOURCE_REMOVED,
- SOURCE_ENABLED,
+ CALENDAR_ADDED,
+ CALENDAR_CHANGED,
+ CALENDAR_REMOVED,
QUERY_COMPLETED,
NUM_SIGNALS
};
@@ -155,16 +154,20 @@ static void
remove_source (GcalManager *self,
ESource *source)
{
+ GcalCalendar *calendar;
+
GCAL_ENTRY;
g_return_if_fail (GCAL_IS_MANAGER (self));
g_return_if_fail (E_IS_SOURCE (source));
+ calendar = g_hash_table_lookup (self->clients, source);
+
e_cal_data_model_remove_client (self->e_data_model,
e_source_get_uid (source));
g_hash_table_remove (self->clients, source);
- g_signal_emit (self, signals[SOURCE_REMOVED], 0, source);
+ g_signal_emit (self, signals[CALENDAR_REMOVED], 0, calendar);
GCAL_EXIT;
}
@@ -173,13 +176,14 @@ static void
source_changed (GcalManager *self,
ESource *source)
{
+ GcalCalendar *calendar;
+
GCAL_ENTRY;
- if (g_hash_table_lookup (self->clients, source) != NULL &&
- e_source_has_extension (source, E_SOURCE_EXTENSION_CALENDAR))
- {
- g_signal_emit (self, signals[SOURCE_CHANGED], 0, source);
- }
+ calendar = g_hash_table_lookup (self->clients, source);
+
+ if (calendar)
+ g_signal_emit (self, signals[CALENDAR_CHANGED], 0, calendar);
GCAL_EXIT;
}
@@ -269,7 +273,7 @@ on_calendar_created_cb (GObject *source_object,
NULL,
NULL);
- g_signal_emit (self, signals[SOURCE_ADDED], 0, gcal_calendar_get_source (calendar), visible);
+ g_signal_emit (self, signals[CALENDAR_ADDED], 0, calendar);
}
static void
@@ -702,39 +706,29 @@ gcal_manager_class_init (GcalManagerClass *klass)
g_object_class_install_properties (object_class, NUM_PROPS, properties);
/* signals */
- signals[SOURCE_ADDED] = g_signal_new ("source-added",
- GCAL_TYPE_MANAGER,
- G_SIGNAL_RUN_LAST,
- 0, NULL, NULL, NULL,
- G_TYPE_NONE,
- 2,
- G_TYPE_POINTER,
- G_TYPE_BOOLEAN);
-
- signals[SOURCE_CHANGED] = g_signal_new ("source-changed",
+ signals[CALENDAR_ADDED] = g_signal_new ("calendar-added",
GCAL_TYPE_MANAGER,
G_SIGNAL_RUN_LAST,
0, NULL, NULL, NULL,
G_TYPE_NONE,
1,
- E_TYPE_SOURCE);
-
- signals[SOURCE_REMOVED] = g_signal_new ("source-removed",
- GCAL_TYPE_MANAGER,
- G_SIGNAL_RUN_LAST,
- 0, NULL, NULL, NULL,
- G_TYPE_NONE,
- 1,
- G_TYPE_POINTER);
-
- signals[SOURCE_ENABLED] = g_signal_new ("source-enabled",
- GCAL_TYPE_MANAGER,
- G_SIGNAL_RUN_LAST,
- 0, NULL, NULL, NULL,
- G_TYPE_NONE,
- 2,
- E_TYPE_SOURCE,
- G_TYPE_BOOLEAN);
+ GCAL_TYPE_CALENDAR);
+
+ signals[CALENDAR_CHANGED] = g_signal_new ("calendar-changed",
+ GCAL_TYPE_MANAGER,
+ G_SIGNAL_RUN_LAST,
+ 0, NULL, NULL, NULL,
+ G_TYPE_NONE,
+ 1,
+ GCAL_TYPE_CALENDAR);
+
+ signals[CALENDAR_REMOVED] = g_signal_new ("calendar-removed",
+ GCAL_TYPE_MANAGER,
+ G_SIGNAL_RUN_LAST,
+ 0, NULL, NULL, NULL,
+ G_TYPE_NONE,
+ 1,
+ GCAL_TYPE_CALENDAR);
signals[QUERY_COMPLETED] = g_signal_new ("query-completed",
GCAL_TYPE_MANAGER,
@@ -1110,8 +1104,6 @@ gcal_manager_enable_source (GcalManager *self,
if (self->shell_search_data_model)
e_cal_data_model_add_client (self->shell_search_data_model, client);
- g_signal_emit (self, signals[SOURCE_ENABLED], 0, source, TRUE);
-
/* Save the source */
e_source_selectable_set_selected (selectable, TRUE);
gcal_manager_save_source (self, source);
@@ -1154,8 +1146,6 @@ gcal_manager_disable_source (GcalManager *self,
if (self->shell_search_data_model != NULL)
e_cal_data_model_remove_client (self->shell_search_data_model, source_uid);
- g_signal_emit (self, signals[SOURCE_ENABLED], 0, source, FALSE);
-
/* Save the source */
e_source_selectable_set_selected (selectable, FALSE);
gcal_manager_save_source (self, source);
diff --git a/src/gcal-quick-add-popover.c b/src/gcal-quick-add-popover.c
index 9d66cd88..43ea74f4 100644
--- a/src/gcal-quick-add-popover.c
+++ b/src/gcal-quick-add-popover.c
@@ -67,13 +67,13 @@ static guint signals[NUM_SIGNALS] = { 0, };
*/
static GtkWidget*
-create_row_for_source (GcalManager *manager,
- ESource *source,
- gboolean writable)
+create_calendar_row (GcalManager *manager,
+ GcalCalendar *calendar)
{
cairo_surface_t *surface;
+ const GdkRGBA *color;
GtkWidget *row, *box, *icon, *label, *selected_icon;
- GdkRGBA color;
+ gboolean read_only;
gchar *tooltip, *parent_name;
/* The main box */
@@ -84,8 +84,8 @@ create_row_for_source (GcalManager *manager,
gtk_widget_set_margin_bottom (box, 3);
/* The icon with the source color */
- get_color_name_from_source (source, &color);
- surface = get_circle_surface_from_color (&color, 16);
+ color = gcal_calendar_get_color (calendar);
+ surface = get_circle_surface_from_color (color, 16);
icon = gtk_image_new_from_surface (surface);
gtk_container_add (GTK_CONTAINER (box), icon);
@@ -93,7 +93,7 @@ create_row_for_source (GcalManager *manager,
gtk_style_context_add_class (gtk_widget_get_style_context (icon), "calendar-color-image");
/* Source name label */
- label = gtk_label_new (e_source_get_display_name (source));
+ label = gtk_label_new (gcal_calendar_get_name (calendar));
gtk_widget_set_margin_end (label, 12);
gtk_container_add (GTK_CONTAINER (box), label);
@@ -104,17 +104,19 @@ create_row_for_source (GcalManager *manager,
/* The row itself */
row = gtk_list_box_row_new ();
- gtk_widget_set_sensitive (row, writable);
+
+ read_only = gcal_calendar_is_read_only (calendar);
+ gtk_widget_set_sensitive (row, !read_only);
gtk_container_add (GTK_CONTAINER (row), box);
/* Setup also a cool tooltip */
- get_source_parent_name_color (manager, source, &parent_name, NULL);
+ get_source_parent_name_color (manager, gcal_calendar_get_source (calendar), &parent_name, NULL);
- if (writable)
- tooltip = g_strdup (parent_name);
- else
+ if (read_only)
tooltip = g_strdup_printf (_("%s (this calendar is read-only)"), parent_name);
+ else
+ tooltip = g_strdup (parent_name);
gtk_widget_set_tooltip_text (row, tooltip);
@@ -123,7 +125,7 @@ create_row_for_source (GcalManager *manager,
* taken to make sure it is not destroyed before this
* row.
*/
- g_object_set_data_full (G_OBJECT (row), "source", g_object_ref (source), g_object_unref);
+ g_object_set_data_full (G_OBJECT (row), "calendar", g_object_ref (calendar), g_object_unref);
g_object_set_data (G_OBJECT (row), "selected-icon", selected_icon);
g_object_set_data (G_OBJECT (row), "color-icon", icon);
g_object_set_data (G_OBJECT (row), "name-label", label);
@@ -145,8 +147,8 @@ create_row_for_source (GcalManager *manager,
* ESource from the listbox.
*/
static GtkWidget*
-get_row_for_source (GcalQuickAddPopover *self,
- ESource *source)
+get_row_for_calendar (GcalQuickAddPopover *self,
+ GcalCalendar *calendar)
{
GList *children, *l;
GtkWidget *row;
@@ -156,9 +158,9 @@ get_row_for_source (GcalQuickAddPopover *self,
for (l = children; l != NULL; l = g_list_next (l))
{
- ESource *row_source = g_object_get_data (l->data, "source");
+ GcalCalendar *row_calendar = g_object_get_data (l->data, "calendar");
- if (row_source == source)
+ if (row_calendar == calendar)
{
row = l->data;
break;
@@ -175,9 +177,9 @@ select_row (GcalQuickAddPopover *self,
GtkListBoxRow *row)
{
cairo_surface_t *surface;
+ const GdkRGBA *color;
+ GcalCalendar *calendar;
GtkWidget *icon;
- ESource *source;
- GdkRGBA color;
/* First, unselect the previous row */
if (self->selected_row)
@@ -193,12 +195,12 @@ select_row (GcalQuickAddPopover *self,
self->selected_row = GTK_WIDGET (row);
/* Setup the event page's source name and color */
- source = g_object_get_data (G_OBJECT (row), "source");
+ calendar = g_object_get_data (G_OBJECT (row), "calendar");
- gtk_label_set_label (GTK_LABEL (self->calendar_name_label), e_source_get_display_name (source));
+ gtk_label_set_label (GTK_LABEL (self->calendar_name_label), gcal_calendar_get_name (calendar));
- get_color_name_from_source (source, &color);
- surface = get_circle_surface_from_color (&color, 16);
+ color = gcal_calendar_get_color (calendar);
+ surface = get_circle_surface_from_color (color, 16);
gtk_image_set_from_surface (GTK_IMAGE (self->color_image), surface);
/* Return to the events page */
@@ -485,14 +487,16 @@ update_header (GcalQuickAddPopover *self)
static void
update_default_calendar_row (GcalQuickAddPopover *self)
{
+ GcalCalendar *default_calendar;
GcalManager *manager;
GtkWidget *row;
ESource *default_source;
manager = gcal_context_get_manager (self->context);
default_source = gcal_manager_get_default_source (manager);
+ default_calendar = gcal_manager_get_calendar_from_source (manager, default_source);
- row = get_row_for_source (self, default_source);
+ row = get_row_for_calendar (self, default_calendar);
select_row (self, GTK_LIST_BOX_ROW (row));
g_clear_object (&default_source);
@@ -504,43 +508,47 @@ update_default_calendar_row (GcalQuickAddPopover *self)
*/
static void
-on_source_added (GcalManager *manager,
- ESource *source,
- gboolean enabled,
- GcalQuickAddPopover *self)
+on_calendar_added (GcalManager *manager,
+ GcalCalendar *calendar,
+ GcalQuickAddPopover *self)
{
ESource *default_source;
GtkWidget *row;
/* Since we can't add on read-only calendars, lets not show them at all */
- if (!gcal_manager_is_client_writable (manager, source))
+ if (gcal_calendar_is_read_only (calendar))
return;
default_source = gcal_manager_get_default_source (manager);
- row = create_row_for_source (manager, source, gcal_manager_is_client_writable (manager, source));
+ row = create_calendar_row (manager, calendar);
gtk_container_add (GTK_CONTAINER (self->calendars_listbox), row);
/* Select the default source whe first adding events */
- if (source == default_source && !self->selected_row)
- select_row (self, GTK_LIST_BOX_ROW (row));
+ if (gcal_calendar_get_source (calendar) == default_source &&
+ !self->selected_row)
+ {
+ select_row (self, GTK_LIST_BOX_ROW (row));
+ }
g_clear_object (&default_source);
}
static void
-on_source_changed (GcalManager *manager,
- ESource *source,
- GcalQuickAddPopover *self)
+on_calendar_changed (GcalManager *manager,
+ GcalCalendar *calendar,
+ GcalQuickAddPopover *self)
{
cairo_surface_t *surface;
+ const GdkRGBA *color;
GtkWidget *row, *color_icon, *name_label;
- GdkRGBA color;
+ gboolean read_only;
- row = get_row_for_source (self, source);
+ read_only = gcal_calendar_is_read_only (calendar);
+ row = get_row_for_calendar (self, calendar);
/* If the calendar changed from/to read-only, we add or remove it here */
- if (!gcal_manager_is_client_writable (manager, source))
+ if (read_only)
{
if (row)
gtk_container_remove (GTK_CONTAINER (self->calendars_listbox), row);
@@ -549,29 +557,26 @@ on_source_changed (GcalManager *manager,
}
else if (!row)
{
- on_source_added (manager,
- source,
- is_source_enabled (source),
- self);
+ on_calendar_added (manager, calendar, self);
- row = get_row_for_source (self, source);
+ row = get_row_for_calendar (self, calendar);
}
color_icon = g_object_get_data (G_OBJECT (row), "color-icon");
name_label = g_object_get_data (G_OBJECT (row), "name-label");
/* If the source is writable now (or not), update sensitivity */
- gtk_widget_set_sensitive (row, gcal_manager_is_client_writable (manager, source));
+ gtk_widget_set_sensitive (row, !read_only);
/* Setup the source color, in case it changed */
- get_color_name_from_source (source, &color);
- surface = get_circle_surface_from_color (&color, 16);
+ color = gcal_calendar_get_color (calendar);
+ surface = get_circle_surface_from_color (color, 16);
gtk_image_set_from_surface (GTK_IMAGE (color_icon), surface);
g_clear_pointer (&surface, cairo_surface_destroy);
/* Also setup the row name, in case we just changed the source name */
- gtk_label_set_text (GTK_LABEL (name_label), e_source_get_display_name (source));
+ gtk_label_set_text (GTK_LABEL (name_label), gcal_calendar_get_name (calendar));
gtk_list_box_invalidate_sort (GTK_LIST_BOX (self->calendars_listbox));
@@ -584,13 +589,13 @@ on_source_changed (GcalManager *manager,
}
static void
-on_source_removed (GcalManager *manager,
- ESource *source,
- GcalQuickAddPopover *self)
+on_calendar_removed (GcalManager *manager,
+ GcalCalendar *calendar,
+ GcalQuickAddPopover *self)
{
GtkWidget *row;
- row = get_row_for_source (self, source);
+ row = get_row_for_calendar (self, calendar);
if (!row)
return;
@@ -604,15 +609,15 @@ sort_func (GtkListBoxRow *row1,
GtkListBoxRow *row2,
gpointer user_data)
{
- ESource *source1, *source2;
+ GcalCalendar *calendar1, *calendar2;
gchar *name1, *name2;
gint retval;
- source1 = g_object_get_data (G_OBJECT (row1), "source");
- source2 = g_object_get_data (G_OBJECT (row2), "source");
+ calendar1 = g_object_get_data (G_OBJECT (row1), "calendar");
+ calendar2 = g_object_get_data (G_OBJECT (row2), "calendar");
- name1 = g_utf8_casefold (e_source_get_display_name (source1), -1);
- name2 = g_utf8_casefold (e_source_get_display_name (source2), -1);
+ name1 = g_utf8_casefold (gcal_calendar_get_name (calendar1), -1);
+ name2 = g_utf8_casefold (gcal_calendar_get_name (calendar2), -1);
retval = g_strcmp0 (name1, name2);
@@ -644,7 +649,6 @@ edit_or_create_event (GcalQuickAddPopover *self,
GDateTime *date_start, *date_end;
GTimeZone *tz;
GcalEvent *event;
- ESource *source;
const gchar *summary;
gboolean all_day, single_day;
@@ -652,8 +656,7 @@ edit_or_create_event (GcalQuickAddPopover *self,
return;
manager = gcal_context_get_manager (self->context);
- source = g_object_get_data (G_OBJECT (self->selected_row), "source");
- calendar = gcal_manager_get_calendar_from_source (manager, source);
+ calendar = g_object_get_data (G_OBJECT (self->selected_row), "calendar");
single_day = gcal_date_time_compare_date (self->date_end, self->date_start) == 0;
all_day = gcal_date_time_compare_date (self->date_end, self->date_start) > 1 ||
@@ -799,20 +802,14 @@ gcal_quick_add_popover_set_property (GObject *object,
calendars = gcal_manager_get_calendars (manager);
for (l = calendars; l; l = l->next)
- {
- GcalCalendar *calendar = l->data;
- on_source_added (manager,
- gcal_calendar_get_source (calendar),
- gcal_calendar_get_visible (calendar),
- self);
- }
+ on_calendar_added (manager, l->data, self);
g_list_free (calendars);
/* Connect to the manager signals and keep the list updates */
- g_signal_connect (manager, "source-added", G_CALLBACK (on_source_added), self);
- g_signal_connect (manager, "source-changed", G_CALLBACK (on_source_changed), self);
- g_signal_connect (manager, "source-removed", G_CALLBACK (on_source_removed), self);
+ g_signal_connect (manager, "calendar-added", G_CALLBACK (on_calendar_added), self);
+ g_signal_connect (manager, "calendar-changed", G_CALLBACK (on_calendar_changed), self);
+ g_signal_connect (manager, "calendar-removed", G_CALLBACK (on_calendar_removed), self);
g_signal_connect_swapped (manager, "notify::default-calendar", G_CALLBACK
(update_default_calendar_row), self);
g_signal_connect_object (self->context,
diff --git a/src/gcal-source-dialog.c b/src/gcal-source-dialog.c
index dae63b63..b36553c9 100644
--- a/src/gcal-source-dialog.c
+++ b/src/gcal-source-dialog.c
@@ -102,7 +102,7 @@ struct _GcalSourceDialog
GcalSourceDialogMode mode;
ESource *source;
GList *remote_sources;
- ESource *removed_source;
+ GcalCalendar *removed_calendar;
ESource *old_default_source;
GBinding *title_bind;
gboolean prompt_password;
@@ -126,11 +126,6 @@ typedef enum
static void add_button_clicked (GtkWidget *button,
gpointer user_data);
-static void add_source (GcalManager *manager,
- ESource *source,
- gboolean enabled,
- gpointer user_data);
-
static void action_widget_activated (GtkWidget *widget,
gpointer user_data);
@@ -175,9 +170,6 @@ static void display_header_func (GtkListBoxRow *r
static gboolean is_goa_source (GcalSourceDialog *dialog,
ESource *source);
-static GtkWidget* make_row_from_source (GcalSourceDialog *dialog,
- ESource *source);
-
static void name_entry_text_changed (GObject *object,
GParamSpec *pspec,
gpointer user_data);
@@ -205,10 +197,6 @@ static void on_web_activated (GSimpleAction *ac
GVariant *param,
gpointer user_data);
-static void remove_source (GcalManager *manager,
- ESource *source,
- gpointer user_data);
-
static void response_signal (GtkDialog *dialog,
gint response_id,
gpointer user_data);
@@ -302,22 +290,87 @@ add_button_clicked (GtkWidget *button,
}
static void
-add_source (GcalManager *manager,
- ESource *source,
- gboolean enabled,
- gpointer user_data)
+source_color_changed (GcalCalendar *calendar,
+ GParamSpec *pspec,
+ GtkImage *icon)
+{
+ cairo_surface_t *surface;
+ const GdkRGBA *color;
+
+ color = gcal_calendar_get_color (calendar);
+ surface = get_circle_surface_from_color (color, 24);
+ gtk_image_set_from_surface (GTK_IMAGE (icon), surface);
+ g_clear_pointer (&surface, cairo_surface_destroy);
+}
+
+static GtkWidget*
+make_calendar_row (GcalSourceDialog *dialog,
+ GcalCalendar *calendar)
+{
+ cairo_surface_t *surface;
+ const GdkRGBA *color;
+ GcalManager *manager;
+ GtkBuilder *builder;
+ GtkWidget *bottom_label;
+ GtkWidget *top_label;
+ GtkWidget *icon;
+ GtkWidget *row;
+ gchar *parent_name;
+
+ manager = gcal_context_get_manager (dialog->context);
+ get_source_parent_name_color (manager, gcal_calendar_get_source (calendar), &parent_name, NULL);
+
+ builder = gtk_builder_new_from_resource ("/org/gnome/calendar/calendar-row.ui");
+
+ /*
+ * Since we're destroying the builder instance before adding
+ * the row to the listbox, it should be referenced here so
+ * it isn't destroyed with the GtkBuilder.
+ */
+ row = g_object_ref (GTK_WIDGET (gtk_builder_get_object (builder, "row")));
+
+ /* source color icon */
+ color = gcal_calendar_get_color (calendar);
+ surface = get_circle_surface_from_color (color, 24);
+ icon = GTK_WIDGET (gtk_builder_get_object (builder, "icon"));
+ gtk_image_set_from_surface (GTK_IMAGE (icon), surface);
+
+ /* source name label */
+ top_label = GTK_WIDGET (gtk_builder_get_object (builder, "title"));
+ gtk_label_set_label (GTK_LABEL (top_label), gcal_calendar_get_name (calendar));
+ g_object_bind_property (calendar, "name", top_label, "label", G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE);
+ g_signal_connect_swapped (calendar,
+ "notify::name",
+ G_CALLBACK (gtk_list_box_invalidate_sort),
+ dialog->calendars_listbox);
+
+ g_signal_connect (calendar, "notify::color", G_CALLBACK (source_color_changed), icon);
+
+ /* parent source name label */
+ bottom_label = GTK_WIDGET (gtk_builder_get_object (builder, "subtitle"));
+ gtk_label_set_label (GTK_LABEL (bottom_label), parent_name);
+
+ g_clear_pointer (&surface, cairo_surface_destroy);
+ g_object_unref (builder);
+ g_free (parent_name);
+
+ return row;
+}
+
+static void
+add_calendar (GcalManager *manager,
+ GcalCalendar *calendar,
+ GcalSourceDialog *self)
{
- GcalSourceDialog *self;
GList *children, *l;
gboolean contains_source;
- self = GCAL_SOURCE_DIALOG (user_data);
children = gtk_container_get_children (GTK_CONTAINER (self->calendars_listbox));
contains_source = FALSE;
for (l = children; l != NULL; l = l->next)
{
- if (g_object_get_data (l->data, "source") == source)
+ if (g_object_get_data (l->data, "calendar") == calendar)
{
contains_source = TRUE;
break;
@@ -327,11 +380,13 @@ add_source (GcalManager *manager,
if (!contains_source)
{
GtkWidget *row;
+ ESource *source;
ESource *parent;
+ source = gcal_calendar_get_source (calendar);
parent = gcal_manager_get_source (manager, e_source_get_parent (source));
- row = make_row_from_source (GCAL_SOURCE_DIALOG (user_data), source);
+ row = make_calendar_row (self, calendar);
g_object_set_data (G_OBJECT (row), "source", source);
if (e_source_has_extension (parent, E_SOURCE_EXTENSION_GOA))
@@ -566,95 +621,6 @@ is_goa_source (GcalSourceDialog *dialog,
return is_goa;
}
-static void
-source_color_changed (GObject *source,
- GParamSpec *pspec,
- GtkImage *icon)
-{
- ESourceSelectable *extension;
- cairo_surface_t *surface;
- GdkRGBA out_color;
-
- extension = E_SOURCE_SELECTABLE (source);
-
- if (!gdk_rgba_parse (&out_color, e_source_selectable_get_color (extension)))
- {
- g_warning ("Error parsing color");
- return;
- }
-
- if (gdk_rgba_parse (&out_color, e_source_selectable_get_color (extension)))
- {
- surface = get_circle_surface_from_color (&out_color, 24);
- gtk_image_set_from_surface (GTK_IMAGE (icon), surface);
- g_clear_pointer (&surface, cairo_surface_destroy);
- }
-}
-
-static void
-invalidate_calendar_listbox_sort (GObject *source,
- GParamSpec *pspec,
- gpointer user_data)
-{
- g_return_if_fail (GTK_IS_LIST_BOX (user_data));
-
- gtk_list_box_invalidate_sort (GTK_LIST_BOX (user_data));
-}
-
-static GtkWidget*
-make_row_from_source (GcalSourceDialog *dialog,
- ESource *source)
-{
- ESourceSelectable *extension;
- cairo_surface_t *surface;
- GcalManager *manager;
- GtkBuilder *builder;
- GtkWidget *bottom_label;
- GtkWidget *top_label;
- GtkWidget *icon;
- GtkWidget *row;
- GdkRGBA color;
- gchar *parent_name;
-
- manager = gcal_context_get_manager (dialog->context);
- get_source_parent_name_color (manager, source, &parent_name, NULL);
-
- builder = gtk_builder_new_from_resource ("/org/gnome/calendar/calendar-row.ui");
-
- /*
- * Since we're destroying the builder instance before adding
- * the row to the listbox, it should be referenced here so
- * it isn't destroyed with the GtkBuilder.
- */
- row = g_object_ref (GTK_WIDGET (gtk_builder_get_object (builder, "row")));
-
- /* source color icon */
- get_color_name_from_source (source, &color);
- surface = get_circle_surface_from_color (&color, 24);
- icon = GTK_WIDGET (gtk_builder_get_object (builder, "icon"));
- gtk_image_set_from_surface (GTK_IMAGE (icon), surface);
-
- /* source name label */
- top_label = GTK_WIDGET (gtk_builder_get_object (builder, "title"));
- gtk_label_set_label (GTK_LABEL (top_label), e_source_get_display_name (source));
- g_object_bind_property (source, "display-name", top_label, "label", G_BINDING_DEFAULT |
G_BINDING_SYNC_CREATE);
- g_signal_connect (source, "notify::display-name", G_CALLBACK (invalidate_calendar_listbox_sort),
- dialog->calendars_listbox);
-
- extension = E_SOURCE_SELECTABLE (e_source_get_extension (source, E_SOURCE_EXTENSION_CALENDAR));
- g_signal_connect (extension, "notify::color", G_CALLBACK (source_color_changed), icon);
-
- /* parent source name label */
- bottom_label = GTK_WIDGET (gtk_builder_get_object (builder, "subtitle"));
- gtk_label_set_label (GTK_LABEL (bottom_label), parent_name);
-
- g_clear_pointer (&surface, cairo_surface_destroy);
- g_object_unref (builder);
- g_free (parent_name);
-
- return row;
-}
-
static void
name_entry_text_changed (GObject *object,
GParamSpec *pspec,
@@ -1643,30 +1609,20 @@ discover_sources_cb (GObject *source,
g_slist_free_full (user_addresses, g_free);
}
-/**
- * remove_source:
- *
- * Removes the given source from the source
- * list.
- *
- * Returns:
- */
static void
-remove_source (GcalManager *manager,
- ESource *source,
- gpointer user_data)
+remove_calendar (GcalManager *manager,
+ GcalCalendar *calendar,
+ GcalSourceDialog *self)
{
- GcalSourceDialog *self;
GList *children, *aux;
- self = GCAL_SOURCE_DIALOG (user_data);
children = gtk_container_get_children (GTK_CONTAINER (self->calendars_listbox));
for (aux = children; aux != NULL; aux = aux->next)
{
- ESource *child_source = g_object_get_data (G_OBJECT (aux->data), "source");
+ GcalCalendar *row_calendar = g_object_get_data (G_OBJECT (aux->data), "calendar");
- if (child_source != NULL && child_source == source)
+ if (row_calendar && row_calendar == calendar)
{
gtk_widget_destroy (aux->data);
break;
@@ -1698,18 +1654,21 @@ notification_child_revealed_changed (GtkWidget *notification,
manager = gcal_context_get_manager (self->context);
/* If we have any removed source, delete it */
- if (self->removed_source != NULL)
+ if (self->removed_calendar != NULL)
{
- GError *error = NULL;
+ g_autoptr (GError) error = NULL;
+ ESource *removed_source;
+
+ removed_source = gcal_calendar_get_source (self->removed_calendar);
/* We don't really want to remove non-removable sources */
- if (!e_source_get_removable (self->removed_source))
+ if (!e_source_get_removable (removed_source))
return;
/* Enable the source again to remove it's name from disabled list */
- gcal_manager_enable_source (manager, self->removed_source);
+ gcal_manager_enable_source (manager, removed_source);
- e_source_remove_sync (self->removed_source, NULL, &error);
+ e_source_remove_sync (removed_source, NULL, &error);
/**
* If something goes wrong, throw
@@ -1719,14 +1678,8 @@ notification_child_revealed_changed (GtkWidget *notification,
{
g_warning ("[source-dialog] Error removing source: %s", error->message);
- add_source (manager,
- self->removed_source,
- is_source_enabled (self->removed_source),
- user_data);
-
- gcal_manager_enable_source (manager, self->removed_source);
-
- g_error_free (error);
+ add_calendar (manager, self->removed_calendar, self);
+ gcal_manager_enable_source (manager, removed_source);
}
}
}
@@ -1748,21 +1701,22 @@ undo_remove_action (GtkButton *button,
manager = gcal_context_get_manager (self->context);
/* if there's any set source, unremove it */
- if (self->removed_source != NULL)
+ if (self->removed_calendar != NULL)
{
+ ESource *removed_source;
+
+ removed_source = gcal_calendar_get_source (self->removed_calendar);
+
/* Enable the source before adding it again */
- gcal_manager_enable_source (manager, self->removed_source);
+ gcal_manager_enable_source (manager, removed_source);
- add_source (manager,
- self->removed_source,
- is_source_enabled (self->removed_source),
- user_data);
+ add_calendar (manager, self->removed_calendar, self);
/*
* Don't clear the pointer, since we don't
* want to erase the source at all.
*/
- self->removed_source = NULL;
+ self->removed_calendar = NULL;
/* Hide notification */
gtk_revealer_set_reveal_child (GTK_REVEALER (self->notification), FALSE);
@@ -1820,10 +1774,12 @@ remove_button_clicked (GtkWidget *button,
if (self->source != NULL)
{
+ ESource *removed_source;
GList *children, *l;
gchar *str;
- self->removed_source = self->source;
+ removed_source = self->source;
+ self->removed_calendar = gcal_manager_get_calendar_from_source (manager, removed_source);
self->source = NULL;
children = gtk_container_get_children (GTK_CONTAINER (self->calendars_listbox));
@@ -1832,7 +1788,7 @@ remove_button_clicked (GtkWidget *button,
/* Remove the listbox entry (if any) */
for (l = children; l != NULL; l = l->next)
{
- if (g_object_get_data (l->data, "source") == self->removed_source)
+ if (g_object_get_data (l->data, "calendar") == self->removed_calendar)
{
gtk_widget_destroy (l->data);
break;
@@ -1840,7 +1796,7 @@ remove_button_clicked (GtkWidget *button,
}
/* Update notification label */
- str = g_markup_printf_escaped (_("Calendar <b>%s</b> removed"), e_source_get_display_name
(self->removed_source));
+ str = g_markup_printf_escaped (_("Calendar <b>%s</b> removed"), gcal_calendar_get_name
(self->removed_calendar));
gtk_label_set_markup (GTK_LABEL (self->notification_label), str);
/* Remove old notifications */
@@ -1850,7 +1806,7 @@ remove_button_clicked (GtkWidget *button,
self->notification_timeout_id = g_timeout_add_seconds (5, hide_notification_scheduled, user_data);
/* Disable the source, so it gets hidden */
- gcal_manager_disable_source (manager, self->removed_source);
+ gcal_manager_disable_source (manager, removed_source);
g_list_free (children);
g_free (str);
@@ -2056,8 +2012,8 @@ setup_context (GcalSourceDialog *self)
g_signal_connect (client, "account-removed", G_CALLBACK (goa_account_removed_cb), self);
manager = gcal_context_get_manager (self->context);
- g_signal_connect (manager, "source-added", G_CALLBACK (add_source), self);
- g_signal_connect (manager, "source-removed", G_CALLBACK (remove_source), self);
+ g_signal_connect (manager, "calendar-added", G_CALLBACK (add_calendar), self);
+ g_signal_connect (manager, "calendar-removed", G_CALLBACK (remove_calendar), self);
g_list_free_full (accounts, g_object_unref);
diff --git a/src/gcal-window.c b/src/gcal-window.c
index 3e03bbe8..7bc8d78a 100644
--- a/src/gcal-window.c
+++ b/src/gcal-window.c
@@ -666,41 +666,14 @@ hide_notification_scheduled (gpointer window)
return FALSE;
}
-static void
-on_calendar_toggled (GObject *object,
- GParamSpec *pspec,
- gpointer user_data)
-{
- GcalManager *manager;
- GcalWindow *window;
- gboolean active;
- GtkWidget *row;
- ESource *source;
-
- window = GCAL_WINDOW (user_data);
- manager = gcal_context_get_manager (window->context);
- active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (object));
- row = gtk_widget_get_parent (gtk_widget_get_parent (GTK_WIDGET (object)));
- source = g_object_get_data (G_OBJECT (row), "source");
-
- if (source == NULL)
- return;
-
- /* Enable/disable the toggled calendar */
- if (active)
- gcal_manager_enable_source (manager, source);
- else
- gcal_manager_disable_source (manager, source);
-}
-
static GtkWidget*
-make_row_from_source (GcalWindow *window,
- ESource *source)
+make_calendar_row (GcalWindow *window,
+ GcalCalendar *calendar)
{
GtkWidget *label, *icon, *checkbox, *box, *row;
GtkStyleContext *context;
cairo_surface_t *surface;
- GdkRGBA color;
+ const GdkRGBA *color;
row = gtk_list_box_row_new ();
@@ -715,21 +688,24 @@ make_row_from_source (GcalWindow *window,
gtk_container_set_border_width (GTK_CONTAINER (box), 6);
/* source color icon */
- get_color_name_from_source (source, &color);
- surface = get_circle_surface_from_color (&color, 16);
+ color = gcal_calendar_get_color (calendar);
+ surface = get_circle_surface_from_color (color, 16);
icon = gtk_image_new_from_surface (surface);
gtk_style_context_add_class (gtk_widget_get_style_context (icon), "calendar-color-image");
/* source name label */
- label = gtk_label_new (e_source_get_display_name (source));
+ label = gtk_label_new (gcal_calendar_get_name (calendar));
gtk_label_set_xalign (GTK_LABEL (label), 0.0);
gtk_widget_set_hexpand (label, TRUE);
/* checkbox */
checkbox = gtk_check_button_new ();
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkbox), is_source_enabled (source));
- g_signal_connect (checkbox, "notify::active", G_CALLBACK (on_calendar_toggled), window);
+ g_object_bind_property (calendar,
+ "visible",
+ checkbox,
+ "active",
+ G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
gtk_container_add (GTK_CONTAINER (box), icon);
gtk_container_add (GTK_CONTAINER (box), label);
@@ -737,7 +713,7 @@ make_row_from_source (GcalWindow *window,
gtk_container_add (GTK_CONTAINER (row), box);
g_object_set_data (G_OBJECT (row), "check", checkbox);
- g_object_set_data (G_OBJECT (row), "source", source);
+ g_object_set_data (G_OBJECT (row), "calendar", calendar);
gtk_widget_show_all (row);
@@ -747,36 +723,30 @@ make_row_from_source (GcalWindow *window,
}
static void
-add_source (GcalManager *manager,
- ESource *source,
- gboolean enabled,
- gpointer user_data)
+add_calendar (GcalManager *manager,
+ GcalCalendar *calendar,
+ GcalWindow *self)
{
- GcalWindow *window;
GtkWidget *row;
- window = GCAL_WINDOW (user_data);
-
- row = make_row_from_source (GCAL_WINDOW (user_data), source);
-
- gtk_container_add (GTK_CONTAINER (window->calendar_listbox), row);
+ row = make_calendar_row (self, calendar);
+ gtk_container_add (GTK_CONTAINER (self->calendar_listbox), row);
}
static void
-remove_source (GcalManager *manager,
- ESource *source,
- gpointer user_data)
+remove_calendar (GcalManager *manager,
+ GcalCalendar *calendar,
+ GcalWindow *self)
{
- GcalWindow *window = GCAL_WINDOW (user_data);
GList *children, *aux;
- children = gtk_container_get_children (GTK_CONTAINER (window->calendar_listbox));
+ children = gtk_container_get_children (GTK_CONTAINER (self->calendar_listbox));
for (aux = children; aux != NULL; aux = aux->next)
{
- ESource *child_source = g_object_get_data (G_OBJECT (aux->data), "source");
+ GcalCalendar *row_calendar = g_object_get_data (G_OBJECT (aux->data), "calendar");
- if (child_source != NULL && child_source == source)
+ if (row_calendar && row_calendar == calendar)
{
gtk_widget_destroy (aux->data);
break;
@@ -800,62 +770,11 @@ source_row_activated (GtkListBox *listbox,
}
static void
-source_enabled (GcalWindow *self,
- ESource *source,
- gboolean enabled)
-{
- GList *children, *aux;
-
- children = gtk_container_get_children (GTK_CONTAINER (self->calendar_listbox));
-
- for (aux = children; aux != NULL; aux = aux->next)
- {
- ESource *child_source = g_object_get_data (G_OBJECT (aux->data), "source");
-
- if (child_source != NULL && child_source == source)
- {
- GtkToggleButton *button = g_object_get_data (G_OBJECT (aux->data), "check");
-
- g_signal_handlers_block_by_func (button, on_calendar_toggled, self);
- gtk_toggle_button_set_active (button, enabled);
- g_signal_handlers_unblock_by_func (button, on_calendar_toggled, self);
-
- break;
- }
- }
-
- g_list_free (children);
-}
-
-static void
-source_changed (GcalWindow *window,
- ESource *source)
+calendar_changed (GcalWindow *window,
+ GcalCalendar *calendar)
{
- GcalManager *manager;
- GList *children, *aux;
-
- manager = gcal_context_get_manager (window->context);
- children = gtk_container_get_children (GTK_CONTAINER (window->calendar_listbox));
-
- for (aux = children; aux != NULL; aux = aux->next)
- {
- ESource *child_source = g_object_get_data (G_OBJECT (aux->data), "source");
-
- /*
- * Here we destroy the row and re-add it because there is no
- * way to actually bind the ::enabled state of source. It behaves
- * like a construct-only property, and we need to re-create the
- * row if there's any changes.
- */
- if (child_source != NULL && child_source == source)
- {
- gtk_widget_destroy (aux->data);
- add_source (manager, source, is_source_enabled (source), window);
- break;
- }
- }
-
- g_list_free (children);
+ remove_calendar (NULL, calendar, window);
+ add_calendar (NULL, calendar, window);
}
static gboolean
@@ -1204,19 +1123,12 @@ gcal_window_set_property (GObject *object,
calendars = gcal_manager_get_calendars (manager);
for (l = calendars; l; l = l->next)
- {
- GcalCalendar *calendar = l->data;
- add_source (manager,
- gcal_calendar_get_source (calendar),
- gcal_calendar_get_visible (calendar),
- self);
- }
+ add_calendar (manager, l->data, self);
}
- g_signal_connect (manager, "source-added", G_CALLBACK (add_source), object);
- g_signal_connect (manager, "source-removed", G_CALLBACK (remove_source), object);
- g_signal_connect_swapped (manager, "source-enabled", G_CALLBACK (source_enabled), object);
- g_signal_connect_swapped (manager, "source-changed", G_CALLBACK (source_changed), object);
+ g_signal_connect (manager, "calendar-added", G_CALLBACK (add_calendar), object);
+ g_signal_connect (manager, "calendar-removed", G_CALLBACK (remove_calendar), object);
+ g_signal_connect_swapped (manager, "calendar-changed", G_CALLBACK (calendar_changed), object);
g_object_notify_by_pspec (object, properties[PROP_CONTEXT]);
}
diff --git a/src/search/gcal-search-engine.c b/src/search/gcal-search-engine.c
index cd9ad95c..9c974c46 100644
--- a/src/search/gcal-search-engine.c
+++ b/src/search/gcal-search-engine.c
@@ -111,50 +111,41 @@ search_func (GTask *task,
}
static void
-on_manager_source_added_cb (GcalManager *manager,
- ESource *source,
- gboolean enabled,
- GcalSearchEngine *self)
+on_manager_calendar_added_cb (GcalManager *manager,
+ GcalCalendar *calendar,
+ GcalSearchEngine *self)
{
ECalClient *client;
- g_debug ("Removing source %s from search results", e_source_get_uid (source));
+ g_debug ("Removing source %s from search results", gcal_calendar_get_id (calendar));
- client = gcal_manager_get_client (manager, source);
+ client = gcal_calendar_get_client (calendar);
- if (enabled)
+ if (gcal_calendar_get_visible (calendar))
e_cal_data_model_add_client (self->data_model, client);
}
static void
-on_manager_source_enabled_cb (GcalManager *manager,
- ESource *source,
- gboolean enabled,
- GcalSearchEngine *self)
+on_manager_calendar_changed_cb (GcalManager *manager,
+ GcalCalendar *calendar,
+ GcalSearchEngine *self)
{
- g_debug ("Changing source %s from search results", e_source_get_uid (source));
-
- if (enabled)
- {
- ECalClient *client;
+ g_debug ("Changing source %s from search results", gcal_calendar_get_id (calendar));
- client = gcal_manager_get_client (manager, source);
- e_cal_data_model_add_client (self->data_model, client);
- }
+ if (gcal_calendar_get_visible (calendar))
+ e_cal_data_model_add_client (self->data_model, gcal_calendar_get_client (calendar));
else
- {
- e_cal_data_model_remove_client (self->data_model, e_source_get_uid (source));
- }
+ e_cal_data_model_remove_client (self->data_model, gcal_calendar_get_id (calendar));
}
static void
-on_manager_source_removed_cb (GcalManager *manager,
- ESource *source,
- GcalSearchEngine *self)
+on_manager_calendar_removed_cb (GcalManager *manager,
+ GcalCalendar *calendar,
+ GcalSearchEngine *self)
{
- g_debug ("Removing source %s from search results", e_source_get_uid (source));
+ g_debug ("Removing source %s from search results", gcal_calendar_get_id (calendar));
- e_cal_data_model_remove_client (self->data_model, e_source_get_uid (source));
+ e_cal_data_model_remove_client (self->data_model, gcal_calendar_get_id (calendar));
}
static void
@@ -196,9 +187,9 @@ gcal_search_engine_constructed (GObject *object)
manager = gcal_context_get_manager (self->context);
- g_signal_connect_object (manager, "source-added", G_CALLBACK (on_manager_source_added_cb), self, 0);
- g_signal_connect_object (manager, "source-removed", G_CALLBACK (on_manager_source_removed_cb), self, 0);
- g_signal_connect_object (manager, "source-enabled", G_CALLBACK (on_manager_source_enabled_cb), self, 0);
+ g_signal_connect_object (manager, "calendar-added", G_CALLBACK (on_manager_calendar_added_cb), self, 0);
+ g_signal_connect_object (manager, "calendar-changed", G_CALLBACK (on_manager_calendar_changed_cb), self,
0);
+ g_signal_connect_object (manager, "calendar-removed", G_CALLBACK (on_manager_calendar_removed_cb), self,
0);
g_signal_connect_object (self->context,
"notify::timezone",
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]