37 #include <glib/gi18n.h> 38 #include <gdk/gdkkeysyms.h> 46 #include "gnc-cell-renderer-label.h" 47 #include "gnc-cell-renderer-text-view.h" 50 #include "dialog-utils.h" 55 #define STATE_KEY "state-key" 58 #define STATE_KEY_SORT_COLUMN "sort_column" 59 #define STATE_KEY_SORT_ORDER "sort_order" 60 #define STATE_KEY_COLUMN_ORDER "column_order" 65 #define STATE_KEY_SUFF_VISIBLE "visible" 66 #define STATE_KEY_SUFF_WIDTH "width" 72 PROP_SHOW_COLUMN_MENU,
78 static QofLogModule log_module = GNC_MOD_GUI;
81 static void gnc_tree_view_constructed (GObject *
object);
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;
132 G_ADD_PRIVATE(GncTreeView))
134 #define GNC_TREE_VIEW_GET_PRIVATE(o) \ 135 ((GncTreeViewPrivate*)gnc_tree_view_get_instance_private((GncTreeView*)o)) 155 gnc_tree_view_class_init (GncTreeViewClass *klass)
157 GObjectClass *gobject_class;
158 GtkWidgetClass *gtkwidget_class;
160 gobject_class = G_OBJECT_CLASS(klass);
161 gtkwidget_class = GTK_WIDGET_CLASS(klass);
163 gobject_class->set_property = gnc_tree_view_set_property;
164 gobject_class->get_property = gnc_tree_view_get_property;
166 g_object_class_install_property (gobject_class,
168 g_param_spec_string (
"state-section",
170 "The section name in the saved state to use for (re)storing the treeview's visual state (visible columns, sort order,...",
173 g_object_class_install_property (gobject_class,
174 PROP_SHOW_COLUMN_MENU,
175 g_param_spec_boolean (
"show-column-menu",
177 "Show the column menu so user can change what columns are visible.",
182 gobject_class->constructed = gnc_tree_view_constructed;
183 gobject_class->finalize = gnc_tree_view_finalize;
186 gtkwidget_class->destroy = gnc_tree_view_destroy;
190 gnc_tree_view_update_grid_lines (gpointer prefs, gchar* pref, gpointer user_data)
192 GncTreeView *view = user_data;
193 gtk_tree_view_set_grid_lines (GTK_TREE_VIEW(view), gnc_tree_view_get_grid_lines_pref ());
197 gnc_tree_view_select_column_icon_cb (GtkWidget *widget, GdkEventButton *event, gpointer user_data)
199 GncTreeView *view = user_data;
201 GtkStyleContext *stylectxt = gtk_widget_get_style_context (widget);
205 if (event->button != 1)
208 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
210 gtk_style_context_get_padding (stylectxt, GTK_STATE_FLAG_NORMAL, &padding);
212 if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL)
214 if (event->x < (gtk_widget_get_allocated_width (priv->column_menu_icon_box) + padding.left))
215 gnc_tree_view_select_column_cb (priv->column_menu_column, view);
219 if (event->x > (gtk_widget_get_allocated_width (widget) -
220 (gtk_widget_get_allocated_width (priv->column_menu_icon_box) + padding.right)))
221 gnc_tree_view_select_column_cb (priv->column_menu_column, view);
236 gnc_tree_view_init (GncTreeView *view)
239 GtkTreeViewColumn *column;
240 GtkWidget *sep, *icon;
242 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
243 priv->column_menu = NULL;
244 priv->show_column_menu = FALSE;
245 priv->sort_model = NULL;
246 priv->state_section = NULL;
247 priv->seen_state_visibility = FALSE;
248 priv->columns_changed_cb_id = 0;
249 priv->sort_column_changed_cb_id = 0;
250 priv->size_allocate_cb_id = 0;
253 gtk_widget_set_name (GTK_WIDGET(view),
"gnc-id-tree-view");
256 gtk_tree_view_set_column_drag_function (GTK_TREE_VIEW(view),
257 gnc_tree_view_drop_ok_cb, NULL, NULL);
260 gtk_tree_view_set_grid_lines (GTK_TREE_VIEW(view), gnc_tree_view_get_grid_lines_pref ());
262 gnc_tree_view_update_grid_lines, view);
264 gnc_tree_view_update_grid_lines, view);
269 icon = gtk_image_new_from_icon_name (
"pan-down-symbolic", GTK_ICON_SIZE_SMALL_TOOLBAR);
271 priv->column_menu_icon_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
272 gtk_box_set_homogeneous (GTK_BOX(priv->column_menu_icon_box), FALSE);
274 gtk_widget_set_margin_start (GTK_WIDGET(icon), 5);
276 gtk_box_pack_end (GTK_BOX(priv->column_menu_icon_box), icon, FALSE, FALSE, 0);
278 sep = gtk_separator_new (GTK_ORIENTATION_VERTICAL);
279 gtk_box_pack_end (GTK_BOX(priv->column_menu_icon_box), sep, FALSE, FALSE, 0);
281 gtk_widget_show_all (priv->column_menu_icon_box);
285 g_object_set (G_OBJECT(column),
287 "widget", priv->column_menu_icon_box,
292 priv->column_menu_column = column;
296 GtkWidget *mybox = gtk_widget_get_parent (icon);
297 GtkWidget *walign = gtk_widget_get_parent (mybox);
298 GtkWidget *box = gtk_widget_get_parent (walign);
299 GtkWidget *button = gtk_widget_get_parent (box);
301 if (!GTK_IS_BUTTON(button))
304 g_signal_connect (G_OBJECT(column),
"clicked",
305 G_CALLBACK(gnc_tree_view_select_column_cb),
313 gtk_widget_set_events (button, GDK_BUTTON_PRESS_MASK);
315 g_signal_connect (G_OBJECT(button),
"button_press_event",
316 G_CALLBACK(gnc_tree_view_select_column_icon_cb),
320 gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED);
330 gnc_tree_view_constructed (GObject *obj)
334 G_OBJECT_CLASS (gnc_tree_view_parent_class)->constructed (obj);
348 gnc_tree_view_finalize (GObject *
object)
350 ENTER(
"view %p",
object);
351 g_return_if_fail (
object != NULL);
352 g_return_if_fail (GNC_IS_TREE_VIEW(
object));
356 G_OBJECT_CLASS(gnc_tree_view_parent_class)->finalize (
object);
372 gnc_tree_view_destroy (GtkWidget *widget)
377 ENTER(
"view %p", widget);
378 g_return_if_fail (widget != NULL);
379 g_return_if_fail (GNC_IS_TREE_VIEW(widget));
381 view = GNC_TREE_VIEW(widget);
384 gnc_tree_view_update_grid_lines, view);
386 gnc_tree_view_update_grid_lines, view);
388 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
390 if (priv->state_section)
394 g_free (priv->state_section);
395 priv->state_section = NULL;
397 if (priv->column_menu)
399 DEBUG(
"removing column selection menu");
400 g_object_unref (priv->column_menu);
401 priv->column_menu = NULL;
404 GTK_WIDGET_CLASS(gnc_tree_view_parent_class)->destroy (widget);
425 gnc_tree_view_get_property (GObject *
object,
430 GncTreeView *view = GNC_TREE_VIEW(
object);
433 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
436 case PROP_STATE_SECTION:
437 g_value_set_string (value, priv->state_section);
439 case PROP_SHOW_COLUMN_MENU:
440 g_value_set_boolean (value, priv->show_column_menu);
443 G_OBJECT_WARN_INVALID_PROPERTY_ID(
object, prop_id, pspec);
458 gnc_tree_view_set_property (GObject *
object,
463 GncTreeView *view = GNC_TREE_VIEW(
object);
467 case PROP_STATE_SECTION:
470 case PROP_SHOW_COLUMN_MENU:
474 G_OBJECT_WARN_INVALID_PROPERTY_ID(
object, prop_id, pspec);
502 static GtkTreeViewColumn *
503 view_column_find_by_model_id (GncTreeView *view,
506 GtkTreeViewColumn *column, *found = NULL;
507 GList *column_list, *tmp;
511 column_list = gtk_tree_view_get_columns (GTK_TREE_VIEW(view));
512 for (tmp = column_list; tmp; tmp = g_list_next (tmp))
515 id = GPOINTER_TO_INT(g_object_get_data (G_OBJECT(column), MODEL_COLUMN));
521 g_list_free (column_list);
541 GtkTreeViewColumn *column, *found = NULL;
542 GList *column_list, *tmp;
546 column_list = gtk_tree_view_get_columns(GTK_TREE_VIEW(view));
547 for (tmp = column_list; tmp; tmp = g_list_next (tmp))
550 name = g_object_get_data (G_OBJECT(column), PREF_NAME);
551 if (!name || (strcmp(name, wanted) != 0))
556 g_list_free (column_list);
597 gnc_tree_view_drop_ok_cb (GtkTreeView *view,
598 GtkTreeViewColumn *column,
599 GtkTreeViewColumn *prev_column,
600 GtkTreeViewColumn *next_column,
603 const gchar *pref_name;
608 if (prev_column == NULL)
613 if (next_column == NULL)
621 pref_name = g_object_get_data (G_OBJECT(prev_column), PREF_NAME);
658 gnc_tree_view_column_visible (GncTreeView *view,
659 GtkTreeViewColumn *column,
660 const gchar *pref_name)
664 const gchar *col_name = pref_name;
666 ENTER(
"column %p, name %s", column, pref_name ? pref_name :
"(null)");
667 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
670 if (g_object_get_data (G_OBJECT(column), ALWAYS_VISIBLE))
672 LEAVE(
"1, first column");
675 col_name = g_object_get_data (G_OBJECT(column), PREF_NAME);
676 DEBUG(
"col_name is %s", col_name ? col_name :
"(null)");
681 LEAVE(
"1, no pref name");
686 if (priv->state_section)
689 gchar *key = g_strdup_printf (
"%s_%s", col_name, STATE_KEY_SUFF_VISIBLE);
691 if (g_key_file_has_key (state_file, priv->state_section, key, NULL))
693 visible = g_key_file_get_boolean (state_file, priv->state_section, key, NULL);
695 LEAVE(
"%d, state defined visibility", visible);
702 (g_object_get_data (G_OBJECT(column), DEFAULT_VISIBLE) != NULL) : FALSE;
703 LEAVE(
"defaults says %d", visible);
718 gnc_tree_view_update_visibility (GtkTreeViewColumn *column,
723 g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN(column));
724 g_return_if_fail (GNC_IS_TREE_VIEW(view));
727 visible = gnc_tree_view_column_visible (view, column, NULL);
728 gtk_tree_view_column_set_visible (column, visible);
729 LEAVE(
"made %s", visible ?
"visible" :
"invisible");
743 gnc_tree_view_get_sort_order (GncTreeView *view)
745 GtkTreeModel *s_model;
748 gchar *order_str = NULL;
750 s_model = gtk_tree_view_get_model (GTK_TREE_VIEW(view));
754 if (!gtk_tree_sortable_get_sort_column_id (GTK_TREE_SORTABLE(s_model),
758 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE(s_model),
760 order_str = g_strdup (order == GTK_SORT_ASCENDING ?
"ascending" :
"descending");
761 DEBUG(
"current sort_order is %s", order_str);
775 gnc_tree_view_get_sort_column (GncTreeView *view)
777 GtkTreeModel *s_model;
778 GtkTreeViewColumn *column;
783 s_model = gtk_tree_view_get_model (GTK_TREE_VIEW(view));
787 if (!gtk_tree_sortable_get_sort_column_id (GTK_TREE_SORTABLE(s_model),
791 column = view_column_find_by_model_id (view, current);
795 name = g_object_get_data (G_OBJECT(column), PREF_NAME);
796 DEBUG(
"current sort column is %s", name ? name :
"(NULL)");
797 return g_strdup (name);
813 gnc_tree_view_get_column_order (GncTreeView *view,
819 gchar *col_names = NULL;
820 gchar **col_str_list;
825 columns = gtk_tree_view_get_columns (GTK_TREE_VIEW(view));
826 for (tmp = columns; tmp; tmp = g_list_next(tmp))
828 GtkTreeViewColumn *column = tmp->data;
829 const gchar *name = g_object_get_data (G_OBJECT(column), PREF_NAME);
831 col_names = g_strdup (name);
834 gchar *col_names_prev = col_names;
835 col_names = g_strjoin (
";", col_names_prev, name, NULL);
836 g_free (col_names_prev);
841 col_str_list = g_strsplit (col_names,
";", 0);
844 g_list_free (columns);
847 LEAVE(
"column order get");
863 gnc_tree_view_set_sort_order (GncTreeView *view,
866 GtkTreeModel *s_model;
867 GtkSortType order = GTK_SORT_ASCENDING;
870 s_model = gtk_tree_view_get_model (GTK_TREE_VIEW(view));
873 if (g_strcmp0 (name,
"descending") == 0)
874 order = GTK_SORT_DESCENDING;
875 if (!gtk_tree_sortable_get_sort_column_id (GTK_TREE_SORTABLE(s_model),
877 current = GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID;
878 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE(s_model),
880 DEBUG(
"sort_order set to %s", order == GTK_SORT_ASCENDING ?
"ascending" :
"descending");
892 gnc_tree_view_set_sort_column (GncTreeView *view,
895 GtkTreeModel *s_model;
896 GtkTreeViewColumn *column;
898 gint model_column, current;
900 s_model = gtk_tree_view_get_model (GTK_TREE_VIEW(view));
907 gtk_tree_sortable_set_sort_column_id (
908 GTK_TREE_SORTABLE(s_model), GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID,
914 GPOINTER_TO_INT(g_object_get_data (G_OBJECT(column), MODEL_COLUMN));
915 if (model_column == GNC_TREE_VIEW_COLUMN_DATA_NONE)
918 if (!gtk_tree_sortable_get_sort_column_id (GTK_TREE_SORTABLE(s_model),
920 order = GTK_SORT_ASCENDING;
922 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE(s_model),
923 model_column, order);
924 DEBUG(
"sort column set to %s", name);
940 gnc_tree_view_set_column_order (GncTreeView *view,
941 gchar **column_names,
944 GtkTreeViewColumn *column, *prev;
952 for (idx = 0; idx < length; idx++)
954 const gchar *name = column_names [idx];
958 columns = g_slist_append (columns, column);
962 for (prev = NULL, tmp = columns; tmp; tmp = g_slist_next (tmp))
965 gtk_tree_view_move_column_after (GTK_TREE_VIEW(view), column, prev);
970 g_slist_free (columns);
971 LEAVE(
"column order set");
988 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
989 if (!priv->state_section)
991 LEAVE(
"no state section");
995 g_key_file_remove_group (state_file, priv->state_section, NULL);
996 g_free (priv->state_section);
997 priv->state_section = NULL;
1010 const gchar *section)
1013 GKeyFile *state_file;
1015 g_return_if_fail (GNC_IS_TREE_VIEW(view));
1017 ENTER(
"view %p, section %s", view, section);
1019 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
1022 if (priv->state_section)
1027 LEAVE(
"cleared state section");
1032 priv->state_section = g_strdup (section);
1035 if (g_key_file_has_group (state_file, priv->state_section))
1037 gsize num_keys, idx;
1038 gchar **keys = g_key_file_get_keys (state_file, priv->state_section, &num_keys, NULL);
1039 for (idx = 0; idx < num_keys; idx++)
1041 gchar *key = keys[idx];
1042 if (g_strcmp0 (key, STATE_KEY_SORT_COLUMN) == 0)
1044 gchar *name = g_key_file_get_string (state_file, priv->state_section,
1046 gnc_tree_view_set_sort_column (view, name);
1049 else if (g_strcmp0 (key, STATE_KEY_SORT_ORDER) == 0)
1051 gchar *name = g_key_file_get_string (state_file, priv->state_section,
1053 gnc_tree_view_set_sort_order (view, name);
1056 else if (g_strcmp0 (key, STATE_KEY_COLUMN_ORDER) == 0)
1059 gchar **columns = g_key_file_get_string_list (state_file, priv->state_section,
1060 key, &length, NULL);
1061 gnc_tree_view_set_column_order (view, columns, length);
1062 g_strfreev (columns);
1068 gboolean known = FALSE;
1069 gchar *column_name = g_strdup (key);
1070 gchar *type_name = g_strrstr (column_name,
"_");
1072 if (type_name != NULL)
1074 *type_name++ =
'\0';
1076 if (g_strcmp0 (type_name, STATE_KEY_SUFF_VISIBLE) == 0)
1082 if (!g_object_get_data (G_OBJECT (column), ALWAYS_VISIBLE))
1084 gtk_tree_view_column_set_visible (column,
1085 g_key_file_get_boolean (state_file, priv->state_section, key, NULL));
1089 else if (g_strcmp0 (type_name, STATE_KEY_SUFF_WIDTH) == 0)
1091 gint width = g_key_file_get_integer (state_file, priv->state_section, key, NULL);
1096 if (width && (width != gtk_tree_view_column_get_width (column)))
1098 gtk_tree_view_column_set_fixed_width (column, width);
1103 DEBUG (
"Ignored key %s", key);
1105 g_free (column_name);
1113 gnc_tree_view_build_column_menu (view);
1114 LEAVE (
"set state section");
1128 g_return_val_if_fail (GNC_IS_TREE_VIEW(view), NULL);
1130 priv = GNC_TREE_VIEW_GET_PRIVATE (view);
1131 return priv->state_section;
1138 ENTER(
"view %p", view);
1139 g_return_if_fail (view != NULL);
1140 g_return_if_fail (GNC_IS_TREE_VIEW(view));
1142 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
1144 if (priv->state_section)
1147 GList *column_list, *tmp;
1150 gchar *sort_column = gnc_tree_view_get_sort_column (view);
1151 gchar *sort_order = gnc_tree_view_get_sort_order (view);
1152 gchar **col_order = gnc_tree_view_get_column_order (view, &num_cols);
1155 if (sort_column && (g_strcmp0 (sort_column,
"name") != 0))
1156 g_key_file_set_string (state_file, priv->state_section, STATE_KEY_SORT_COLUMN, sort_column);
1157 else if (g_key_file_has_key (state_file, priv->state_section, STATE_KEY_SORT_COLUMN, NULL))
1158 g_key_file_remove_key (state_file, priv->state_section, STATE_KEY_SORT_COLUMN, NULL);
1159 g_free (sort_column);
1163 if (g_strcmp0 (sort_order,
"descending") == 0)
1164 g_key_file_set_string (state_file, priv->state_section, STATE_KEY_SORT_ORDER, sort_order);
1165 else if (g_key_file_has_key (state_file, priv->state_section, STATE_KEY_SORT_ORDER, NULL))
1166 g_key_file_remove_key (state_file, priv->state_section, STATE_KEY_SORT_ORDER, NULL);
1167 g_free (sort_order);
1169 if (col_order && (num_cols > 0))
1170 g_key_file_set_string_list (state_file, priv->state_section, STATE_KEY_COLUMN_ORDER,
1171 (
const gchar**) col_order, num_cols);
1172 else if (g_key_file_has_key (state_file, priv->state_section, STATE_KEY_COLUMN_ORDER, NULL))
1173 g_key_file_remove_key (state_file, priv->state_section, STATE_KEY_COLUMN_ORDER, NULL);
1175 g_strfreev (col_order);
1179 column_list = gtk_tree_view_get_columns (GTK_TREE_VIEW(view));
1180 for (tmp = column_list; tmp; tmp = g_list_next (tmp))
1182 GtkTreeViewColumn *column = tmp->data;
1184 const gchar *name = g_object_get_data (G_OBJECT(column), PREF_NAME);
1188 if (!g_object_get_data (G_OBJECT(column), ALWAYS_VISIBLE))
1190 key = g_strjoin (
"_", name, STATE_KEY_SUFF_VISIBLE, NULL);
1191 g_key_file_set_boolean (state_file, priv->state_section, key,
1192 gtk_tree_view_column_get_visible (column));
1196 key = g_strjoin (
"_", name, STATE_KEY_SUFF_WIDTH, NULL);
1197 if (g_object_get_data (G_OBJECT(column),
"default-width") &&
1198 (GPOINTER_TO_INT((g_object_get_data (G_OBJECT(column),
"default-width")))
1199 != gtk_tree_view_column_get_width (column)))
1201 g_key_file_set_integer (state_file, priv->state_section, key,
1202 gtk_tree_view_column_get_width (column));
1204 else if (g_key_file_has_key (state_file, priv->state_section, key, NULL))
1205 g_key_file_remove_key (state_file, priv->state_section, key, NULL);
1208 g_list_free (column_list);
1240 gnc_tree_view_create_menu_item (GtkTreeViewColumn *column,
1245 const gchar *column_name, *pref_name;
1250 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
1251 if (!priv->state_section)
1257 pref_name = g_object_get_data (G_OBJECT(column), PREF_NAME);
1265 if (!priv->column_menu)
1267 priv->column_menu = gtk_menu_new();
1268 g_object_ref_sink (priv->column_menu);
1272 column_name = g_object_get_data (G_OBJECT(column), REAL_TITLE);
1274 column_name = gtk_tree_view_column_get_title (column);
1275 widget = gtk_check_menu_item_new_with_label (column_name);
1276 gtk_menu_shell_append (GTK_MENU_SHELL(priv->column_menu), widget);
1279 if (g_object_get_data (G_OBJECT(column), ALWAYS_VISIBLE))
1281 g_object_set_data (G_OBJECT(widget), ALWAYS_VISIBLE, GINT_TO_POINTER(1));
1282 gtk_widget_set_sensitive (widget, FALSE);
1285 binding = g_object_bind_property (G_OBJECT(widget),
"active", G_OBJECT(column),
"visible", 0);
1286 g_object_set_data (G_OBJECT(widget),
"column-binding", binding);
1289 key = g_strdup_printf (
"%s_%s", pref_name, STATE_KEY_SUFF_VISIBLE);
1290 g_object_set_data_full (G_OBJECT(widget), STATE_KEY, key, g_free);
1295 column_menu_sort (GtkTreeViewColumn *columna, GtkTreeViewColumn *columnb)
1297 const gchar *column_namea = g_object_get_data (G_OBJECT(columna), REAL_TITLE);
1298 const gchar *column_nameb = g_object_get_data (G_OBJECT(columnb), REAL_TITLE);
1301 column_namea = gtk_tree_view_column_get_title (columna);
1304 column_nameb = gtk_tree_view_column_get_title (columnb);
1321 gnc_tree_view_build_column_menu (GncTreeView *view)
1326 g_return_if_fail (GNC_IS_TREE_VIEW(view));
1328 ENTER(
"view %p", view);
1329 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
1332 if (priv->column_menu)
1334 g_object_unref (priv->column_menu);
1335 priv->column_menu = NULL;
1338 if (priv->show_column_menu && priv->state_section)
1341 if (priv->column_menu_column)
1342 gtk_tree_view_column_set_visible (priv->column_menu_column, TRUE);
1345 column_list = gtk_tree_view_get_columns (GTK_TREE_VIEW(view));
1346 column_list = g_list_sort (column_list, (GCompareFunc)column_menu_sort);
1347 g_list_foreach (column_list, (GFunc)gnc_tree_view_create_menu_item, view);
1348 g_list_free (column_list);
1353 if (priv->column_menu_column)
1354 gtk_tree_view_column_set_visible (priv->column_menu_column, FALSE);
1356 LEAVE(
"menu: show %d, section %s", priv->show_column_menu,
1357 priv->state_section ? priv->state_section :
"(null)");
1370 gnc_tree_view_update_column_menu_item (GtkCheckMenuItem *checkmenuitem,
1375 g_return_if_fail (GTK_IS_CHECK_MENU_ITEM(checkmenuitem));
1376 g_return_if_fail (GNC_IS_TREE_VIEW(view));
1378 if (g_object_get_data (G_OBJECT(checkmenuitem), ALWAYS_VISIBLE))
1384 GBinding *binding = g_object_get_data (G_OBJECT(checkmenuitem),
"column-binding");
1385 GtkTreeViewColumn *column = GTK_TREE_VIEW_COLUMN(g_binding_dup_target (binding));
1387 visible = gtk_tree_view_column_get_visible (column);
1388 g_object_unref(column);
1390 gtk_check_menu_item_set_active (checkmenuitem, visible);
1406 gnc_tree_view_select_column_cb (GtkTreeViewColumn *column,
1412 g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN(column));
1413 g_return_if_fail (GNC_IS_TREE_VIEW(view));
1415 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
1416 menu = priv->column_menu;
1421 gtk_container_foreach (GTK_CONTAINER(menu),
1422 (GtkCallback)gnc_tree_view_update_column_menu_item,
1426 gtk_widget_show_all (menu);
1429 gtk_menu_popup_at_pointer (GTK_MENU(priv->column_menu), NULL);
1434 gchar *first_column_name,
1437 GtkTreeViewColumn *column;
1438 GList *columns, *tmp;
1439 gchar *name, *pref_name;
1442 g_return_if_fail (GNC_IS_TREE_VIEW(view));
1444 va_start (args, first_column_name);
1445 name = first_column_name;
1448 columns = gtk_tree_view_get_columns (GTK_TREE_VIEW(view));
1449 for (tmp = columns; tmp; tmp = g_list_next (tmp))
1452 pref_name = g_object_get_data (G_OBJECT(column), PREF_NAME);
1453 if (pref_name != NULL)
1454 gtk_tree_view_column_set_expand (column, FALSE);
1456 g_list_free(columns);
1459 while (name != NULL)
1464 gtk_tree_view_column_set_expand (column, TRUE);
1466 name = va_arg (args, gchar*);
1477 update_control_cell_renderers_background (GncTreeView *view, GtkTreeViewColumn *col,
1478 gint column, GtkTreeCellDataFunc func )
1481 GtkCellRenderer *cell;
1484 renderers = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT(col));
1487 for (node = renderers; node; node = node->next)
1491 gtk_tree_view_column_add_attribute (col, cell,
"cell-background", column);
1493 gtk_tree_view_column_set_cell_data_func (col, cell, func, view, NULL);
1495 g_list_free (renderers);
1506 g_return_if_fail (GNC_IS_TREE_VIEW(view));
1508 ENTER(
"view %p, column %d, func %p", view, column, func);
1509 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
1511 update_control_cell_renderers_background (view, priv->column_menu_column, column, func);
1524 g_return_if_fail (GNC_IS_TREE_VIEW(view));
1526 ENTER(
"view %p, sort_model %p", view, s_model);
1527 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
1529 priv->sort_model = s_model;
1546 g_return_if_fail (GNC_IS_TREE_VIEW(view));
1548 ENTER(
"view %p, show menu %d", view, visible);
1549 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
1550 priv->show_column_menu = visible;
1551 gnc_tree_view_build_column_menu (view);
1566 g_return_val_if_fail (GNC_IS_TREE_VIEW(view), FALSE);
1568 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
1569 return (priv->show_column_menu);
1579 gnc_tree_view_count_visible_columns (GncTreeView *view)
1581 GList *columns, *node;
1584 columns = gtk_tree_view_get_columns (GTK_TREE_VIEW(view));
1585 for (node = columns; node; node = node->next)
1587 GtkTreeViewColumn *col = GTK_TREE_VIEW_COLUMN(node->data);
1589 if (g_object_get_data (G_OBJECT(col), DEFAULT_VISIBLE) ||
1590 g_object_get_data (G_OBJECT(col), ALWAYS_VISIBLE))
1593 g_list_free (columns);
1601 GtkTreeViewColumn *column;
1603 gboolean hide_menu_column;
1605 g_return_if_fail (GNC_IS_TREE_VIEW(view));
1610 columns = gtk_tree_view_get_columns (GTK_TREE_VIEW(view));
1611 g_list_foreach (columns, (GFunc)gnc_tree_view_update_visibility, view);
1612 g_list_free (columns);
1614 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
1615 if (priv->state_section)
1616 priv->seen_state_visibility = TRUE;
1620 hide_menu_column = (gnc_tree_view_count_visible_columns (view) == 1);
1621 column = gtk_tree_view_get_column (GTK_TREE_VIEW(view), 0);
1622 gtk_tree_view_column_set_expand (column, hide_menu_column);
1623 gtk_tree_view_column_set_visible (priv->column_menu_column, !hide_menu_column);
1659 gnc_tree_view_column_properties (GncTreeView *view,
1660 GtkTreeViewColumn *column,
1661 const gchar *pref_name,
1665 GtkTreeIterCompareFunc column_sort_fn)
1668 GtkTreeModel *s_model;
1674 g_object_set_data (G_OBJECT(column), PREF_NAME, (gpointer)pref_name);
1675 if (data_column == 0)
1676 g_object_set_data (G_OBJECT(column), ALWAYS_VISIBLE, GINT_TO_POINTER(1));
1677 g_object_set_data (G_OBJECT(column), MODEL_COLUMN,
1678 GINT_TO_POINTER(data_column));
1681 visible = gnc_tree_view_column_visible (view, NULL, pref_name);
1684 g_object_set (G_OBJECT(column),
1686 "resizable", resizable && pref_name != NULL,
1687 "reorderable", pref_name != NULL,
1691 if (default_width == 0)
1694 g_object_set (G_OBJECT(column),
1695 "sizing", GTK_TREE_VIEW_COLUMN_AUTOSIZE,
1705 width = default_width + 10;
1710 g_object_set (G_OBJECT(column),
1711 "sizing", GTK_TREE_VIEW_COLUMN_FIXED,
1712 "fixed-width", width,
1719 g_object_set_data (G_OBJECT(column),
1720 "default-width", GINT_TO_POINTER(width));
1723 s_model = gtk_tree_view_get_model (GTK_TREE_VIEW(view));
1724 if (GTK_IS_TREE_SORTABLE(s_model))
1726 gtk_tree_view_column_set_sort_column_id (column, data_column);
1729 gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE(s_model),
1730 data_column, column_sort_fn,
1731 GINT_TO_POINTER(data_column),
1737 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
1738 if (priv->sort_model != NULL)
1740 gtk_tree_view_column_set_sort_column_id (column, data_column);
1743 gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE(priv->sort_model),
1744 data_column, column_sort_fn,
1753 gnc_tree_view_create_menu_item (column, view);
1769 const gchar *column_title,
1770 const gchar *column_short_title,
1771 const gchar *pref_name,
1772 gint model_data_column,
1773 gint model_visibility_column,
1774 GtkTreeIterCompareFunc column_sort_fn,
1775 renderer_toggled toggle_edited_cb)
1777 GtkTreeViewColumn *column;
1778 GtkCellRenderer *renderer;
1780 g_return_val_if_fail (GNC_IS_TREE_VIEW(view), NULL);
1782 renderer = gtk_cell_renderer_toggle_new ();
1783 if (!toggle_edited_cb)
1785 gtk_cell_renderer_toggle_set_activatable (GTK_CELL_RENDERER_TOGGLE(renderer), FALSE);
1788 gtk_tree_view_column_new_with_attributes (column_short_title,
1790 "active", model_data_column,
1794 g_object_set_data_full (G_OBJECT(column), REAL_TITLE,
1795 g_strdup(column_title), g_free);
1796 if (toggle_edited_cb)
1797 g_signal_connect (G_OBJECT(renderer),
"toggled",
1798 G_CALLBACK(toggle_edited_cb), view);
1800 if (model_visibility_column != GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS)
1801 gtk_tree_view_column_add_attribute (column, renderer,
1802 "visible", model_visibility_column);
1805 gnc_tree_view_column_properties (view, column, pref_name, model_data_column,
1806 0, FALSE, column_sort_fn);
1811 gtk_widget_set_tooltip_text (gtk_tree_view_column_get_button (column), column_title);
1817 renderer_editing_canceled_cb (GtkCellRenderer *renderer, gpointer user_data)
1819 GncTreeView *view = user_data;
1821 if (priv->editing_finished_cb)
1822 (priv->editing_finished_cb)(view, priv->editing_cb_data);
1826 renderer_editing_started_cb (GtkCellRenderer *renderer,
1827 GtkCellEditable *editable, gchar *path, gpointer user_data)
1829 GncTreeView *view = user_data;
1831 if (priv->editing_started_cb)
1832 (priv->editing_started_cb)(view, priv->editing_cb_data);
1836 renderer_edited_cb (GtkCellRendererText *renderer, gchar *path,
1837 gchar *new_text, gpointer user_data)
1839 GncTreeView *view = user_data;
1841 if (priv->editing_finished_cb)
1842 (priv->editing_finished_cb)(view, priv->editing_cb_data);
1846 static GtkTreeViewColumn *
1847 add_text_column_variant (GncTreeView *view, GtkCellRenderer *renderer,
1848 const gchar *column_title,
1849 const gchar *pref_name,
1850 const gchar *icon_name,
1851 const gchar *sizing_text,
1852 gint model_data_column,
1853 gint model_visibility_column,
1854 GtkTreeIterCompareFunc column_sort_fn)
1856 GtkTreeViewColumn *column;
1857 PangoLayout* layout;
1858 int default_width, title_width;
1860 g_return_val_if_fail (GNC_IS_TREE_VIEW(view), NULL);
1862 column = gtk_tree_view_column_new ();
1863 gtk_tree_view_column_set_title (column, column_title);
1868 GtkCellRenderer *renderer_pix = gtk_cell_renderer_pixbuf_new ();
1869 g_object_set (renderer_pix,
"icon-name", icon_name, NULL);
1870 gtk_tree_view_column_pack_start (column, renderer_pix, FALSE);
1874 gtk_tree_view_column_pack_start (column, renderer, TRUE);
1877 g_signal_connect (G_OBJECT(renderer),
"editing-canceled",
1878 (GCallback)renderer_editing_canceled_cb, view);
1880 g_signal_connect (G_OBJECT(renderer),
"editing-started",
1881 (GCallback)renderer_editing_started_cb, view);
1883 g_signal_connect (G_OBJECT(renderer),
"edited",
1884 (GCallback)renderer_edited_cb, view);
1887 if (model_data_column != GNC_TREE_VIEW_COLUMN_DATA_NONE)
1888 gtk_tree_view_column_add_attribute (column, renderer,
1889 "text", model_data_column);
1890 if (model_visibility_column != GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS)
1891 gtk_tree_view_column_add_attribute (column, renderer,
1892 "visible", model_visibility_column);
1895 layout = gtk_widget_create_pango_layout (GTK_WIDGET(view), column_title);
1896 pango_layout_get_pixel_size (layout, &title_width, NULL);
1897 g_object_unref (layout);
1898 layout = gtk_widget_create_pango_layout (GTK_WIDGET(view), sizing_text);
1899 pango_layout_get_pixel_size (layout, &default_width, NULL);
1900 g_object_unref (layout);
1901 default_width = MAX(default_width, title_width);
1903 default_width += 10;
1904 gnc_tree_view_column_properties (view, column, pref_name, model_data_column,
1905 default_width, TRUE, column_sort_fn);
1922 const gchar *column_title,
1923 const gchar *pref_name,
1924 const gchar *icon_name,
1925 const gchar *sizing_text,
1926 gint model_data_column,
1927 gint model_visibility_column,
1928 GtkTreeIterCompareFunc column_sort_fn)
1930 GtkCellRenderer *renderer;
1932 g_return_val_if_fail (GNC_IS_TREE_VIEW(view), NULL);
1934 renderer = gtk_cell_renderer_text_new ();
1936 return add_text_column_variant (view, renderer,
1937 column_title, pref_name,
1938 icon_name, sizing_text,
1940 model_visibility_column,
1954 const gchar *column_title,
1955 const gchar *pref_name,
1956 const gchar *icon_name,
1957 const gchar *sizing_text,
1958 gint model_data_column,
1959 gint model_visibility_column,
1960 GtkTreeIterCompareFunc column_sort_fn)
1962 GtkCellRenderer *renderer;
1964 g_return_val_if_fail (GNC_IS_TREE_VIEW(view), NULL);
1966 renderer = gnc_cell_renderer_text_view_new ();
1968 return add_text_column_variant (view, renderer,
1969 column_title, pref_name,
1970 icon_name, sizing_text,
1972 model_visibility_column,
1986 const gchar *column_title,
1987 const gchar *pref_name,
1988 const gchar *sizing_text,
1989 gint model_data_column,
1990 gint model_visibility_column,
1991 GtkTreeIterCompareFunc column_sort_fn)
1993 GtkTreeViewColumn *column;
1994 PangoLayout* layout;
1995 int default_width, title_width;
1996 GtkCellRenderer *renderer;
1998 g_return_val_if_fail (GNC_IS_TREE_VIEW(view), NULL);
2000 renderer = gtk_cell_renderer_pixbuf_new ();
2002 column = gtk_tree_view_column_new ();
2003 gtk_tree_view_column_set_title (column, column_title);
2006 gtk_tree_view_column_pack_start (column, renderer, TRUE);
2009 if (model_data_column != GNC_TREE_VIEW_COLUMN_DATA_NONE)
2010 gtk_tree_view_column_add_attribute (column, renderer,
2011 "icon-name", model_data_column);
2012 if (model_visibility_column != GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS)
2013 gtk_tree_view_column_add_attribute (column, renderer,
2014 "visible", model_visibility_column);
2017 layout = gtk_widget_create_pango_layout (GTK_WIDGET(view), column_title);
2018 pango_layout_get_pixel_size (layout, &title_width, NULL);
2019 g_object_unref (layout);
2020 layout = gtk_widget_create_pango_layout (GTK_WIDGET(view), sizing_text);
2021 pango_layout_get_pixel_size (layout, &default_width, NULL);
2022 g_object_unref (layout);
2023 default_width = MAX(default_width, title_width);
2025 default_width += 10;
2026 gnc_tree_view_column_properties (view, column, pref_name, model_data_column,
2027 default_width, TRUE, column_sort_fn);
2037 GtkCellRenderer *cr = NULL;
2039 g_return_val_if_fail (GTK_TREE_VIEW_COLUMN(column), NULL);
2042 renderers = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT(column));
2043 if (g_list_length (renderers) > 0)
2044 cr = GTK_CELL_RENDERER(renderers->data);
2045 g_list_free (renderers);
2062 const gchar *column_title,
2063 const gchar *pref_name,
2064 const gchar *sizing_text,
2065 gint model_data_column,
2066 gint model_color_column,
2067 gint model_visibility_column,
2068 GtkTreeIterCompareFunc column_sort_fn)
2070 GtkTreeViewColumn *column;
2071 GtkCellRenderer *renderer;
2072 gfloat alignment = 1.0;
2077 renderer = gnc_cell_renderer_label_new ();
2078 column = add_text_column_variant (view, renderer, column_title, pref_name,
2079 NULL, sizing_text, model_data_column,
2080 model_visibility_column, column_sort_fn);
2083 if (gtk_widget_get_direction (GTK_WIDGET(view)) == GTK_TEXT_DIR_RTL)
2086 g_object_set (G_OBJECT(column),
"alignment", alignment, NULL);
2087 g_object_set (G_OBJECT(renderer),
"xalign", alignment, NULL);
2090 if (model_color_column != GNC_TREE_VIEW_COLUMN_COLOR_NONE)
2091 gtk_tree_view_column_add_attribute (column, renderer,
2092 "foreground", model_color_column);
2107 GtkTreeViewColumn *column)
2109 int n = gtk_tree_view_get_n_columns (GTK_TREE_VIEW(view));
2114 return gtk_tree_view_insert_column (GTK_TREE_VIEW(view), column, n);
2118 get_column_next_to (GtkTreeView *tv, GtkTreeViewColumn **col, gboolean backward)
2121 GtkTreeViewColumn *c = NULL;
2123 gboolean wrapped = FALSE;
2125 cols = gtk_tree_view_get_columns (tv);
2126 g_return_val_if_fail (cols != NULL, FALSE);
2128 node = g_list_find (cols, *col);
2129 g_return_val_if_fail (node, FALSE);
2132 node = backward ? node->prev : node->next;
2136 node = backward ? g_list_last (cols) : cols;
2138 c = GTK_TREE_VIEW_COLUMN (node->data);
2139 if (c && gtk_tree_view_column_get_visible (c))
2141 if (c == *col)
break;
2151 gnc_tree_view_path_is_valid (GncTreeView *view, GtkTreePath *path)
2153 GtkTreeView *tv = GTK_TREE_VIEW(view);
2154 GtkTreeModel *s_model;
2157 s_model = gtk_tree_view_get_model (tv);
2158 return gtk_tree_model_get_iter (s_model, &iter, path);
2162 gnc_tree_view_keynav (GncTreeView *view, GtkTreeViewColumn **col,
2163 GtkTreePath *path, GdkEventKey *event)
2165 GtkTreeView *tv = GTK_TREE_VIEW(view);
2169 if (event->type != GDK_KEY_PRESS)
return;
2171 switch (event->keyval)
2174 case GDK_KEY_ISO_Left_Tab:
2175 case GDK_KEY_KP_Tab:
2176 shifted =
event->state & GDK_SHIFT_MASK;
2177 if (get_column_next_to (tv, col, shifted))
2180 depth = gtk_tree_path_get_depth (path);
2183 if (!gtk_tree_path_prev (path) && depth > 1)
2185 gtk_tree_path_up (path);
2188 else if (gtk_tree_view_row_expanded (tv, path))
2190 gtk_tree_path_down (path);
2194 gtk_tree_path_next (path);
2195 if (!gnc_tree_view_path_is_valid (view, path) && depth > 2)
2197 gtk_tree_path_prev (path);
2198 gtk_tree_path_up (path);
2199 gtk_tree_path_next (path);
2201 if (!gnc_tree_view_path_is_valid (view, path) && depth > 1)
2203 gtk_tree_path_prev (path);
2204 gtk_tree_path_up (path);
2205 gtk_tree_path_next (path);
2211 case GDK_KEY_Return:
2212 case GDK_KEY_KP_Enter:
2213 if (gtk_tree_view_row_expanded (tv, path))
2215 gtk_tree_path_down (path);
2219 depth = gtk_tree_path_get_depth (path);
2220 gtk_tree_path_next (path);
2221 if (!gnc_tree_view_path_is_valid (view, path) && depth > 1)
2223 gtk_tree_path_prev (path);
2224 gtk_tree_path_up (path);
2225 gtk_tree_path_next (path);
2238 if (!view && !editing_started_cb)
2241 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
2243 priv->editing_started_cb = editing_started_cb;
2244 priv->editing_cb_data = editing_cb_data;
2252 if (!view && !editing_finished_cb)
2255 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
2257 priv->editing_finished_cb = editing_finished_cb;
2258 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.
int safe_utf8_collate(const char *da, const char *db)
Collate two UTF-8 strings.
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.
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.
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.
G_DEFINE_TYPE_WITH_CODE(GncMainWindow, gnc_main_window, GTK_TYPE_APPLICATION_WINDOW, G_IMPLEMENT_INTERFACE(GNC_TYPE_WINDOW, gnc_window_main_window_init)) static guint main_window_signals[LAST_SIGNAL]
A holding place for all the signals generated by the main window code.
gint gnc_tree_view_append_column(GncTreeView *view, GtkTreeViewColumn *column)
Add a column to a view based upon a GncTreeView.
void gnc_gobject_tracking_remember(GObject *object)
Tell gnucash to remember this object in the database.
GtkTreeViewColumn * gnc_tree_view_add_pix_column(GncTreeView *view, const gchar *column_title, const gchar *pref_name, const gchar *sizing_text, gint model_data_column, gint model_visibility_column, GtkTreeIterCompareFunc column_sort_fn)
This function adds a new pixbuf view column to a GncTreeView base view.
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.