Bug #553927 - Autoselect newly created accounts in the folder tree

This commit is contained in:
Milan Crha
2014-02-18 16:31:09 +01:00
parent bc2fd7b356
commit ab50665557
3 changed files with 129 additions and 0 deletions

View File

@ -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))
@ -364,6 +371,40 @@ mail_config_assistant_provider_page_visible (GBinding *binding,
return TRUE;
}
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,
@ -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));
}
}

View File

@ -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;
};
@ -558,6 +561,44 @@ folder_tree_maybe_expand_row (EMFolderTreeModel *model,
g_free (key);
}
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)
{
@ -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);
}

View File

@ -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