diff options
Diffstat (limited to 'widgets')
-rw-r--r-- | widgets/misc/ChangeLog | 12 | ||||
-rw-r--r-- | widgets/misc/e-source-selector.c | 61 |
2 files changed, 57 insertions, 16 deletions
diff --git a/widgets/misc/ChangeLog b/widgets/misc/ChangeLog index 3a3d8725e1..7f6e1b6e75 100644 --- a/widgets/misc/ChangeLog +++ b/widgets/misc/ChangeLog @@ -1,5 +1,17 @@ 2004-01-20 JP Rosevear <jpr@ximian.com> + * e-source-selector.c (find_source_iter): provide parent iter + in/out arg + (test_collapse_row_callback): use priv shortcut + (e_source_selector_select_source): pass parent iter + (e_source_selector_unselect_source): ditto + (e_source_selector_peek_primary_selection): return the right thing + if the primary selection is currently hidden + (e_source_selector_set_primary_selection): set the primary + selection properly if the source node is currently hidden + +2004-01-20 JP Rosevear <jpr@ximian.com> + * e-source-selector.c (clear_saved_primary_selection): util routine to clear the row reference to the saved primary selection (find_source_iter): unref the model data retrieved diff --git a/widgets/misc/e-source-selector.c b/widgets/misc/e-source-selector.c index 64a24fb6a0..f899612fd8 100644 --- a/widgets/misc/e-source-selector.c +++ b/widgets/misc/e-source-selector.c @@ -152,14 +152,13 @@ unselect_source (ESourceSelector *selector, } static gboolean -find_source_iter (ESourceSelector *selector, ESource *source, GtkTreeIter *source_iter) +find_source_iter (ESourceSelector *selector, ESource *source, GtkTreeIter *parent_iter, GtkTreeIter *source_iter) { GtkTreeModel *model = GTK_TREE_MODEL (selector->priv->tree_store); - GtkTreeIter iter; - if (gtk_tree_model_get_iter_first (model, &iter)) { + if (gtk_tree_model_get_iter_first (model, parent_iter)) { do { - if (gtk_tree_model_iter_children (model, source_iter, &iter)) { + if (gtk_tree_model_iter_children (model, source_iter, parent_iter)) { do { void *data; @@ -175,7 +174,7 @@ find_source_iter (ESourceSelector *selector, ESource *source, GtkTreeIter *sourc g_object_unref (data); } while (gtk_tree_model_iter_next (model, source_iter)); } - } while (gtk_tree_model_iter_next (model, &iter)); + } while (gtk_tree_model_iter_next (model, parent_iter)); } return FALSE; @@ -507,7 +506,7 @@ test_collapse_row_callback (GtkTreeView *treeview, GtkTreeIter *iter, GtkTreePat priv = selector->priv; /* Clear this because something else has been clicked on now */ - selector->priv->toggled_last = FALSE; + priv->toggled_last = FALSE; if (priv->saved_primary_selection) return FALSE; @@ -519,7 +518,7 @@ test_collapse_row_callback (GtkTreeView *treeview, GtkTreeIter *iter, GtkTreePat GtkTreePath *child_path; child_path = gtk_tree_model_get_path (GTK_TREE_MODEL (priv->tree_store), &child_iter); - selector->priv->saved_primary_selection = gtk_tree_row_reference_new (GTK_TREE_MODEL (priv->tree_store), child_path); + priv->saved_primary_selection = gtk_tree_row_reference_new (GTK_TREE_MODEL (priv->tree_store), child_path); gtk_tree_path_free (child_path); } @@ -544,8 +543,8 @@ row_expanded_callback (GtkTreeView *treeview, GtkTreeIter *iter, GtkTreePath *pa if (gtk_tree_store_is_ancestor (priv->tree_store, iter, &child_iter)) { GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (selector)); - gtk_tree_selection_select_iter (selection, &child_iter); + gtk_tree_selection_select_iter (selection, &child_iter); clear_saved_primary_selection (selector); } @@ -865,7 +864,7 @@ void e_source_selector_select_source (ESourceSelector *selector, ESource *source) { - GtkTreeIter source_iter; + GtkTreeIter parent_iter, source_iter; g_return_if_fail (E_IS_SOURCE_SELECTOR (selector)); g_return_if_fail (E_IS_SOURCE (source)); @@ -875,7 +874,7 @@ e_source_selector_select_source (ESourceSelector *selector, select_source (selector, source); - if (find_source_iter (selector, source, &source_iter)) { + if (find_source_iter (selector, source, &parent_iter, &source_iter)) { GtkTreeModel *model = GTK_TREE_MODEL (selector->priv->tree_store); GtkTreePath *path; @@ -898,7 +897,7 @@ void e_source_selector_unselect_source (ESourceSelector *selector, ESource *source) { - GtkTreeIter source_iter; + GtkTreeIter parent_iter, source_iter; g_return_if_fail (E_IS_SOURCE_SELECTOR (selector)); g_return_if_fail (E_IS_SOURCE (source)); @@ -908,7 +907,7 @@ e_source_selector_unselect_source (ESourceSelector *selector, unselect_source (selector, source); - if (find_source_iter (selector, source, &source_iter)) { + if (find_source_iter (selector, source, &parent_iter, &source_iter)) { GtkTreeModel *model = GTK_TREE_MODEL (selector->priv->tree_store); GtkTreePath *path; @@ -957,7 +956,14 @@ e_source_selector_peek_primary_selection (ESourceSelector *selector) GtkTreeIter iter; void *data; - if (! gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (selector)), NULL, &iter)) + if (selector->priv->saved_primary_selection) { + GtkTreePath *child_path; + + child_path = gtk_tree_row_reference_get_path (selector->priv->saved_primary_selection); + gtk_tree_model_get_iter (GTK_TREE_MODEL (selector->priv->tree_store), &iter, child_path); + + gtk_tree_path_free (child_path); + } else if (! gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (selector)), NULL, &iter)) return NULL; gtk_tree_model_get (model, &iter, 0, &data, -1); @@ -982,16 +988,39 @@ e_source_selector_peek_primary_selection (ESourceSelector *selector) void e_source_selector_set_primary_selection (ESourceSelector *selector, ESource *source) { - GtkTreeIter source_iter; + ESourceSelectorPrivate *priv; + GtkTreeIter parent_iter, source_iter; g_return_if_fail (selector != NULL); g_return_if_fail (E_IS_SOURCE_SELECTOR (selector)); g_return_if_fail (source != NULL); g_return_if_fail (E_IS_SOURCE (source)); - if (find_source_iter (selector, source, &source_iter)) { + priv = selector->priv; + + if (find_source_iter (selector, source, &parent_iter, &source_iter)) { GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (selector)); - gtk_tree_selection_select_iter (selection, &source_iter); + GtkTreePath *path; + + gtk_tree_selection_unselect_all (selection); + clear_saved_primary_selection (selector); + + path = gtk_tree_model_get_path (GTK_TREE_MODEL (priv->tree_store), &parent_iter); + + if (gtk_tree_view_row_expanded (GTK_TREE_VIEW (selector), path)) { + gtk_tree_selection_select_iter (selection, &source_iter); + } else { + GtkTreePath *child_path; + + child_path = gtk_tree_model_get_path (GTK_TREE_MODEL (priv->tree_store), &source_iter); + priv->saved_primary_selection = gtk_tree_row_reference_new (GTK_TREE_MODEL (priv->tree_store), child_path); + gtk_tree_path_free (child_path); + + /* We emit this by hand because we aren't changing the tree selection */ + g_signal_emit (selector, signals[PRIMARY_SELECTION_CHANGED], 0); + } + + gtk_tree_path_free (path); } else { g_warning (G_STRLOC ": Cannot find source %p (%s) in selector %p", source, e_source_peek_name (source), selector); |