aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMilan Crha <mcrha@redhat.com>2014-02-18 23:31:09 +0800
committerMilan Crha <mcrha@redhat.com>2014-02-18 23:31:09 +0800
commitab50665557df261e7207c1b8a3bcf92eb005e869 (patch)
tree11560b2eb8ebaa440725f4eceb0b13f974ae6842
parentbc2fd7b35695bc18a5f9dd0111d58d93d7e19d9b (diff)
downloadgsoc2013-evolution-ab50665557df261e7207c1b8a3bcf92eb005e869.tar
gsoc2013-evolution-ab50665557df261e7207c1b8a3bcf92eb005e869.tar.gz
gsoc2013-evolution-ab50665557df261e7207c1b8a3bcf92eb005e869.tar.bz2
gsoc2013-evolution-ab50665557df261e7207c1b8a3bcf92eb005e869.tar.lz
gsoc2013-evolution-ab50665557df261e7207c1b8a3bcf92eb005e869.tar.xz
gsoc2013-evolution-ab50665557df261e7207c1b8a3bcf92eb005e869.tar.zst
gsoc2013-evolution-ab50665557df261e7207c1b8a3bcf92eb005e869.zip
Bug #553927 - Autoselect newly created accounts in the folder tree
-rw-r--r--mail/e-mail-config-assistant.c47
-rw-r--r--mail/em-folder-tree.c79
-rw-r--r--mail/em-folder-tree.h3
3 files changed, 129 insertions, 0 deletions
diff --git a/mail/e-mail-config-assistant.c b/mail/e-mail-config-assistant.c
index 62944943f4..e847493c6b 100644
--- a/mail/e-mail-config-assistant.c
+++ b/mail/e-mail-config-assistant.c
@@ -22,6 +22,11 @@
#include <libebackend/libebackend.h>
+#include <shell/e-shell.h>
+#include <shell/e-shell-window.h>
+#include <shell/e-shell-view.h>
+#include <shell/e-shell-sidebar.h>
+
#include <mail/e-mail-config-confirm-page.h>
#include <mail/e-mail-config-identity-page.h>
#include <mail/e-mail-config-lookup-page.h>
@@ -31,6 +36,8 @@
#include <mail/e-mail-config-summary-page.h>
#include <mail/e-mail-config-welcome-page.h>
+#include "em-folder-tree.h"
+
#define E_MAIL_CONFIG_ASSISTANT_GET_PRIVATE(obj) \
(G_TYPE_INSTANCE_GET_PRIVATE \
((obj), E_TYPE_MAIL_CONFIG_ASSISTANT, EMailConfigAssistantPrivate))
@@ -365,6 +372,40 @@ mail_config_assistant_provider_page_visible (GBinding *binding,
}
static void
+mail_config_assistant_select_account_node (const gchar *account_uid)
+{
+ EShell *shell;
+ EShellWindow *shell_window;
+ EShellView *shell_view;
+ EShellSidebar *shell_sidebar;
+ EMFolderTree *folder_tree = NULL;
+ GtkWindow *active_window;
+
+ g_return_if_fail (account_uid != NULL);
+
+ shell = e_shell_get_default ();
+ active_window = e_shell_get_active_window (shell);
+
+ if (!E_IS_SHELL_WINDOW (active_window))
+ return;
+
+ shell_window = E_SHELL_WINDOW (active_window);
+
+ if (g_strcmp0 (e_shell_window_get_active_view (shell_window), "mail") != 0)
+ return;
+
+ shell_view = e_shell_window_get_shell_view (shell_window, "mail");
+
+ shell_sidebar = e_shell_view_get_shell_sidebar (shell_view);
+ g_object_get (shell_sidebar, "folder-tree", &folder_tree, NULL);
+
+ em_folder_tree_select_store_when_added (folder_tree, account_uid);
+
+ g_object_unref (folder_tree);
+
+}
+
+static void
mail_config_assistant_close_cb (GObject *object,
GAsyncResult *result,
gpointer user_data)
@@ -396,6 +437,12 @@ mail_config_assistant_close_cb (GObject *object,
g_error_free (error);
} else {
+ ESource *account;
+
+ account = e_mail_config_assistant_get_account_source (assistant);
+ if (account)
+ mail_config_assistant_select_account_node (e_source_get_uid (account));
+
gtk_widget_destroy (GTK_WIDGET (assistant));
}
}
diff --git a/mail/em-folder-tree.c b/mail/em-folder-tree.c
index f4ba8b915f..3a094e6735 100644
--- a/mail/em-folder-tree.c
+++ b/mail/em-folder-tree.c
@@ -96,6 +96,7 @@ struct _EMFolderTreePrivate {
guint loading_row_id;
guint loaded_row_id;
+ guint row_changed_id;
GtkTreeRowReference *drag_row;
gboolean skip_double_click;
@@ -104,6 +105,8 @@ struct _EMFolderTreePrivate {
GtkWidget *selectable; /* an ESelectable, where to pass selectable calls */
+ gchar *select_store_uid_when_added;
+
/* Signal handler IDs */
gulong selection_changed_handler_id;
};
@@ -559,6 +562,44 @@ folder_tree_maybe_expand_row (EMFolderTreeModel *model,
}
static void
+folder_tree_row_changed_cb (GtkTreeModel *model,
+ GtkTreePath *path,
+ GtkTreeIter *iter,
+ EMFolderTree *folder_tree)
+{
+ gboolean is_store = FALSE;
+ CamelService *service = NULL;
+
+ g_return_if_fail (EM_IS_FOLDER_TREE (folder_tree));
+
+ if (!folder_tree->priv->select_store_uid_when_added ||
+ gtk_tree_path_get_depth (path) != 1)
+ return;
+
+ gtk_tree_model_get (model, iter,
+ COL_OBJECT_CAMEL_STORE, &service,
+ COL_BOOL_IS_STORE, &is_store,
+ -1);
+
+ if (is_store && service &&
+ g_strcmp0 (folder_tree->priv->select_store_uid_when_added, camel_service_get_uid (service)) == 0) {
+ GtkTreeSelection *selection;
+
+ g_free (folder_tree->priv->select_store_uid_when_added);
+ folder_tree->priv->select_store_uid_when_added = NULL;
+
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (folder_tree));
+
+ gtk_tree_selection_select_iter (selection, iter);
+ gtk_tree_view_set_cursor (GTK_TREE_VIEW (folder_tree), path, NULL, FALSE);
+ folder_tree->priv->cursor_set = TRUE;
+ gtk_tree_view_expand_row (GTK_TREE_VIEW (folder_tree), path, FALSE);
+ }
+
+ g_clear_object (&service);
+}
+
+static void
folder_tree_clear_selected_list (EMFolderTree *folder_tree)
{
EMFolderTreePrivate *priv = folder_tree->priv;
@@ -1094,6 +1135,11 @@ folder_tree_dispose (GObject *object)
priv->loading_row_id = 0;
}
+ if (priv->row_changed_id != 0) {
+ g_signal_handler_disconnect (model, priv->row_changed_id);
+ priv->row_changed_id = 0;
+ }
+
if (priv->selection_changed_handler_id != 0) {
g_signal_handler_disconnect (selection, priv->selection_changed_handler_id);
priv->selection_changed_handler_id = 0;
@@ -1151,6 +1197,9 @@ folder_tree_finalize (GObject *object)
priv->select_uris_table = NULL;
}
+ g_free (priv->select_store_uid_when_added);
+ priv->select_store_uid_when_added = NULL;
+
/* Chain up to parent's finalize() method. */
G_OBJECT_CLASS (em_folder_tree_parent_class)->finalize (object);
}
@@ -1185,6 +1234,12 @@ folder_tree_constructed (GObject *object)
G_CALLBACK (folder_tree_maybe_expand_row), object);
priv->loaded_row_id = handler_id;
+ /* Cannot attach to "row-inserted", because the row is inserted empty */
+ handler_id = g_signal_connect (
+ model, "row-changed",
+ G_CALLBACK (folder_tree_row_changed_cb), object);
+ priv->row_changed_id = handler_id;
+
handler_id = g_signal_connect_swapped (
selection, "changed",
G_CALLBACK (folder_tree_selection_changed_cb), object);
@@ -3650,3 +3705,27 @@ em_folder_tree_restore_state (EMFolderTree *folder_tree,
valid = gtk_tree_model_iter_next (tree_model, &iter);
}
}
+
+/**
+ * em_folder_tree_select_store_when_added:
+ * @folder_tree: an #EMFolderTree
+ * @store_uid: UID of a CamelStore to remember to select
+ *
+ * Instruct @folder_tree to select a CamelStore with UID @store_uid,
+ * if/when it is added to the tree. This is necessary, because
+ * the addition is done asynchronously.
+ *
+ * Since: 3.12
+ **/
+void
+em_folder_tree_select_store_when_added (EMFolderTree *folder_tree,
+ const gchar *store_uid)
+{
+ g_return_if_fail (EM_IS_FOLDER_TREE (folder_tree));
+
+ if (g_strcmp0 (store_uid, folder_tree->priv->select_store_uid_when_added) == 0)
+ return;
+
+ g_free (folder_tree->priv->select_store_uid_when_added);
+ folder_tree->priv->select_store_uid_when_added = g_strdup (store_uid);
+}
diff --git a/mail/em-folder-tree.h b/mail/em-folder-tree.h
index bd09cb0cc9..0972888613 100644
--- a/mail/em-folder-tree.h
+++ b/mail/em-folder-tree.h
@@ -141,6 +141,9 @@ void em_folder_tree_restore_state (EMFolderTree *folder_tree,
void em_folder_tree_set_selectable_widget
(EMFolderTree *folder_tree,
GtkWidget *selectable);
+void em_folder_tree_select_store_when_added
+ (EMFolderTree *folder_tree,
+ const gchar *store_uid);
G_END_DECLS