[gnome-todo] window: provide some feedback on errors



commit f57c49b8b51a6f0de7133a53dec738624084ebad
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date:   Thu Aug 27 11:00:06 2015 -0300

    window: provide some feedback on errors

 src/gtd-manager.c |   68 +++++++++++++++++++++++++++++++++++++++++++++
 src/gtd-window.c  |   79 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 147 insertions(+), 0 deletions(-)
---
diff --git a/src/gtd-manager.c b/src/gtd-manager.c
index 375b449..df28f43 100644
--- a/src/gtd-manager.c
+++ b/src/gtd-manager.c
@@ -85,6 +85,7 @@ enum
   LIST_ADDED,
   LIST_CHANGED,
   LIST_REMOVED,
+  SHOW_ERROR_MESSAGE,
   STORAGE_ADDED,
   STORAGE_CHANGED,
   STORAGE_REMOVED,
@@ -135,6 +136,18 @@ is_today (GDateTime *dt)
 }
 
 static void
+emit_show_error_message (GtdManager  *manager,
+                         const gchar *primary_text,
+                         const gchar *secondary_text)
+{
+  g_signal_emit (manager,
+                 signals[SHOW_ERROR_MESSAGE],
+                 0,
+                 primary_text,
+                 secondary_text);
+}
+
+static void
 gtd_manager__setup_url (GtdManager *manager,
                         GtdStorageGoa *storage)
 {
@@ -373,6 +386,10 @@ gtd_manager__goa_client_finish_cb (GObject      *client,
                  _("Error loading GNOME Online Accounts"),
                  error->message);
 
+      emit_show_error_message (GTD_MANAGER (user_data),
+                               _("Error loading GNOME Online Accounts"),
+                               error->message);
+
       g_clear_error (&error);
     }
 
@@ -401,6 +418,10 @@ gtd_manager__commit_source_finished (GObject      *registry,
                  _("Error saving task list"),
                  error->message);
 
+      emit_show_error_message (GTD_MANAGER (user_data),
+                               _("Error saving task list"),
+                               error->message);
+
       g_error_free (error);
       return;
     }
@@ -420,6 +441,10 @@ task_list_removal_finished (GtdManager  *manager,
                  _("Error removing task list"),
                  (*error)->message);
 
+      emit_show_error_message (manager,
+                               _("Error removing task list"),
+                               (*error)->message);
+
       g_clear_error (error);
     }
 }
@@ -444,6 +469,10 @@ gtd_manager__remote_create_source_finished (GObject      *source,
                  _("Error creating task list"),
                  error->message);
 
+      emit_show_error_message (GTD_MANAGER (user_data),
+                               _("Error creating task list"),
+                               error->message);
+
       g_clear_error (&error);
     }
 }
@@ -505,6 +534,10 @@ gtd_manager__create_task_finished (GObject      *client,
                  _("Error creating task"),
                  error->message);
 
+      emit_show_error_message (GTD_MANAGER (user_data),
+                               _("Error creating task"),
+                               error->message);
+
       g_error_free (error);
       g_free (data);
       return;
@@ -568,6 +601,10 @@ gtd_manager__remove_task_finished (GObject      *client,
                  _("Error removing task"),
                  error->message);
 
+      emit_show_error_message (GTD_MANAGER (user_data),
+                               _("Error removing task"),
+                               error->message);
+
       g_error_free (error);
       return;
     }
@@ -620,6 +657,10 @@ gtd_manager__update_task_finished (GObject      *client,
                  _("Error updating task"),
                  error->message);
 
+      emit_show_error_message (GTD_MANAGER (user_data),
+                               _("Error updating task"),
+                               error->message);
+
       g_error_free (error);
       return;
     }
@@ -788,6 +829,10 @@ gtd_manager__fill_task_list (GObject      *client,
                  _("Error fetching tasks from list"),
                  error->message);
 
+      emit_show_error_message (GTD_MANAGER (user_data),
+                               _("Error fetching tasks from list"),
+                               error->message);
+
       g_error_free (error);
       return;
     }
@@ -862,6 +907,10 @@ gtd_manager__on_client_connected (GObject      *source_object,
                e_source_get_uid (source),
                error->message);
 
+      emit_show_error_message (GTD_MANAGER (user_data),
+                               _("Failed to connect to task list source"),
+                               error->message);
+
       g_error_free (error);
       return;
     }
@@ -1191,6 +1240,25 @@ gtd_manager_class_init (GtdManagerClass *klass)
                                         GTD_TYPE_TASK_LIST);
 
   /**
+   * GtdManager::show-error-message:
+   *
+   * Notifies about errors, and sends the error message for widgets
+   * to display.
+   *
+   */
+  signals[SHOW_ERROR_MESSAGE] = g_signal_new ("show-error-message",
+                                              GTD_TYPE_MANAGER,
+                                              G_SIGNAL_RUN_LAST,
+                                              0,
+                                              NULL,
+                                              NULL,
+                                              NULL,
+                                              G_TYPE_NONE,
+                                              2,
+                                              G_TYPE_STRING,
+                                              G_TYPE_STRING);
+
+  /**
    * GtdManager::storage-added:
    *
    * The ::storage-added signal is emmited after a #GtdStorage
diff --git a/src/gtd-window.c b/src/gtd-window.c
index f82dcb0..74b63dc 100644
--- a/src/gtd-window.c
+++ b/src/gtd-window.c
@@ -102,6 +102,54 @@ enum {
   LAST_PROP
 };
 
+/* GtdManager's error notifications */
+typedef struct
+{
+  GtdWindow *window;
+  gchar     *primary_text;
+  gchar     *secondary_text;
+} ErrorData;
+
+static void
+error_data_free (ErrorData *error_data)
+{
+  g_free (error_data->primary_text);
+  g_free (error_data->secondary_text);
+  g_free (error_data);
+}
+
+static void
+error_message_notification_primary_action (GtdNotification *notification,
+                                           gpointer         user_data)
+{
+  error_data_free (user_data);
+}
+
+static void
+error_message_notification_secondary_action (GtdNotification *notification,
+                                             gpointer         user_data)
+{
+  GtkWidget *message_dialog;
+  ErrorData *data;
+
+  data = user_data;
+  message_dialog = gtk_message_dialog_new (GTK_WINDOW (data->window),
+                                           GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
+                                           GTK_MESSAGE_WARNING,
+                                           GTK_BUTTONS_CLOSE,
+                                           "%s",
+                                           data->primary_text);
+
+  gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (message_dialog),
+                                            "%s",
+                                            data->secondary_text);
+
+  gtk_dialog_run (GTK_DIALOG (message_dialog));
+  gtk_widget_destroy (message_dialog);
+
+  error_data_free (data);
+}
+
 static void
 gtd_window__load_geometry (GtdWindow *window)
 {
@@ -737,6 +785,33 @@ gtd_window__list_removed (GtdManager  *manager,
   g_list_free (children);
 }
 
+static void
+gtd_window__show_error_message (GtdManager  *manager,
+                                const gchar *primary_text,
+                                const gchar *secondary_text,
+                                GtdWindow   *window)
+{
+  GtdNotification *notification;
+  ErrorData *error_data;
+
+  error_data = g_new0 (ErrorData, 1);
+  notification = gtd_notification_new (primary_text, 0);
+
+  error_data->window = window;
+  error_data->primary_text = g_strdup (primary_text);
+  error_data->secondary_text = g_strdup (secondary_text);
+
+  gtd_notification_set_primary_action (notification,
+                                       error_message_notification_primary_action,
+                                       error_data);
+  gtd_notification_set_secondary_action (notification,
+                                         _("Details"),
+                                         error_message_notification_secondary_action,
+                                         error_data);
+
+  gtd_window_notify (window, notification);
+}
+
 static gboolean
 gtd_window_configure_event (GtkWidget         *widget,
                             GdkEventConfigure *event)
@@ -890,6 +965,10 @@ gtd_window_set_property (GObject      *object,
                         "list-removed",
                         G_CALLBACK (gtd_window__list_removed),
                         self);
+      g_signal_connect (self->priv->manager,
+                        "show-error-message",
+                        G_CALLBACK (gtd_window__show_error_message),
+                        self);
 
       /* Add already loaded lists */
       lists = gtd_manager_get_task_lists (self->priv->manager);


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