aboutsummaryrefslogtreecommitdiffstats
path: root/mail/em-folder-tree.c
diff options
context:
space:
mode:
authorMatthew Barnes <mbarnes@redhat.com>2009-06-14 03:07:00 +0800
committerMatthew Barnes <mbarnes@redhat.com>2009-06-14 03:07:00 +0800
commitab27aff72c64183166fc6207d2ef0142e1ab8c83 (patch)
tree6b95a26dedf3ca26ae70f9a2ff3ea466e42763dc /mail/em-folder-tree.c
parent49ba34088bcdb9ab9cfae0c2b7fe11452fb60e24 (diff)
downloadgsoc2013-evolution-ab27aff72c64183166fc6207d2ef0142e1ab8c83.tar.gz
gsoc2013-evolution-ab27aff72c64183166fc6207d2ef0142e1ab8c83.tar.zst
gsoc2013-evolution-ab27aff72c64183166fc6207d2ef0142e1ab8c83.zip
Thought of a better way to copy folder tree state.
Revert the expanded tree model column and add a "selection"property to EMFolderTreeModel, which the sidebar sets. If set, all new EMFolderTree instances will automatically mimic its expanded and selected state.
Diffstat (limited to 'mail/em-folder-tree.c')
-rw-r--r--mail/em-folder-tree.c100
1 files changed, 61 insertions, 39 deletions
diff --git a/mail/em-folder-tree.c b/mail/em-folder-tree.c
index 0e0ff74417..b8ee5e354a 100644
--- a/mail/em-folder-tree.c
+++ b/mail/em-folder-tree.c
@@ -523,6 +523,51 @@ folder_tree_new (EMFolderTree *emft, EMFolderTreeModel *model)
}
static void
+folder_tree_copy_expanded_cb (GtkTreeView *unused,
+ GtkTreePath *path,
+ GtkTreeView *tree_view)
+{
+ gtk_tree_view_expand_row (tree_view, path, FALSE);
+}
+
+static void
+folder_tree_copy_selection_cb (GtkTreeModel *model,
+ GtkTreePath *path,
+ GtkTreeIter *iter,
+ GtkTreeView *tree_view)
+{
+ GtkTreeSelection *selection;
+
+ selection = gtk_tree_view_get_selection (tree_view);
+ gtk_tree_selection_select_path (selection, path);
+
+ /* Center the tree view on the selected path. */
+ gtk_tree_view_scroll_to_cell (tree_view, path, NULL, TRUE, 0.5, 0.0);
+}
+
+static void
+folder_tree_copy_state (EMFolderTree *emft,
+ EMFolderTreeModel *model)
+{
+ GtkTreeSelection *selection;
+ GtkTreeView *tree_view;
+
+ selection = em_folder_tree_model_get_selection (model);
+ if (selection == NULL)
+ return;
+
+ tree_view = gtk_tree_selection_get_tree_view (selection);
+
+ gtk_tree_view_map_expanded_rows (
+ tree_view, (GtkTreeViewMappingFunc)
+ folder_tree_copy_expanded_cb, emft);
+
+ gtk_tree_selection_selected_foreach (
+ selection, (GtkTreeSelectionForeachFunc)
+ folder_tree_copy_selection_cb, emft);
+}
+
+static void
em_folder_tree_construct (EMFolderTree *emft, EMFolderTreeModel *model)
{
struct _EMFolderTreePrivate *priv = emft->priv;
@@ -530,6 +575,7 @@ em_folder_tree_construct (EMFolderTree *emft, EMFolderTreeModel *model)
priv->model = model;
folder_tree_new (emft, model);
+ folder_tree_copy_state (emft, model);
gtk_widget_show (GTK_WIDGET (emft));
g_signal_connect (emft, "row-expanded", G_CALLBACK (emft_tree_row_expanded), emft);
@@ -703,38 +749,6 @@ em_folder_tree_new_with_model (EMFolderTreeModel *model)
return (GtkWidget *) emft;
}
-static gboolean
-folder_tree_clone_expanded (GtkTreeModel *model,
- GtkTreePath *path,
- GtkTreeIter *iter,
- GtkTreeView *tree_view)
-{
- gboolean expanded;
-
- gtk_tree_model_get (model, iter, COL_BOOL_EXPANDED, &expanded, -1);
-
- if (expanded)
- gtk_tree_view_expand_row (tree_view, path, FALSE);
- else
- gtk_tree_view_collapse_row (tree_view, path);
-
- return FALSE;
-}
-
-void
-em_folder_tree_clone_expanded (EMFolderTree *emft)
-{
- GtkTreeModel *model;
-
- g_return_if_fail (EM_IS_FOLDER_TREE (emft));
-
- model = gtk_tree_view_get_model (GTK_TREE_VIEW (emft));
-
- gtk_tree_model_foreach (
- model, (GtkTreeModelForeachFunc)
- folder_tree_clone_expanded, emft);
-}
-
static void
tree_drag_begin (GtkWidget *widget, GdkDragContext *context, EMFolderTree *emft)
{
@@ -2042,7 +2056,8 @@ emft_tree_user_event (GtkTreeView *treeview, GdkEvent *e, EMFolderTree *emft)
}
static void
-emft_tree_selection_changed (GtkTreeSelection *selection, EMFolderTree *emft)
+emft_tree_selection_changed (GtkTreeSelection *selection,
+ EMFolderTree *emft)
{
gchar *full_name, *uri;
GtkTreeModel *model;
@@ -2075,10 +2090,14 @@ emft_tree_selection_changed (GtkTreeSelection *selection, EMFolderTree *emft)
}
void
-em_folder_tree_set_selected (EMFolderTree *emft, const gchar *uri, gboolean expand_only)
+em_folder_tree_set_selected (EMFolderTree *emft,
+ const gchar *uri,
+ gboolean expand_only)
{
GList *l = NULL;
+ g_return_if_fail (EM_IS_FOLDER_TREE (emft));
+
if (uri && uri[0])
l = g_list_append(l, (gpointer)uri);
@@ -2231,7 +2250,6 @@ em_folder_tree_select_prev_path (EMFolderTree *emft, gboolean skip_read_folders)
return;
}
-
gchar *
em_folder_tree_get_selected_uri (EMFolderTree *emft)
{
@@ -2246,8 +2264,10 @@ em_folder_tree_get_selected_uri (EMFolderTree *emft)
tree_view = GTK_TREE_VIEW (emft);
selection = gtk_tree_view_get_selection (tree_view);
- if (gtk_tree_selection_get_selected(selection, &model, &iter))
- gtk_tree_model_get(model, &iter, COL_STRING_URI, &uri, -1);
+ if (!gtk_tree_selection_get_selected (selection, &model, &iter))
+ return NULL;
+
+ gtk_tree_model_get (model, &iter, COL_STRING_URI, &uri, -1);
return uri;
}
@@ -2266,8 +2286,10 @@ em_folder_tree_get_selected_path (EMFolderTree *emft)
tree_view = GTK_TREE_VIEW (emft);
selection = gtk_tree_view_get_selection (tree_view);
- if (gtk_tree_selection_get_selected(selection, &model, &iter))
- gtk_tree_model_get(model, &iter, COL_STRING_FULL_NAME, &name, -1);
+ if (!gtk_tree_selection_get_selected (selection, &model, &iter))
+ return NULL;
+
+ gtk_tree_model_get (model, &iter, COL_STRING_FULL_NAME, &name, -1);
return name;
}