/* * Set an GtkTreeModel visible filter on this commodity. This filter will be * called for each commodity that the tree is about to show, and the * commodity will be passed to the callback function. */ void gnc_tree_view_commodity_set_filter (GncTreeViewCommodity *view, gnc_tree_view_commodity_ns_filter_func ns_func, gnc_tree_view_commodity_cm_filter_func cm_func, gpointer data, GDestroyNotify destroy) { GtkTreeModel *f_model, *s_model; filter_user_data *fd = data; g_return_if_fail(GNC_IS_TREE_VIEW_COMMODITY(view)); g_return_if_fail((ns_func != NULL) || (cm_func != NULL)); ENTER("view %p, ns func %p, cm func %p, data %p, destroy %p", view, ns_func, cm_func, data, destroy); fd = g_malloc(sizeof(filter_user_data)); fd->user_ns_fn = ns_func; fd->user_cm_fn = cm_func; fd->user_data = data; fd->user_destroy = destroy; 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)); gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (f_model), gnc_tree_view_commodity_filter_helper, fd, gnc_tree_view_commodity_filter_destroy); /* Whack any existing levels. The top two levels have been created * before this routine can be called. */ gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (f_model)); LEAVE(" "); }
/* * Retrieve the selected commodity from an commodity tree view. The * commodity tree must be in single selection mode. */ gnc_commodity * gnc_tree_view_commodity_get_selected_commodity (GncTreeViewCommodity *view) { GtkTreeSelection *selection; GtkTreeModel *model, *f_model, *s_model; GtkTreeIter iter, f_iter, s_iter; gnc_commodity *commodity; g_return_val_if_fail (GNC_IS_TREE_VIEW_COMMODITY (view), NULL); ENTER("view %p", view); selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(view)); if (!gtk_tree_selection_get_selected (selection, &s_model, &s_iter)) { LEAVE("no commodity, get_selected failed"); return FALSE; } gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT (s_model), &f_iter, &s_iter); f_model = gtk_tree_model_sort_get_model(GTK_TREE_MODEL_SORT(s_model)); gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (f_model), &iter, &f_iter); model = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(f_model)); commodity = gnc_tree_model_commodity_get_commodity (GNC_TREE_MODEL_COMMODITY(model), &iter); LEAVE("commodity %p (%s)", commodity, commodity ? gnc_commodity_get_mnemonic(commodity) : ""); return commodity; }
/************************************************************/ #define debug_path(fn, path) { \ gchar *path_string = gtk_tree_path_to_string(path); \ fn("tree path %s", path_string); \ g_free(path_string); \ } #if 0 /* Not Used */ static gboolean gnc_tree_view_commodity_get_iter_from_commodity (GncTreeViewCommodity *view, gnc_commodity *commodity, GtkTreeIter *s_iter) { GtkTreeModel *model, *f_model, *s_model; GtkTreeIter iter, f_iter; g_return_val_if_fail(GNC_IS_TREE_VIEW_COMMODITY(view), FALSE); g_return_val_if_fail(commodity != NULL, FALSE); g_return_val_if_fail(s_iter != NULL, FALSE); ENTER("view %p, commodity %p (%s)", view, commodity, gnc_commodity_get_mnemonic(commodity)); /* Reach down to the real model and get an iter for this commodity */ 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)); if (!gnc_tree_model_commodity_get_iter_from_commodity (GNC_TREE_MODEL_COMMODITY(model), commodity, &iter)) { LEAVE("model_get_iter_from_commodity failed"); return FALSE; } /* convert back to a sort iter */ gtk_tree_model_filter_convert_child_iter_to_iter (GTK_TREE_MODEL_FILTER(f_model), &f_iter, &iter); gtk_tree_model_sort_convert_child_iter_to_iter (GTK_TREE_MODEL_SORT(s_model), s_iter, &f_iter); LEAVE(" "); return TRUE; }
static void gnc_tree_view_commodity_finalize (GObject *object) { g_return_if_fail (object != NULL); g_return_if_fail (GNC_IS_TREE_VIEW_COMMODITY (object)); ENTER("view %p", object); if (G_OBJECT_CLASS (parent_class)->finalize) (* G_OBJECT_CLASS (parent_class)->finalize) (object); LEAVE(" "); }
static void gnc_tree_view_commodity_destroy (GtkWidget *widget) { g_return_if_fail (widget != NULL); g_return_if_fail (GNC_IS_TREE_VIEW_COMMODITY (widget)); ENTER("view %p", widget); if (GTK_WIDGET_CLASS (parent_class)->destroy) (* GTK_WIDGET_CLASS (parent_class)->destroy) (widget); LEAVE(" "); }
static void gnc_tree_view_commodity_destroy (GtkObject *object) { g_return_if_fail (object != NULL); g_return_if_fail (GNC_IS_TREE_VIEW_COMMODITY (object)); ENTER("view %p", object); if (GTK_OBJECT_CLASS (parent_class)->destroy) (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); LEAVE(" "); }
/* * Forces the entire commodity tree to be re-evaluated for visibility. */ void gnc_tree_view_commodity_refilter (GncTreeViewCommodity *view) { GtkTreeModel *f_model, *s_model; g_return_if_fail(GNC_IS_TREE_VIEW_COMMODITY(view)); ENTER("view %p", view); 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)); gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (f_model)); LEAVE(" "); }