Bug #553927 - Autoselect newly created accounts in the folder tree
This commit is contained in:
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user