diff options
author | Matthew Barnes <mbarnes@redhat.com> | 2009-06-14 03:07:00 +0800 |
---|---|---|
committer | Matthew Barnes <mbarnes@redhat.com> | 2009-06-14 03:07:00 +0800 |
commit | ab27aff72c64183166fc6207d2ef0142e1ab8c83 (patch) | |
tree | 6b95a26dedf3ca26ae70f9a2ff3ea466e42763dc /mail/em-folder-tree.c | |
parent | 49ba34088bcdb9ab9cfae0c2b7fe11452fb60e24 (diff) | |
download | gsoc2013-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.c | 100 |
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; } |