37 #include <glib/gi18n.h> 38 #include <gdk/gdkkeysyms.h> 45 #include "gnc-cell-renderer-date.h" 46 #include "gnc-cell-renderer-text-view.h" 49 #include "dialog-utils.h" 54 #define STATE_KEY "state-key" 57 #define STATE_KEY_SORT_COLUMN "sort_column" 58 #define STATE_KEY_SORT_ORDER "sort_order" 59 #define STATE_KEY_COLUMN_ORDER "column_order" 64 #define STATE_KEY_SUFF_VISIBLE "visible" 65 #define STATE_KEY_SUFF_WIDTH "width" 71 PROP_SHOW_COLUMN_MENU,
77 static QofLogModule log_module = GNC_MOD_GUI;
81 static void gnc_tree_view_init (
GncTreeView *view,
void *data);
82 static void gnc_tree_view_finalize (GObject *
object);
83 static void gnc_tree_view_destroy (GtkWidget *widget);
84 static void gnc_tree_view_set_property (GObject *
object,
88 static void gnc_tree_view_get_property (GObject *
object,
92 static gboolean gnc_tree_view_drop_ok_cb (GtkTreeView *view,
93 GtkTreeViewColumn *column,
94 GtkTreeViewColumn *prev_column,
95 GtkTreeViewColumn *next_column,
97 static void gnc_tree_view_build_column_menu (
GncTreeView *view);
98 static void gnc_tree_view_select_column_cb (GtkTreeViewColumn *column,
100 static gchar *gnc_tree_view_get_sort_order (
GncTreeView *view);
101 static gchar *gnc_tree_view_get_sort_column (
GncTreeView *view);
102 static gchar **gnc_tree_view_get_column_order (
GncTreeView *view,
110 GtkTreeViewColumn *column_menu_column;
111 GtkWidget *column_menu;
112 gboolean show_column_menu;
113 GtkWidget *column_menu_icon_box;
116 GtkTreeModel *sort_model;
119 GFunc editing_started_cb;
120 GFunc editing_finished_cb;
121 gpointer editing_cb_data;
124 gchar *state_section;
125 gboolean seen_state_visibility;
126 gulong columns_changed_cb_id;
127 gulong sort_column_changed_cb_id;
128 gulong size_allocate_cb_id;
131 GNC_DEFINE_TYPE_WITH_CODE(
GncTreeView, gnc_tree_view, GTK_TYPE_TREE_VIEW,
134 #define GNC_TREE_VIEW_GET_PRIVATE(o) \ 135 ((GncTreeViewPrivate*)g_type_instance_get_private((GTypeInstance*)o, GNC_TYPE_TREE_VIEW)) 145 static GObjectClass *parent_class = NULL;
159 GObjectClass *gobject_class;
160 GtkWidgetClass *gtkwidget_class;
162 parent_class = g_type_class_peek_parent (klass);
164 gobject_class = G_OBJECT_CLASS(klass);
165 gtkwidget_class = GTK_WIDGET_CLASS(klass);
167 gobject_class->set_property = gnc_tree_view_set_property;
168 gobject_class->get_property = gnc_tree_view_get_property;
170 g_object_class_install_property (gobject_class,
172 g_param_spec_string (
"state-section",
174 "The section name in the saved state to use for (re)storing the treeview's visual state (visible columns, sort order,...",
177 g_object_class_install_property (gobject_class,
178 PROP_SHOW_COLUMN_MENU,
179 g_param_spec_boolean (
"show-column-menu",
181 "Show the column menu so user can change what columns are visible.",
186 gobject_class->finalize = gnc_tree_view_finalize;
189 gtkwidget_class->destroy = gnc_tree_view_destroy;
193 gnc_tree_view_update_grid_lines (gpointer prefs, gchar* pref, gpointer user_data)
196 gtk_tree_view_set_grid_lines (GTK_TREE_VIEW(view), gnc_tree_view_get_grid_lines_pref ());
200 gnc_tree_view_select_column_icon_cb (GtkWidget *widget, GdkEventButton *event, gpointer user_data)
204 GtkStyleContext *stylectxt = gtk_widget_get_style_context (widget);
208 if (event->button != 1)
211 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
213 gtk_style_context_get_padding (stylectxt, GTK_STATE_FLAG_NORMAL, &padding);
215 if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL)
217 if (event->x < (gtk_widget_get_allocated_width (priv->column_menu_icon_box) + padding.left))
218 gnc_tree_view_select_column_cb (priv->column_menu_column, view);
222 if (event->x > (gtk_widget_get_allocated_width (widget) -
223 (gtk_widget_get_allocated_width (priv->column_menu_icon_box) + padding.right)))
224 gnc_tree_view_select_column_cb (priv->column_menu_column, view);
242 GtkTreeViewColumn *column;
243 GtkWidget *sep, *icon;
248 G_OBJECT_CLASS(klass));
250 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
251 priv->column_menu = NULL;
252 priv->show_column_menu = FALSE;
253 priv->sort_model = NULL;
254 priv->state_section = NULL;
255 priv->seen_state_visibility = FALSE;
256 priv->columns_changed_cb_id = 0;
257 priv->sort_column_changed_cb_id = 0;
258 priv->size_allocate_cb_id = 0;
261 gtk_widget_set_name (GTK_WIDGET(view),
"gnc-id-tree-view");
264 gtk_tree_view_set_column_drag_function (GTK_TREE_VIEW(view),
265 gnc_tree_view_drop_ok_cb, NULL, NULL);
268 gtk_tree_view_set_grid_lines (GTK_TREE_VIEW(view), gnc_tree_view_get_grid_lines_pref ());
270 gnc_tree_view_update_grid_lines, view);
272 gnc_tree_view_update_grid_lines, view);
277 icon = gtk_image_new_from_icon_name (
"pan-down-symbolic", GTK_ICON_SIZE_SMALL_TOOLBAR);
279 priv->column_menu_icon_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
280 gtk_box_set_homogeneous (GTK_BOX(priv->column_menu_icon_box), FALSE);
282 gtk_widget_set_margin_start (GTK_WIDGET(icon), 5);
284 gtk_box_pack_end (GTK_BOX(priv->column_menu_icon_box), icon, FALSE, FALSE, 0);
286 sep = gtk_separator_new (GTK_ORIENTATION_VERTICAL);
287 gtk_box_pack_end (GTK_BOX(priv->column_menu_icon_box), sep, FALSE, FALSE, 0);
289 gtk_widget_show_all (priv->column_menu_icon_box);
293 g_object_set (G_OBJECT(column),
295 "widget", priv->column_menu_icon_box,
300 priv->column_menu_column = column;
304 GtkWidget *mybox = gtk_widget_get_parent (icon);
305 GtkWidget *walign = gtk_widget_get_parent (mybox);
306 GtkWidget *box = gtk_widget_get_parent (walign);
307 GtkWidget *button = gtk_widget_get_parent (box);
309 if (!GTK_IS_BUTTON(button))
312 g_signal_connect (G_OBJECT(column),
"clicked",
313 G_CALLBACK(gnc_tree_view_select_column_cb),
321 gtk_widget_set_events (button, GDK_BUTTON_PRESS_MASK);
323 g_signal_connect (G_OBJECT(button),
"button_press_event",
324 G_CALLBACK(gnc_tree_view_select_column_icon_cb),
328 gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED);
342 gnc_tree_view_finalize (GObject *
object)
344 ENTER(
"view %p",
object);
345 g_return_if_fail (
object != NULL);
346 g_return_if_fail (GNC_IS_TREE_VIEW(
object));
350 if (G_OBJECT_CLASS(parent_class)->finalize)
351 G_OBJECT_CLASS(parent_class)->finalize (
object);
367 gnc_tree_view_destroy (GtkWidget *widget)
372 ENTER(
"view %p", widget);
373 g_return_if_fail (widget != NULL);
374 g_return_if_fail (GNC_IS_TREE_VIEW(widget));
376 view = GNC_TREE_VIEW(widget);
379 gnc_tree_view_update_grid_lines, view);
381 gnc_tree_view_update_grid_lines, view);
383 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
385 if (priv->state_section)
389 g_free (priv->state_section);
390 priv->state_section = NULL;
392 if (priv->column_menu)
394 DEBUG(
"removing column selection menu");
395 g_object_unref (priv->column_menu);
396 priv->column_menu = NULL;
399 if (GTK_WIDGET_CLASS(parent_class)->destroy)
400 GTK_WIDGET_CLASS(parent_class)->destroy (widget);
421 gnc_tree_view_get_property (GObject *
object,
429 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
432 case PROP_STATE_SECTION:
433 g_value_set_string (value, priv->state_section);
435 case PROP_SHOW_COLUMN_MENU:
436 g_value_set_boolean (value, priv->show_column_menu);
439 G_OBJECT_WARN_INVALID_PROPERTY_ID(
object, prop_id, pspec);
454 gnc_tree_view_set_property (GObject *
object,
463 case PROP_STATE_SECTION:
466 case PROP_SHOW_COLUMN_MENU:
470 G_OBJECT_WARN_INVALID_PROPERTY_ID(
object, prop_id, pspec);
498 static GtkTreeViewColumn *
502 GtkTreeViewColumn *column, *found = NULL;
503 GList *column_list, *tmp;
507 column_list = gtk_tree_view_get_columns (GTK_TREE_VIEW(view));
508 for (tmp = column_list; tmp; tmp = g_list_next (tmp))
511 id = GPOINTER_TO_INT(g_object_get_data (G_OBJECT(column), MODEL_COLUMN));
517 g_list_free (column_list);
537 GtkTreeViewColumn *column, *found = NULL;
538 GList *column_list, *tmp;
542 column_list = gtk_tree_view_get_columns(GTK_TREE_VIEW(view));
543 for (tmp = column_list; tmp; tmp = g_list_next (tmp))
546 name = g_object_get_data (G_OBJECT(column), PREF_NAME);
547 if (!name || (strcmp(name, wanted) != 0))
552 g_list_free (column_list);
593 gnc_tree_view_drop_ok_cb (GtkTreeView *view,
594 GtkTreeViewColumn *column,
595 GtkTreeViewColumn *prev_column,
596 GtkTreeViewColumn *next_column,
599 const gchar *pref_name;
604 if (prev_column == NULL)
609 if (next_column == NULL)
617 pref_name = g_object_get_data (G_OBJECT(prev_column), PREF_NAME);
655 GtkTreeViewColumn *column,
656 const gchar *pref_name)
660 const gchar *col_name = pref_name;
662 ENTER(
"column %p, name %s", column, pref_name ? pref_name :
"(null)");
663 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
666 if (g_object_get_data (G_OBJECT(column), ALWAYS_VISIBLE))
668 LEAVE(
"1, first column");
671 col_name = g_object_get_data (G_OBJECT(column), PREF_NAME);
672 DEBUG(
"col_name is %s", col_name ? col_name :
"(null)");
677 LEAVE(
"1, no pref name");
682 if (priv->state_section)
685 gchar *key = g_strdup_printf (
"%s_%s", col_name, STATE_KEY_SUFF_VISIBLE);
687 if (g_key_file_has_key (state_file, priv->state_section, key, NULL))
689 visible = g_key_file_get_boolean (state_file, priv->state_section, key, NULL);
691 LEAVE(
"%d, state defined visibility", visible);
698 (g_object_get_data (G_OBJECT(column), DEFAULT_VISIBLE) != NULL) : FALSE;
699 LEAVE(
"defaults says %d", visible);
714 gnc_tree_view_update_visibility (GtkTreeViewColumn *column,
719 g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN(column));
720 g_return_if_fail (GNC_IS_TREE_VIEW(view));
723 visible = gnc_tree_view_column_visible (view, column, NULL);
724 gtk_tree_view_column_set_visible (column, visible);
725 LEAVE(
"made %s", visible ?
"visible" :
"invisible");
741 GtkTreeModel *s_model;
744 gchar *order_str = NULL;
746 s_model = gtk_tree_view_get_model (GTK_TREE_VIEW(view));
750 if (!gtk_tree_sortable_get_sort_column_id (GTK_TREE_SORTABLE(s_model),
754 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE(s_model),
756 order_str = g_strdup (order == GTK_SORT_ASCENDING ?
"ascending" :
"descending");
757 DEBUG(
"current sort_order is %s", order_str);
773 GtkTreeModel *s_model;
774 GtkTreeViewColumn *column;
779 s_model = gtk_tree_view_get_model (GTK_TREE_VIEW(view));
783 if (!gtk_tree_sortable_get_sort_column_id (GTK_TREE_SORTABLE(s_model),
787 column = view_column_find_by_model_id (view, current);
791 name = g_object_get_data (G_OBJECT(column), PREF_NAME);
792 DEBUG(
"current sort column is %s", name ? name :
"(NULL)");
793 return g_strdup (name);
815 gchar *col_names = NULL;
816 gchar **col_str_list;
821 columns = gtk_tree_view_get_columns (GTK_TREE_VIEW(view));
822 for (tmp = columns; tmp; tmp = g_list_next(tmp))
824 GtkTreeViewColumn *column = tmp->data;
825 const gchar *name = g_object_get_data (G_OBJECT(column), PREF_NAME);
827 col_names = g_strdup (name);
830 gchar *col_names_prev = col_names;
831 col_names = g_strjoin (
";", col_names_prev, name, NULL);
832 g_free (col_names_prev);
837 col_str_list = g_strsplit (col_names,
";", 0);
840 g_list_free (columns);
843 LEAVE(
"column order get");
862 GtkTreeModel *s_model;
863 GtkSortType order = GTK_SORT_ASCENDING;
866 s_model = gtk_tree_view_get_model (GTK_TREE_VIEW(view));
869 if (g_strcmp0 (name,
"descending") == 0)
870 order = GTK_SORT_DESCENDING;
871 if (!gtk_tree_sortable_get_sort_column_id (GTK_TREE_SORTABLE(s_model),
873 current = GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID;
874 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE(s_model),
876 DEBUG(
"sort_order set to %s", order == GTK_SORT_ASCENDING ?
"ascending" :
"descending");
891 GtkTreeModel *s_model;
892 GtkTreeViewColumn *column;
894 gint model_column, current;
896 s_model = gtk_tree_view_get_model (GTK_TREE_VIEW(view));
903 gtk_tree_sortable_set_sort_column_id (
904 GTK_TREE_SORTABLE(s_model), GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID,
910 GPOINTER_TO_INT(g_object_get_data (G_OBJECT(column), MODEL_COLUMN));
911 if (model_column == GNC_TREE_VIEW_COLUMN_DATA_NONE)
914 if (!gtk_tree_sortable_get_sort_column_id (GTK_TREE_SORTABLE(s_model),
916 order = GTK_SORT_ASCENDING;
918 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE(s_model),
919 model_column, order);
920 DEBUG(
"sort column set to %s", name);
937 gchar **column_names,
940 GtkTreeViewColumn *column, *prev;
948 for (idx = 0; idx < length; idx++)
950 const gchar *name = column_names [idx];
954 columns = g_slist_append (columns, column);
958 for (prev = NULL, tmp = columns; tmp; tmp = g_slist_next (tmp))
961 gtk_tree_view_move_column_after (GTK_TREE_VIEW(view), column, prev);
966 g_slist_free (columns);
967 LEAVE(
"column order set");
984 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
985 if (!priv->state_section)
987 LEAVE(
"no state section");
991 g_key_file_remove_group (state_file, priv->state_section, NULL);
992 g_free (priv->state_section);
993 priv->state_section = NULL;
1006 const gchar *section)
1009 GKeyFile *state_file;
1011 g_return_if_fail (GNC_IS_TREE_VIEW(view));
1013 ENTER(
"view %p, section %s", view, section);
1015 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
1018 if (priv->state_section)
1023 LEAVE(
"cleared state section");
1028 priv->state_section = g_strdup (section);
1031 if (g_key_file_has_group (state_file, priv->state_section))
1033 gsize num_keys, idx;
1034 gchar **keys = g_key_file_get_keys (state_file, priv->state_section, &num_keys, NULL);
1035 for (idx = 0; idx < num_keys; idx++)
1037 gchar *key = keys[idx];
1038 if (g_strcmp0 (key, STATE_KEY_SORT_COLUMN) == 0)
1040 gnc_tree_view_set_sort_column (view,
1041 g_key_file_get_string (state_file, priv->state_section, key, NULL));
1043 else if (g_strcmp0 (key, STATE_KEY_SORT_ORDER) == 0)
1045 gnc_tree_view_set_sort_order (view,
1046 g_key_file_get_string (state_file, priv->state_section, key, NULL));
1048 else if (g_strcmp0 (key, STATE_KEY_COLUMN_ORDER) == 0)
1051 gchar **columns = g_key_file_get_string_list (state_file, priv->state_section,
1052 key, &length, NULL);
1053 gnc_tree_view_set_column_order (view, columns, length);
1054 g_strfreev (columns);
1060 gboolean known = FALSE;
1061 gchar *column_name = g_strdup (key);
1062 gchar *type_name = g_strrstr (column_name,
"_");
1064 if (type_name != NULL)
1066 *type_name++ =
'\0';
1068 if (g_strcmp0 (type_name, STATE_KEY_SUFF_VISIBLE) == 0)
1074 if (!g_object_get_data (G_OBJECT (column), ALWAYS_VISIBLE))
1076 gtk_tree_view_column_set_visible (column,
1077 g_key_file_get_boolean (state_file, priv->state_section, key, NULL));
1081 else if (g_strcmp0 (type_name, STATE_KEY_SUFF_WIDTH) == 0)
1083 gint width = g_key_file_get_integer (state_file, priv->state_section, key, NULL);
1088 if (width && (width != gtk_tree_view_column_get_width (column)))
1090 gtk_tree_view_column_set_fixed_width (column, width);
1095 DEBUG (
"Ignored key %s", key);
1097 g_free (column_name);
1105 gnc_tree_view_build_column_menu (view);
1106 LEAVE (
"set state section");
1120 g_return_val_if_fail (GNC_IS_TREE_VIEW(view), NULL);
1122 priv = GNC_TREE_VIEW_GET_PRIVATE (view);
1123 return priv->state_section;
1130 ENTER(
"view %p", view);
1131 g_return_if_fail (view != NULL);
1132 g_return_if_fail (GNC_IS_TREE_VIEW(view));
1134 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
1136 if (priv->state_section)
1139 GList *column_list, *tmp;
1142 gchar *sort_column = gnc_tree_view_get_sort_column (view);
1143 gchar *sort_order = gnc_tree_view_get_sort_order (view);
1144 gchar **col_order = gnc_tree_view_get_column_order (view, &num_cols);
1147 if (sort_column && (g_strcmp0 (sort_column,
"name") != 0))
1148 g_key_file_set_string (state_file, priv->state_section, STATE_KEY_SORT_COLUMN, sort_column);
1149 else if (g_key_file_has_key (state_file, priv->state_section, STATE_KEY_SORT_COLUMN, NULL))
1150 g_key_file_remove_key (state_file, priv->state_section, STATE_KEY_SORT_COLUMN, NULL);
1151 g_free (sort_column);
1155 if (g_strcmp0 (sort_order,
"descending") == 0)
1156 g_key_file_set_string (state_file, priv->state_section, STATE_KEY_SORT_ORDER, sort_order);
1157 else if (g_key_file_has_key (state_file, priv->state_section, STATE_KEY_SORT_ORDER, NULL))
1158 g_key_file_remove_key (state_file, priv->state_section, STATE_KEY_SORT_ORDER, NULL);
1159 g_free (sort_order);
1161 if (col_order && (num_cols > 0))
1162 g_key_file_set_string_list (state_file, priv->state_section, STATE_KEY_COLUMN_ORDER,
1163 (
const gchar**) col_order, num_cols);
1164 else if (g_key_file_has_key (state_file, priv->state_section, STATE_KEY_COLUMN_ORDER, NULL))
1165 g_key_file_remove_key (state_file, priv->state_section, STATE_KEY_COLUMN_ORDER, NULL);
1167 g_strfreev (col_order);
1171 column_list = gtk_tree_view_get_columns (GTK_TREE_VIEW(view));
1172 for (tmp = column_list; tmp; tmp = g_list_next (tmp))
1174 GtkTreeViewColumn *column = tmp->data;
1176 const gchar *name = g_object_get_data (G_OBJECT(column), PREF_NAME);
1180 if (!g_object_get_data (G_OBJECT(column), ALWAYS_VISIBLE))
1182 key = g_strjoin (
"_", name, STATE_KEY_SUFF_VISIBLE, NULL);
1183 g_key_file_set_boolean (state_file, priv->state_section, key,
1184 gtk_tree_view_column_get_visible (column));
1188 key = g_strjoin (
"_", name, STATE_KEY_SUFF_WIDTH, NULL);
1189 if (g_object_get_data (G_OBJECT(column),
"default-width") &&
1190 (GPOINTER_TO_INT((g_object_get_data (G_OBJECT(column),
"default-width")))
1191 != gtk_tree_view_column_get_width (column)))
1193 g_key_file_set_integer (state_file, priv->state_section, key,
1194 gtk_tree_view_column_get_width (column));
1196 else if (g_key_file_has_key (state_file, priv->state_section, key, NULL))
1197 g_key_file_remove_key (state_file, priv->state_section, key, NULL);
1200 g_list_free (column_list);
1232 gnc_tree_view_create_menu_item (GtkTreeViewColumn *column,
1237 const gchar *column_name, *pref_name;
1242 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
1243 if (!priv->state_section)
1249 pref_name = g_object_get_data (G_OBJECT(column), PREF_NAME);
1257 if (!priv->column_menu)
1259 priv->column_menu = gtk_menu_new();
1260 g_object_ref_sink (priv->column_menu);
1264 column_name = g_object_get_data (G_OBJECT(column), REAL_TITLE);
1266 column_name = gtk_tree_view_column_get_title (column);
1267 widget = gtk_check_menu_item_new_with_label (column_name);
1268 gtk_menu_shell_append (GTK_MENU_SHELL(priv->column_menu), widget);
1271 if (g_object_get_data (G_OBJECT(column), ALWAYS_VISIBLE))
1273 g_object_set_data (G_OBJECT(widget), ALWAYS_VISIBLE, GINT_TO_POINTER(1));
1274 gtk_widget_set_sensitive (widget, FALSE);
1277 binding = g_object_bind_property (G_OBJECT(widget),
"active", G_OBJECT(column),
"visible", 0);
1278 g_object_set_data (G_OBJECT(widget),
"column-binding", binding);
1281 key = g_strdup_printf (
"%s_%s", pref_name, STATE_KEY_SUFF_VISIBLE);
1282 g_object_set_data_full (G_OBJECT(widget), STATE_KEY, key, g_free);
1298 gnc_tree_view_build_column_menu (
GncTreeView *view)
1303 g_return_if_fail (GNC_IS_TREE_VIEW(view));
1305 ENTER(
"view %p", view);
1306 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
1309 if (priv->column_menu)
1311 g_object_unref (priv->column_menu);
1312 priv->column_menu = NULL;
1315 if (priv->show_column_menu && priv->state_section)
1318 if (priv->column_menu_column)
1319 gtk_tree_view_column_set_visible (priv->column_menu_column, TRUE);
1322 column_list = gtk_tree_view_get_columns (GTK_TREE_VIEW(view));
1323 g_list_foreach (column_list, (GFunc)gnc_tree_view_create_menu_item, view);
1324 g_list_free (column_list);
1329 if (priv->column_menu_column)
1330 gtk_tree_view_column_set_visible (priv->column_menu_column, FALSE);
1332 LEAVE(
"menu: show %d, section %s", priv->show_column_menu,
1333 priv->state_section ? priv->state_section :
"(null)");
1346 gnc_tree_view_update_column_menu_item (GtkCheckMenuItem *checkmenuitem,
1351 g_return_if_fail (GTK_IS_CHECK_MENU_ITEM(checkmenuitem));
1352 g_return_if_fail (GNC_IS_TREE_VIEW(view));
1354 if (g_object_get_data (G_OBJECT(checkmenuitem), ALWAYS_VISIBLE))
1360 GBinding *binding = g_object_get_data (G_OBJECT(checkmenuitem),
"column-binding");
1361 GtkTreeViewColumn *column = GTK_TREE_VIEW_COLUMN(g_binding_get_target (binding));
1363 visible = gtk_tree_view_column_get_visible (column);
1365 gtk_check_menu_item_set_active (checkmenuitem, visible);
1381 gnc_tree_view_select_column_cb (GtkTreeViewColumn *column,
1387 g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN(column));
1388 g_return_if_fail (GNC_IS_TREE_VIEW(view));
1390 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
1391 menu = priv->column_menu;
1396 gtk_container_foreach (GTK_CONTAINER(menu),
1397 (GtkCallback)gnc_tree_view_update_column_menu_item,
1401 gtk_widget_show_all (menu);
1404 gtk_menu_popup_at_pointer (GTK_MENU(priv->column_menu), NULL);
1409 gchar *first_column_name,
1413 GtkTreeViewColumn *column;
1414 gboolean hide_spacer;
1415 GList *columns, *tmp;
1416 gchar *name, *pref_name;
1419 g_return_if_fail (GNC_IS_TREE_VIEW(view));
1421 va_start (args, first_column_name);
1422 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
1423 name = first_column_name;
1424 hide_spacer = FALSE;
1427 columns = gtk_tree_view_get_columns (GTK_TREE_VIEW(view));
1428 for (tmp = columns; tmp; tmp = g_list_next (tmp))
1431 pref_name = g_object_get_data (G_OBJECT(column), PREF_NAME);
1432 if (pref_name != NULL)
1433 gtk_tree_view_column_set_expand (column, FALSE);
1435 g_list_free(columns);
1438 while (name != NULL)
1443 gtk_tree_view_column_set_expand (column, TRUE);
1446 name = va_arg (args, gchar*);
1457 update_control_cell_renderers_background (
GncTreeView *view, GtkTreeViewColumn *col,
1458 gint column, GtkTreeCellDataFunc func )
1461 GtkCellRenderer *cell;
1464 renderers = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT(col));
1467 for (node = renderers; node; node = node->next)
1471 gtk_tree_view_column_add_attribute (col, cell,
"cell-background", column);
1473 gtk_tree_view_column_set_cell_data_func (col, cell, func, view, NULL);
1475 g_list_free (renderers);
1486 g_return_if_fail (GNC_IS_TREE_VIEW(view));
1488 ENTER(
"view %p, column %d, func %p", view, column, func);
1489 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
1491 update_control_cell_renderers_background (view, priv->column_menu_column, column, func);
1504 g_return_if_fail (GNC_IS_TREE_VIEW(view));
1506 ENTER(
"view %p, sort_model %p", view, s_model);
1507 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
1509 priv->sort_model = s_model;
1526 g_return_if_fail (GNC_IS_TREE_VIEW(view));
1528 ENTER(
"view %p, show menu %d", view, visible);
1529 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
1530 priv->show_column_menu = visible;
1531 gnc_tree_view_build_column_menu (view);
1546 g_return_val_if_fail (GNC_IS_TREE_VIEW(view), FALSE);
1548 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
1549 return (priv->show_column_menu);
1559 gnc_tree_view_count_visible_columns (
GncTreeView *view)
1561 GList *columns, *node;
1564 columns = gtk_tree_view_get_columns (GTK_TREE_VIEW(view));
1565 for (node = columns; node; node = node->next)
1567 GtkTreeViewColumn *col = GTK_TREE_VIEW_COLUMN(node->data);
1569 if (g_object_get_data (G_OBJECT(col), DEFAULT_VISIBLE) ||
1570 g_object_get_data (G_OBJECT(col), ALWAYS_VISIBLE))
1573 g_list_free (columns);
1581 GtkTreeViewColumn *column;
1583 gboolean hide_menu_column;
1585 g_return_if_fail (GNC_IS_TREE_VIEW(view));
1590 columns = gtk_tree_view_get_columns (GTK_TREE_VIEW(view));
1591 g_list_foreach (columns, (GFunc)gnc_tree_view_update_visibility, view);
1592 g_list_free (columns);
1594 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
1595 if (priv->state_section)
1596 priv->seen_state_visibility = TRUE;
1600 hide_menu_column = (gnc_tree_view_count_visible_columns (view) == 1);
1601 column = gtk_tree_view_get_column (GTK_TREE_VIEW(view), 0);
1602 gtk_tree_view_column_set_expand (column, hide_menu_column);
1603 gtk_tree_view_column_set_visible (priv->column_menu_column, !hide_menu_column);
1639 gnc_tree_view_column_properties (
GncTreeView *view,
1640 GtkTreeViewColumn *column,
1641 const gchar *pref_name,
1645 GtkTreeIterCompareFunc column_sort_fn)
1648 GtkTreeModel *s_model;
1654 g_object_set_data (G_OBJECT(column), PREF_NAME, (gpointer)pref_name);
1655 if (data_column == 0)
1656 g_object_set_data (G_OBJECT(column), ALWAYS_VISIBLE, GINT_TO_POINTER(1));
1657 g_object_set_data (G_OBJECT(column), MODEL_COLUMN,
1658 GINT_TO_POINTER(data_column));
1661 visible = gnc_tree_view_column_visible (view, NULL, pref_name);
1664 g_object_set (G_OBJECT(column),
1666 "resizable", resizable && pref_name != NULL,
1667 "reorderable", pref_name != NULL,
1671 if (default_width == 0)
1674 g_object_set (G_OBJECT(column),
1675 "sizing", GTK_TREE_VIEW_COLUMN_AUTOSIZE,
1685 width = default_width + 10;
1690 g_object_set (G_OBJECT(column),
1691 "sizing", GTK_TREE_VIEW_COLUMN_FIXED,
1692 "fixed-width", width,
1699 g_object_set_data (G_OBJECT(column),
1700 "default-width", GINT_TO_POINTER(width));
1703 s_model = gtk_tree_view_get_model (GTK_TREE_VIEW(view));
1704 if (GTK_IS_TREE_SORTABLE(s_model))
1706 gtk_tree_view_column_set_sort_column_id (column, data_column);
1709 gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE(s_model),
1710 data_column, column_sort_fn,
1711 GINT_TO_POINTER(data_column),
1717 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
1718 if (priv->sort_model != NULL)
1720 gtk_tree_view_column_set_sort_column_id (column, data_column);
1723 gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE(priv->sort_model),
1724 data_column, column_sort_fn,
1733 gnc_tree_view_create_menu_item (column, view);
1749 const gchar *column_title,
1750 const gchar *column_short_title,
1751 const gchar *pref_name,
1752 gint model_data_column,
1753 gint model_visibility_column,
1754 GtkTreeIterCompareFunc column_sort_fn,
1755 renderer_toggled toggle_edited_cb)
1757 GtkTreeViewColumn *column;
1758 GtkCellRenderer *renderer;
1760 g_return_val_if_fail (GNC_IS_TREE_VIEW(view), NULL);
1762 renderer = gtk_cell_renderer_toggle_new ();
1763 if (!toggle_edited_cb)
1765 gtk_cell_renderer_toggle_set_activatable (GTK_CELL_RENDERER_TOGGLE(renderer), FALSE);
1768 gtk_tree_view_column_new_with_attributes (column_short_title,
1770 "active", model_data_column,
1774 g_object_set_data_full (G_OBJECT(column), REAL_TITLE,
1775 g_strdup(column_title), g_free);
1776 if (toggle_edited_cb)
1777 g_signal_connect (G_OBJECT(renderer),
"toggled",
1778 G_CALLBACK(toggle_edited_cb), view);
1780 if (model_visibility_column != GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS)
1781 gtk_tree_view_column_add_attribute (column, renderer,
1782 "visible", model_visibility_column);
1785 gnc_tree_view_column_properties (view, column, pref_name, model_data_column,
1786 0, FALSE, column_sort_fn);
1791 gtk_widget_set_tooltip_text (gtk_tree_view_column_get_button (column), column_title);
1797 renderer_editing_canceled_cb (GtkCellRenderer *renderer, gpointer user_data)
1801 if (priv->editing_finished_cb)
1802 (priv->editing_finished_cb)(view, priv->editing_cb_data);
1806 renderer_editing_started_cb (GtkCellRenderer *renderer,
1807 GtkCellEditable *editable, gchar *path, gpointer user_data)
1811 if (priv->editing_started_cb)
1812 (priv->editing_started_cb)(view, priv->editing_cb_data);
1816 renderer_edited_cb (GtkCellRendererText *renderer, gchar *path,
1817 gchar *new_text, gpointer user_data)
1821 if (priv->editing_finished_cb)
1822 (priv->editing_finished_cb)(view, priv->editing_cb_data);
1826 static GtkTreeViewColumn *
1827 add_text_column_variant (
GncTreeView *view, GtkCellRenderer *renderer,
1828 const gchar *column_title,
1829 const gchar *pref_name,
1830 const gchar *icon_name,
1831 const gchar *sizing_text,
1832 gint model_data_column,
1833 gint model_visibility_column,
1834 GtkTreeIterCompareFunc column_sort_fn)
1836 GtkTreeViewColumn *column;
1837 PangoLayout* layout;
1838 int default_width, title_width;
1840 g_return_val_if_fail (GNC_IS_TREE_VIEW(view), NULL);
1842 column = gtk_tree_view_column_new ();
1843 gtk_tree_view_column_set_title (column, column_title);
1848 GtkCellRenderer *renderer_pix = gtk_cell_renderer_pixbuf_new ();
1849 g_object_set (renderer_pix,
"icon-name", icon_name, NULL);
1850 gtk_tree_view_column_pack_start (column, renderer_pix, FALSE);
1854 gtk_tree_view_column_pack_start (column, renderer, TRUE);
1857 g_signal_connect (G_OBJECT(renderer),
"editing-canceled",
1858 (GCallback)renderer_editing_canceled_cb, view);
1860 g_signal_connect (G_OBJECT(renderer),
"editing-started",
1861 (GCallback)renderer_editing_started_cb, view);
1863 g_signal_connect (G_OBJECT(renderer),
"edited",
1864 (GCallback)renderer_edited_cb, view);
1867 if (model_data_column != GNC_TREE_VIEW_COLUMN_DATA_NONE)
1868 gtk_tree_view_column_add_attribute (column, renderer,
1869 "text", model_data_column);
1870 if (model_visibility_column != GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS)
1871 gtk_tree_view_column_add_attribute (column, renderer,
1872 "visible", model_visibility_column);
1875 layout = gtk_widget_create_pango_layout (GTK_WIDGET(view), column_title);
1876 pango_layout_get_pixel_size (layout, &title_width, NULL);
1877 g_object_unref (layout);
1878 layout = gtk_widget_create_pango_layout (GTK_WIDGET(view), sizing_text);
1879 pango_layout_get_pixel_size (layout, &default_width, NULL);
1880 g_object_unref (layout);
1881 default_width = MAX(default_width, title_width);
1883 default_width += 10;
1884 gnc_tree_view_column_properties (view, column, pref_name, model_data_column,
1885 default_width, TRUE, column_sort_fn);
1902 const gchar *column_title,
1903 const gchar *pref_name,
1904 const gchar *icon_name,
1905 const gchar *sizing_text,
1906 gint model_data_column,
1907 gint model_visibility_column,
1908 GtkTreeIterCompareFunc column_sort_fn)
1910 GtkCellRenderer *renderer;
1912 g_return_val_if_fail (GNC_IS_TREE_VIEW(view), NULL);
1914 renderer = gtk_cell_renderer_text_new ();
1916 return add_text_column_variant (view, renderer,
1917 column_title, pref_name,
1918 icon_name, sizing_text,
1920 model_visibility_column,
1934 const gchar *column_title,
1935 const gchar *pref_name,
1936 const gchar *icon_name,
1937 const gchar *sizing_text,
1938 gint model_data_column,
1939 gint model_visibility_column,
1940 GtkTreeIterCompareFunc column_sort_fn)
1942 GtkCellRenderer *renderer;
1944 g_return_val_if_fail (GNC_IS_TREE_VIEW(view), NULL);
1946 renderer = gnc_cell_renderer_text_view_new ();
1948 return add_text_column_variant (view, renderer,
1949 column_title, pref_name,
1950 icon_name, sizing_text,
1952 model_visibility_column,
1967 const gchar *column_title,
1968 const gchar *pref_name,
1969 const gchar *icon_name,
1970 const gchar *sizing_text,
1971 gint model_data_column,
1972 gint model_visibility_column,
1973 GtkTreeIterCompareFunc column_sort_fn)
1975 GtkTreeViewColumn *column;
1976 GtkCellRenderer *renderer;
1977 PangoLayout* layout;
1978 int default_width, title_width;
1980 g_return_val_if_fail (GNC_IS_TREE_VIEW(view), NULL);
1982 column = gtk_tree_view_column_new ();
1983 gtk_tree_view_column_set_title (column, column_title);
1988 renderer = gtk_cell_renderer_pixbuf_new ();
1989 g_object_set (renderer,
"icon-name", icon_name, NULL);
1990 gtk_tree_view_column_pack_start (column, renderer, FALSE);
1994 renderer = gnc_cell_renderer_date_new (TRUE);
1995 gtk_tree_view_column_pack_start (column, renderer, TRUE);
1998 if (model_data_column != GNC_TREE_VIEW_COLUMN_DATA_NONE)
1999 gtk_tree_view_column_add_attribute (column, renderer,
2000 "text", model_data_column);
2001 if (model_visibility_column != GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS)
2002 gtk_tree_view_column_add_attribute (column, renderer,
2003 "visible", model_visibility_column);
2006 layout = gtk_widget_create_pango_layout (GTK_WIDGET(view), column_title);
2007 pango_layout_get_pixel_size (layout, &title_width, NULL);
2008 g_object_unref (layout);
2009 layout = gtk_widget_create_pango_layout (GTK_WIDGET(view), sizing_text);
2010 pango_layout_get_pixel_size (layout, &default_width, NULL);
2011 g_object_unref (layout);
2012 default_width = MAX(default_width, title_width);
2014 default_width += 10;
2015 gnc_tree_view_column_properties (view, column, pref_name, model_data_column,
2016 default_width, TRUE, column_sort_fn);
2025 const gchar *column_title,
2026 const gchar *pref_name,
2027 const gchar *sizing_text,
2028 gint model_data_column,
2029 gint model_visibility_column,
2030 GtkTreeModel *combo_tree_model,
2031 gint combo_model_text_column,
2032 GtkTreeIterCompareFunc column_sort_fn)
2034 GtkTreeViewColumn *column;
2035 GtkCellRenderer *renderer;
2036 PangoLayout* layout;
2037 int default_width, title_width;
2039 g_return_val_if_fail (GNC_IS_TREE_VIEW(view), NULL);
2041 column = gtk_tree_view_column_new ();
2042 gtk_tree_view_column_set_title (column, gettext(column_title));
2045 renderer = gtk_cell_renderer_combo_new ();
2046 gtk_tree_view_column_pack_start (column, renderer, TRUE);
2049 if (model_data_column != GNC_TREE_VIEW_COLUMN_DATA_NONE)
2050 gtk_tree_view_column_add_attribute (column, renderer,
2051 "text", model_data_column);
2052 if (model_visibility_column != GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS)
2053 gtk_tree_view_column_add_attribute (column, renderer,
2054 "visible", model_visibility_column);
2057 layout = gtk_widget_create_pango_layout (GTK_WIDGET(view), column_title);
2058 pango_layout_get_pixel_size (layout, &title_width, NULL);
2059 g_object_unref (layout);
2060 layout = gtk_widget_create_pango_layout (GTK_WIDGET(view), sizing_text);
2061 pango_layout_get_pixel_size (layout, &default_width, NULL);
2062 g_object_unref (layout);
2063 default_width = MAX(default_width, title_width);
2065 default_width += 10;
2067 gnc_tree_view_column_properties (view, column, pref_name, model_data_column,
2068 default_width, TRUE, column_sort_fn);
2071 if (combo_tree_model)
2073 g_object_set (G_OBJECT(renderer),
"model", combo_tree_model,
2074 "text-column", combo_model_text_column, NULL);
2086 GtkCellRenderer *cr = NULL;
2088 g_return_val_if_fail (GTK_TREE_VIEW_COLUMN(column), NULL);
2091 renderers = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT(column));
2092 if (g_list_length (renderers) > 0)
2093 cr = GTK_CELL_RENDERER(renderers->data);
2094 g_list_free (renderers);
2111 const gchar *column_title,
2112 const gchar *pref_name,
2113 const gchar *sizing_text,
2114 gint model_data_column,
2115 gint model_color_column,
2116 gint model_visibility_column,
2117 GtkTreeIterCompareFunc column_sort_fn)
2119 GtkTreeViewColumn *column;
2120 GtkCellRenderer *renderer;
2121 gfloat alignment = 1.0;
2124 NULL, sizing_text, model_data_column,
2125 model_visibility_column,
2131 if (gtk_widget_get_direction (GTK_WIDGET(view)) == GTK_TEXT_DIR_RTL)
2134 g_object_set (G_OBJECT(column),
"alignment", alignment, NULL);
2135 g_object_set (G_OBJECT(renderer),
"xalign", alignment, NULL);
2138 if (model_color_column != GNC_TREE_VIEW_COLUMN_COLOR_NONE)
2139 gtk_tree_view_column_add_attribute (column, renderer,
2140 "foreground", model_color_column);
2155 GtkTreeViewColumn *column)
2157 int n = gtk_tree_view_get_n_columns (GTK_TREE_VIEW(view));
2162 return gtk_tree_view_insert_column (GTK_TREE_VIEW(view), column, n);
2166 get_column_next_to (GtkTreeView *tv, GtkTreeViewColumn **col, gboolean backward)
2169 GtkTreeViewColumn *c = NULL;
2171 gboolean wrapped = FALSE;
2173 cols = gtk_tree_view_get_columns (tv);
2174 g_return_val_if_fail (cols != NULL, FALSE);
2176 node = g_list_find (cols, *col);
2177 g_return_val_if_fail (node, FALSE);
2180 node = backward ? node->prev : node->next;
2184 node = backward ? g_list_last (cols) : cols;
2186 c = GTK_TREE_VIEW_COLUMN (node->data);
2187 if (c && gtk_tree_view_column_get_visible (c))
2189 if (c == *col)
break;
2199 gnc_tree_view_path_is_valid (
GncTreeView *view, GtkTreePath *path)
2201 GtkTreeView *tv = GTK_TREE_VIEW(view);
2202 GtkTreeModel *s_model;
2205 s_model = gtk_tree_view_get_model (tv);
2206 return gtk_tree_model_get_iter (s_model, &iter, path);
2210 gnc_tree_view_keynav (
GncTreeView *view, GtkTreeViewColumn **col,
2211 GtkTreePath *path, GdkEventKey *event)
2213 GtkTreeView *tv = GTK_TREE_VIEW(view);
2217 if (event->type != GDK_KEY_PRESS)
return;
2219 switch (event->keyval)
2222 case GDK_KEY_ISO_Left_Tab:
2223 case GDK_KEY_KP_Tab:
2224 shifted =
event->state & GDK_SHIFT_MASK;
2225 if (get_column_next_to (tv, col, shifted))
2228 depth = gtk_tree_path_get_depth (path);
2231 if (!gtk_tree_path_prev (path) && depth > 1)
2233 gtk_tree_path_up (path);
2236 else if (gtk_tree_view_row_expanded (tv, path))
2238 gtk_tree_path_down (path);
2242 gtk_tree_path_next (path);
2243 if (!gnc_tree_view_path_is_valid (view, path) && depth > 2)
2245 gtk_tree_path_prev (path);
2246 gtk_tree_path_up (path);
2247 gtk_tree_path_next (path);
2249 if (!gnc_tree_view_path_is_valid (view, path) && depth > 1)
2251 gtk_tree_path_prev (path);
2252 gtk_tree_path_up (path);
2253 gtk_tree_path_next (path);
2259 case GDK_KEY_Return:
2260 case GDK_KEY_KP_Enter:
2261 if (gtk_tree_view_row_expanded (tv, path))
2263 gtk_tree_path_down (path);
2267 depth = gtk_tree_path_get_depth (path);
2268 gtk_tree_path_next (path);
2269 if (!gnc_tree_view_path_is_valid (view, path) && depth > 1)
2271 gtk_tree_path_prev (path);
2272 gtk_tree_path_up (path);
2273 gtk_tree_path_next (path);
2286 if (!view && !editing_started_cb)
2289 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
2291 priv->editing_started_cb = editing_started_cb;
2292 priv->editing_cb_data = editing_cb_data;
2300 if (!view && !editing_finished_cb)
2303 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
2305 priv->editing_finished_cb = editing_finished_cb;
2306 priv->editing_cb_data = editing_cb_data;
void gnc_tree_view_set_sort_user_data(GncTreeView *view, GtkTreeModel *s_model)
This allows the columns to be setup without the model connected.
Functions to load, save and get gui state.
void gnc_tree_view_expand_columns(GncTreeView *view, gchar *first_column_name,...)
This function set the columns that will be allocated the free space in the view.
gulong gnc_prefs_register_cb(const char *group, const gchar *pref_name, gpointer func, gpointer user_data)
Register a callback that gets triggered when the given preference changes.
void gnc_gobject_tracking_remember(GObject *object, GObjectClass *klass)
Tell gnucash to remember this object in the database.
void gnc_tree_view_set_editing_started_cb(GncTreeView *view, GFunc editing_started_cb, gpointer editing_cb_data)
Setup a callback for when the user starts editing so appropriate actions can be taken like disable th...
void gnc_gobject_tracking_forget(GObject *object)
Tell gnucash to remember this object in the database.
common utilities for manipulating a GtkTreeView within gnucash
#define DEBUG(format, args...)
Print a debugging message.
GtkTreeViewColumn * gnc_tree_view_add_date_column(GncTreeView *view, const gchar *column_title, const gchar *pref_name, const gchar *icon_name, const gchar *sizing_text, gint model_data_column, gint model_visibility_column, GtkTreeIterCompareFunc column_sort_fn)
This function adds a new date column to a GncTreeView base view.
gboolean gnc_tree_view_get_show_column_menu(GncTreeView *view)
This function is called to get the current value of the "show-column-menu" property.
GtkTreeViewColumn * gnc_tree_view_add_combo_column(GncTreeView *view, const gchar *column_title, const gchar *pref_name, const gchar *sizing_text, gint model_data_column, gint model_visibility_column, GtkTreeModel *combo_tree_model, gint combo_model_text_column, GtkTreeIterCompareFunc column_sort_fn)
This function adds a new combobox column to a GncTreeView base view.
void gnc_tree_view_remove_state_information(GncTreeView *view)
Completely wipe the treeview's state information (column visibility, width, sorting order...
void gnc_tree_view_set_show_column_menu(GncTreeView *view, gboolean visible)
This function is called to set the "show-column-menu" property on this view.
GtkTreeViewColumn * gnc_tree_view_add_numeric_column(GncTreeView *view, const gchar *column_title, const gchar *pref_name, const gchar *sizing_text, gint model_data_column, gint model_color_column, gint model_visibility_column, GtkTreeIterCompareFunc column_sort_fn)
This function adds a new numeric column to a GncTreeView base view.
GtkTreeViewColumn * gnc_tree_view_find_column_by_name(GncTreeView *view, const gchar *wanted)
Find a tree column given the "pref name" used with saved state.
#define ENTER(format, args...)
Print a function entry debugging message.
GKeyFile * gnc_state_get_current(void)
Returns a pointer to the most recently loaded state.
gint gnc_tree_view_append_column(GncTreeView *view, GtkTreeViewColumn *column)
Add a column to a view based upon a GncTreeView.
GtkTreeViewColumn * gnc_tree_view_add_toggle_column(GncTreeView *view, const gchar *column_title, const gchar *column_short_title, const gchar *pref_name, gint model_data_column, gint model_visibility_column, GtkTreeIterCompareFunc column_sort_fn, renderer_toggled toggle_edited_cb)
This function adds a new toggle column to a GncTreeView base view.
void gnc_tree_view_set_editing_finished_cb(GncTreeView *view, GFunc editing_finished_cb, gpointer editing_cb_data)
Setup a callback for when the user finishes editing so appropriate actions can be taken like enable t...
GtkCellRenderer * gnc_tree_view_column_get_renderer(GtkTreeViewColumn *column)
Return the "main" cell renderer from a GtkTreeViewColumn added to a GncTreeView my one of the conveni...
GtkTreeViewColumn * gnc_tree_view_add_text_view_column(GncTreeView *view, const gchar *column_title, const gchar *pref_name, const gchar *icon_name, const gchar *sizing_text, gint model_data_column, gint model_visibility_column, GtkTreeIterCompareFunc column_sort_fn)
This function adds a new text view column to a GncTreeView base view.
void gnc_tree_view_configure_columns(GncTreeView *view)
Make all the correct columns visible, respecting their default visibility setting, their "always" visibility setting, and the last saved state if available.
void gnc_tree_view_save_state(GncTreeView *view)
This function is called to write the treeview's state information (column visibility, width, sorting order,..) to the state file.
void gnc_tree_view_set_control_column_background(GncTreeView *view, gint column, GtkTreeCellDataFunc func)
This function links the cell backgrounds of the two control columns to a column in the model that has...
Gnome specific utility functions.
All type declarations for the whole Gnucash engine.
const gchar * gnc_tree_view_get_state_section(GncTreeView *view)
Get the name of the state section this tree view is associated with.
Generic api to store and retrieve preferences.
void gnc_tree_view_set_state_section(GncTreeView *view, const gchar *section)
Set up or remove an association between a saved state section and the display of a view...
GtkTreeViewColumn * gnc_tree_view_add_text_column(GncTreeView *view, const gchar *column_title, const gchar *pref_name, const gchar *icon_name, const gchar *sizing_text, gint model_data_column, gint model_visibility_column, GtkTreeIterCompareFunc column_sort_fn)
This function adds a new text column to a GncTreeView base view.
#define LEAVE(format, args...)
Print a function exit debugging message.
void gnc_prefs_remove_cb_by_func(const gchar *group, const gchar *pref_name, gpointer func, gpointer user_data)
Remove a function that was registered for a callback when the given preference changed.