[evolution-data-server] evolution-source-viewer: Select next source after deleting.
- From: Matthew Barnes <mbarnes src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server] evolution-source-viewer: Select next source after deleting.
- Date: Fri, 19 Oct 2012 18:14:03 +0000 (UTC)
commit 37465da9b35a49f06994c0797ceada7b741f718f
Author: Matthew Barnes <mbarnes redhat com>
Date: Fri Oct 19 14:12:14 2012 -0400
evolution-source-viewer: Select next source after deleting.
Deleting a list of sources is less painful when the next source is
automatically selected.
tests/libedataserverui/evolution-source-viewer.c | 117 ++++++++++++++++------
1 files changed, 85 insertions(+), 32 deletions(-)
---
diff --git a/tests/libedataserverui/evolution-source-viewer.c b/tests/libedataserverui/evolution-source-viewer.c
index 959102f..e90cb6c 100644
--- a/tests/libedataserverui/evolution-source-viewer.c
+++ b/tests/libedataserverui/evolution-source-viewer.c
@@ -102,8 +102,15 @@ GtkWidget * e_source_viewer_new (GCancellable *cancellable,
GError **error);
ESourceRegistry *
e_source_viewer_get_registry (ESourceViewer *viewer);
-ESource * e_source_viewer_ref_selected (ESourceViewer *viewer);
-void e_source_viewer_set_selected (ESourceViewer *viewer,
+GtkTreePath * e_source_viewer_dup_selected_path
+ (ESourceViewer *viewer);
+gboolean e_source_viewer_set_selected_path
+ (ESourceViewer *viewer,
+ GtkTreePath *path);
+ESource * e_source_viewer_ref_selected_source
+ (ESourceViewer *viewer);
+gboolean e_source_viewer_set_selected_source
+ (ESourceViewer *viewer,
ESource *source);
GNode * e_source_viewer_build_display_tree
(ESourceViewer *viewer);
@@ -325,13 +332,15 @@ source_viewer_build_model (ESourceViewer *viewer)
GHashTable *source_index;
GtkTreeView *tree_view;
GtkTreeModel *model;
- ESource *selected;
+ GtkTreePath *sel_path;
+ ESource *sel_source;
GNode *root;
tree_view = GTK_TREE_VIEW (viewer->tree_view);
source_index = viewer->source_index;
- selected = e_source_viewer_ref_selected (viewer);
+ sel_path = e_source_viewer_dup_selected_path (viewer);
+ sel_source = e_source_viewer_ref_selected_source (viewer);
/* Save expanded sources to restore later. */
gtk_tree_view_map_expanded_rows (
@@ -370,11 +379,17 @@ source_viewer_build_model (ESourceViewer *viewer)
g_object_unref (source);
}
- /* Restore the selected source. */
- if (selected != NULL) {
- e_source_viewer_set_selected (viewer, selected);
- g_object_unref (selected);
+ /* Restore the selection. */
+ if (sel_source != NULL && sel_path != NULL) {
+ if (!e_source_viewer_set_selected_source (viewer, sel_source))
+ e_source_viewer_set_selected_path (viewer, sel_path);
}
+
+ if (sel_path != NULL)
+ gtk_tree_path_free (sel_path);
+
+ if (sel_source != NULL)
+ g_object_unref (sel_source);
}
static void
@@ -418,7 +433,7 @@ source_viewer_source_changed_cb (ESourceRegistry *registry,
source_viewer_update_row (viewer, source);
- selected = e_source_viewer_ref_selected (viewer);
+ selected = e_source_viewer_ref_selected_source (viewer);
if (selected != NULL) {
if (e_source_equal (source, selected))
source_viewer_set_text (viewer, source);
@@ -442,7 +457,7 @@ source_viewer_selection_changed_cb (GtkTreeSelection *selection,
const gchar *uid = NULL;
gboolean removable = FALSE;
- source = e_source_viewer_ref_selected (viewer);
+ source = e_source_viewer_ref_selected_source (viewer);
source_viewer_set_text (viewer, source);
@@ -501,7 +516,7 @@ source_viewer_delete_button_clicked_cb (GtkButton *delete_button,
g_return_if_fail (viewer->delete_operation == NULL);
- source = e_source_viewer_ref_selected (viewer);
+ source = e_source_viewer_ref_selected_source (viewer);
g_return_if_fail (source != NULL);
uid = e_source_get_uid (source);
@@ -934,8 +949,55 @@ e_source_viewer_get_registry (ESourceViewer *viewer)
return viewer->registry;
}
+GtkTreePath *
+e_source_viewer_dup_selected_path (ESourceViewer *viewer)
+{
+ GtkTreeSelection *selection;
+ GtkTreeView *tree_view;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+
+ g_return_val_if_fail (E_IS_SOURCE_VIEWER (viewer), NULL);
+
+ tree_view = GTK_TREE_VIEW (viewer->tree_view);
+ selection = gtk_tree_view_get_selection (tree_view);
+
+ if (!gtk_tree_selection_get_selected (selection, &model, &iter))
+ return NULL;
+
+ return gtk_tree_model_get_path (model, &iter);
+}
+
+gboolean
+e_source_viewer_set_selected_path (ESourceViewer *viewer,
+ GtkTreePath *path)
+{
+ GtkTreeSelection *selection;
+ GtkTreeView *tree_view;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+
+ g_return_val_if_fail (E_IS_SOURCE_VIEWER (viewer), FALSE);
+ g_return_val_if_fail (path != NULL, FALSE);
+
+ tree_view = GTK_TREE_VIEW (viewer->tree_view);
+ selection = gtk_tree_view_get_selection (tree_view);
+
+ /* Check that the path is valid. */
+ model = gtk_tree_view_get_model (tree_view);
+ if (!gtk_tree_model_get_iter (model, &iter, path))
+ return FALSE;
+
+ gtk_tree_selection_unselect_all (selection);
+
+ gtk_tree_view_expand_to_path (tree_view, path);
+ gtk_tree_selection_select_path (selection, path);
+
+ return TRUE;
+}
+
ESource *
-e_source_viewer_ref_selected (ESourceViewer *viewer)
+e_source_viewer_ref_selected_source (ESourceViewer *viewer)
{
ESource *source;
GtkTreeSelection *selection;
@@ -946,10 +1008,9 @@ e_source_viewer_ref_selected (ESourceViewer *viewer)
g_return_val_if_fail (E_IS_SOURCE_VIEWER (viewer), NULL);
tree_view = GTK_TREE_VIEW (viewer->tree_view);
- model = gtk_tree_view_get_model (tree_view);
selection = gtk_tree_view_get_selection (tree_view);
- if (!gtk_tree_selection_get_selected (selection, NULL, &iter))
+ if (!gtk_tree_selection_get_selected (selection, &model, &iter))
return NULL;
gtk_tree_model_get (model, &iter, COLUMN_SOURCE, &source, -1);
@@ -957,37 +1018,29 @@ e_source_viewer_ref_selected (ESourceViewer *viewer)
return source;
}
-void
-e_source_viewer_set_selected (ESourceViewer *viewer,
- ESource *source)
+gboolean
+e_source_viewer_set_selected_source (ESourceViewer *viewer,
+ ESource *source)
{
GHashTable *source_index;
GtkTreeRowReference *reference;
- GtkTreeSelection *selection;
- GtkTreeView *tree_view;
GtkTreePath *path;
+ gboolean success;
- g_return_if_fail (E_IS_SOURCE_VIEWER (viewer));
- g_return_if_fail (E_IS_SOURCE (source));
-
- tree_view = GTK_TREE_VIEW (viewer->tree_view);
- selection = gtk_tree_view_get_selection (tree_view);
+ g_return_val_if_fail (E_IS_SOURCE_VIEWER (viewer), FALSE);
+ g_return_val_if_fail (E_IS_SOURCE (source), FALSE);
source_index = viewer->source_index;
reference = g_hash_table_lookup (source_index, source);
- /* XXX Maybe we should return a success/fail boolean? */
if (!gtk_tree_row_reference_valid (reference))
- return;
-
- gtk_tree_selection_unselect_all (selection);
+ return FALSE;
path = gtk_tree_row_reference_get_path (reference);
-
- gtk_tree_view_expand_to_path (tree_view, path);
- gtk_tree_selection_select_path (selection, path);
-
+ success = e_source_viewer_set_selected_path (viewer, path);
gtk_tree_path_free (path);
+
+ return success;
}
/* Helper for e_source_viewer_build_display_tree() */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]