manager: Rework signals to use GcalCalendar

This commit is contained in:
Georges Basile Stavracas Neto
2019-05-04 12:05:39 -03:00
parent 1118c74881
commit ea60c95a44
6 changed files with 259 additions and 413 deletions
+2 -2
View File
@@ -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);
}
+31 -41
View File
@@ -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);
GCAL_TYPE_CALENDAR);
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[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[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);
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);
+66 -69
View File
@@ -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,
+108 -152
View File
@@ -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)
{
/* Enable the source before adding it again */
gcal_manager_enable_source (manager, self->removed_source);
ESource *removed_source;
add_source (manager,
self->removed_source,
is_source_enabled (self->removed_source),
user_data);
removed_source = gcal_calendar_get_source (self->removed_calendar);
/* Enable the source before adding it again */
gcal_manager_enable_source (manager, removed_source);
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);
+31 -119
View File
@@ -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)
calendar_changed (GcalWindow *window,
GcalCalendar *calendar)
{
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)
{
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]);
}
+21 -30
View File
@@ -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));
g_debug ("Changing source %s from search results", gcal_calendar_get_id (calendar));
if (enabled)
{
ECalClient *client;
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",