static void inf_gtk_browser_model_sort_set_browser_cb(InfGtkBrowserModel* model, GtkTreePath* path, GtkTreeIter* iter, InfcBrowser* browser, gpointer user_data) { GtkTreeModelSort* model_sort; GtkTreePath* own_path; GtkTreeIter own_iter; model_sort = GTK_TREE_MODEL_SORT(user_data); own_path = gtk_tree_model_sort_convert_child_path_to_path(model_sort, path); gtk_tree_model_sort_convert_child_iter_to_iter(model_sort, &own_iter, iter); inf_gtk_browser_model_set_browser( INF_GTK_BROWSER_MODEL(user_data), own_path, &own_iter, browser ); gtk_tree_path_free(own_path); }
static GtkTreePath * gnc_tree_view_owner_get_path_from_owner (GncTreeViewOwner *view, GncOwner *owner) { GtkTreeModel *model, *f_model, *s_model; GtkTreePath *path, *f_path, *s_path; ENTER("view %p, owner %p (%s)", view, owner, gncOwnerGetName(owner)); if (owner == NULL) { LEAVE("no owner"); return NULL; } /* Reach down to the real model and get a path for this owner */ s_model = gtk_tree_view_get_model(GTK_TREE_VIEW(view)); f_model = gtk_tree_model_sort_get_model(GTK_TREE_MODEL_SORT(s_model)); model = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(f_model)); path = gnc_tree_model_owner_get_path_from_owner (GNC_TREE_MODEL_OWNER(model), owner); if (path == NULL) { LEAVE("no path"); return NULL; } /* convert back to a filtered path */ f_path = gtk_tree_model_filter_convert_child_path_to_path (GTK_TREE_MODEL_FILTER (f_model), path); gtk_tree_path_free(path); if (!f_path) { LEAVE("no filter path"); return NULL; } /* convert back to a sorted path */ s_path = gtk_tree_model_sort_convert_child_path_to_path (GTK_TREE_MODEL_SORT (s_model), f_path); gtk_tree_path_free(f_path); debug_path(LEAVE, s_path); return s_path; }
/* * Selects a single price in the price tree view. The price * tree must be in single selection mode. */ void gnc_tree_view_price_set_selected_price (GncTreeViewPrice *view, GNCPrice *price) { GtkTreeModel *model, *f_model, *s_model; GtkTreePath *path, *f_path, *s_path, *parent_path; GtkTreeSelection *selection; ENTER("view %p, price %p", view, price); /* Clear any existing selection. */ selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view)); gtk_tree_selection_unselect_all (selection); if (price == NULL) return; s_model = gtk_tree_view_get_model(GTK_TREE_VIEW(view)); f_model = gtk_tree_model_sort_get_model(GTK_TREE_MODEL_SORT(s_model)); model = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (f_model)); path = gnc_tree_model_price_get_path_from_price (GNC_TREE_MODEL_PRICE(model), price); if (path == NULL) { LEAVE("get_path_from_price failed"); return; } debug_path(DEBUG, path); f_path = gtk_tree_model_filter_convert_child_path_to_path (GTK_TREE_MODEL_FILTER (f_model), path); gtk_tree_path_free(path); if (f_path == NULL) { LEAVE("no filter path"); return; } debug_path(DEBUG, f_path); s_path = gtk_tree_model_sort_convert_child_path_to_path (GTK_TREE_MODEL_SORT (s_model), f_path); gtk_tree_path_free(f_path); if (s_path == NULL) { LEAVE("no sort path"); return; } /* gtk_tree_view requires that a row be visible before it can be selected */ parent_path = gtk_tree_path_copy (s_path); if (gtk_tree_path_up (parent_path)) { /* This function is misnamed. It expands the actual item * specified, not the path to the item specified. I.E. It expands * one level too many, thus the get of the parent. */ gtk_tree_view_expand_to_path(GTK_TREE_VIEW(view), parent_path); } gtk_tree_path_free(parent_path); gtk_tree_selection_select_path (selection, s_path); gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW(view), s_path, NULL, FALSE, 0.0, 0.0); debug_path(LEAVE, s_path); gtk_tree_path_free(s_path); }
/* * Selects a single owner in the owner tree view. The owner * tree must be in single selection mode. */ void gnc_tree_view_owner_set_selected_owner (GncTreeViewOwner *view, GncOwner *owner) { GtkTreeModel *model, *f_model, *s_model; GtkTreePath *path, *f_path, *s_path, *parent_path; GtkTreeSelection *selection; ENTER("view %p, owner %p (%s)", view, owner, gncOwnerGetName (owner)); g_return_if_fail (GNC_IS_TREE_VIEW_OWNER (view)); /* Clear any existing selection. */ selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view)); gtk_tree_selection_unselect_all (selection); if (owner == NULL) return; s_model = gtk_tree_view_get_model(GTK_TREE_VIEW(view)); f_model = gtk_tree_model_sort_get_model(GTK_TREE_MODEL_SORT(s_model)); model = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(f_model)); path = gnc_tree_model_owner_get_path_from_owner ( GNC_TREE_MODEL_OWNER(model), owner); if (path == NULL) { LEAVE("no path"); return; } debug_path(DEBUG, path); f_path = gtk_tree_model_filter_convert_child_path_to_path ( GTK_TREE_MODEL_FILTER (f_model), path); gtk_tree_path_free(path); if (f_path == NULL) { LEAVE("no filter path"); return; } debug_path(DEBUG, f_path); s_path = gtk_tree_model_sort_convert_child_path_to_path (GTK_TREE_MODEL_SORT (s_model), f_path); gtk_tree_path_free(f_path); if (s_path == NULL) { LEAVE("no sort path"); return; } gtk_tree_selection_select_path (selection, s_path); /* give gtk+ a chance to resize the tree view first by handling pending * configure events */ while (gtk_events_pending ()) gtk_main_iteration (); gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW(view), s_path, NULL, FALSE, 0.0, 0.0); debug_path(LEAVE, s_path); gtk_tree_path_free(s_path); }