gnucash master: Multiple changes pushed
John Ralls
jralls at code.gnucash.org
Sat Apr 25 16:39:59 EDT 2020
Updated via https://github.com/Gnucash/gnucash/commit/06857982 (commit)
via https://github.com/Gnucash/gnucash/commit/72bcf7f7 (commit)
from https://github.com/Gnucash/gnucash/commit/a9108a3a (commit)
commit 06857982788b521da741bfcf1387301c0211e46d
Merge: a9108a3a3 72bcf7f7a
Author: John Ralls <jralls at ceridwen.us>
Date: Sat Apr 25 13:36:51 2020 -0700
Merge Bob Fewell's 'account-notes' into master.
commit 72bcf7f7afa4e00ea577535d049865bb5e172ebf
Author: Robert Fewell <14uBobIT at gmail.com>
Date: Mon Apr 6 16:24:46 2020 +0100
Fix issue when editing the account tree view notes field
When you try to edit a multiline account notes field in the account
tree view you end up with just one line with control characters as it
is being edited with a GtkCellRenderText cell. To fix this I have added
a new cell renderer based on a text view.
diff --git a/gnucash/gnome-utils/CMakeLists.txt b/gnucash/gnome-utils/CMakeLists.txt
index 133665686..920a68d74 100644
--- a/gnucash/gnome-utils/CMakeLists.txt
+++ b/gnucash/gnome-utils/CMakeLists.txt
@@ -51,6 +51,8 @@ set (gnome_utils_SOURCES
gnc-cell-renderer-popup.c
gnc-cell-renderer-popup-entry.c
gnc-cell-renderer-text-flag.c
+ gnc-cell-renderer-text-view.c
+ gnc-cell-view.c
gnc-combott.c
gnc-commodity-edit.c
gnc-component-manager.c
@@ -140,6 +142,8 @@ set (gnome_utils_HEADERS
gnc-cell-renderer-popup.h
gnc-cell-renderer-popup-entry.h
gnc-cell-renderer-text-flag.h
+ gnc-cell-renderer-text-view.h
+ gnc-cell-view.h
gnc-combott.h
gnc-commodity-edit.h
gnc-component-manager.h
diff --git a/gnucash/gnome-utils/gnc-cell-renderer-text-view.c b/gnucash/gnome-utils/gnc-cell-renderer-text-view.c
new file mode 100644
index 000000000..445848417
--- /dev/null
+++ b/gnucash/gnome-utils/gnc-cell-renderer-text-view.c
@@ -0,0 +1,160 @@
+/*************************************************************************
+ * The following code implements a text view in a custom GtkCellRenderer.
+ *
+ * Copyright (C) 2020 Robert Fewell
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *************************************************************************/
+#include <config.h>
+
+#include <gtk/gtk.h>
+#include <glib/gi18n.h>
+#include <gdk/gdkkeysyms.h>
+
+#include "gnc-cell-renderer-text-view.h"
+#include "gnc-cell-view.h"
+
+static void gnc_cell_renderer_text_view_init (GncCellRendererTextView *self);
+static void gnc_cell_renderer_text_view_class_init (GncCellRendererTextViewClass *klass);
+
+static GtkCellEditable *gcrtv_start_editing (GtkCellRenderer *cell,
+ GdkEvent *event,
+ GtkWidget *widget,
+ const gchar *path,
+ const GdkRectangle *background_area,
+ const GdkRectangle *cell_area,
+ GtkCellRendererState flags);
+
+#define GNC_CELL_RENDERER_TEXT_VIEW_PATH "gnc-cell-renderer-text-view-path"
+
+G_DEFINE_TYPE (GncCellRendererTextView, gnc_cell_renderer_text_view, GTK_TYPE_CELL_RENDERER_TEXT)
+
+static void
+gnc_cell_renderer_text_view_init (GncCellRendererTextView *self)
+{
+}
+
+static void
+gnc_cell_renderer_text_view_finalize (GObject *object)
+{
+ G_OBJECT_CLASS (gnc_cell_renderer_text_view_parent_class)->finalize (object);
+}
+
+static void
+gnc_cell_renderer_text_view_class_init (GncCellRendererTextViewClass *klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
+ GtkCellRendererClass *cell_class = GTK_CELL_RENDERER_CLASS(klass);
+
+ gobject_class->finalize = gnc_cell_renderer_text_view_finalize;
+
+ cell_class->start_editing = gcrtv_start_editing;
+}
+
+static void
+gcrtv_editing_done (GtkCellEditable *editable,
+ GncCellRendererTextView *cell_tv)
+{
+ gchar *path;
+ const gchar *new_text;
+
+ if (GNC_CELL_VIEW (editable)->focus_out_id > 0)
+ {
+ g_signal_handler_disconnect (GNC_CELL_VIEW(editable)->text_view,
+ GNC_CELL_VIEW(editable)->focus_out_id);
+ GNC_CELL_VIEW(editable)->focus_out_id = 0;
+ }
+
+ if (GNC_CELL_VIEW(editable)->editing_canceled)
+ {
+ gtk_cell_renderer_stop_editing (GTK_CELL_RENDERER(cell_tv), TRUE);
+ return;
+ }
+
+ path = g_object_get_data (G_OBJECT(editable),
+ GNC_CELL_RENDERER_TEXT_VIEW_PATH);
+
+ new_text = gnc_cell_view_get_text (GNC_CELL_VIEW(editable));
+
+ g_signal_emit_by_name (cell_tv, "edited", path, new_text);
+}
+
+static gboolean
+gcrtv_button_press_event (GtkWidget *widget,
+ GdkEventButton *event,
+ gpointer user_data)
+{
+ // allows mouse clicks in text view
+ return TRUE;
+}
+
+static GtkCellEditable *
+gcrtv_start_editing (GtkCellRenderer *cell,
+ GdkEvent *event,
+ GtkWidget *widget,
+ const gchar *path,
+ const GdkRectangle *background_area,
+ const GdkRectangle *cell_area,
+ GtkCellRendererState flags)
+{
+ GncCellRendererTextView *cell_tv = GNC_CELL_RENDERER_TEXT_VIEW(cell);
+ GtkWidget *editable;
+ gchar *text = NULL;
+ gboolean iseditable;
+
+ g_object_get (G_OBJECT(cell_tv), "editable", &iseditable, NULL);
+
+ /* If the cell isn't editable we return NULL. */
+ if (iseditable == FALSE) {
+ return NULL;
+ }
+
+ editable = g_object_new (GNC_TYPE_CELL_VIEW, NULL);
+
+ g_signal_connect (editable, "button-press-event",
+ G_CALLBACK(gcrtv_button_press_event),
+ NULL);
+
+ g_object_get (G_OBJECT(cell), "text", &text, NULL);
+
+ gnc_cell_view_set_text (GNC_CELL_VIEW(editable), text);
+
+ g_free (text);
+
+ gtk_widget_grab_focus (GTK_WIDGET(editable));
+
+ g_object_set_data_full (G_OBJECT(editable),
+ GNC_CELL_RENDERER_TEXT_VIEW_PATH,
+ g_strdup (path),
+ g_free);
+
+ gtk_widget_show (editable);
+
+ g_signal_connect (editable, "editing-done", G_CALLBACK(gcrtv_editing_done), cell_tv);
+
+ cell_tv->editable = editable;
+
+ g_object_add_weak_pointer (G_OBJECT(cell_tv->editable),
+ (gpointer) &cell_tv->editable);
+
+ return GTK_CELL_EDITABLE(editable);
+}
+
+GtkCellRenderer *
+gnc_cell_renderer_text_view_new (void)
+{
+ return g_object_new (GNC_TYPE_CELL_RENDERER_TEXT_VIEW, NULL);
+}
diff --git a/gnucash/gnome-utils/gnc-cell-renderer-text-view.h b/gnucash/gnome-utils/gnc-cell-renderer-text-view.h
new file mode 100644
index 000000000..10e8bb3b9
--- /dev/null
+++ b/gnucash/gnome-utils/gnc-cell-renderer-text-view.h
@@ -0,0 +1,57 @@
+/*************************************************************************
+ * The following code implements a text view in a custom GtkCellRenderer.
+ *
+ * Copyright (C) 2020 Robert Fewell
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *************************************************************************/
+
+#ifndef __GNC_CELL_RENDERER_TEXT_VIEW_H__
+#define __GNC_CELL_RENDERER_TEXT_VIEW_H__
+
+#include <pango/pango.h>
+#include <gtk/gtk.h>
+
+#define GNC_TYPE_CELL_RENDERER_TEXT_VIEW (gnc_cell_renderer_text_view_get_type ())
+#define GNC_CELL_RENDERER_TEXT_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GNC_TYPE_CELL_RENDERER_TEXT_VIEW, GncCellRendererTextView))
+#define GNC_CELL_RENDERER_TEXT_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GNC_TYPE_CELL_RENDERER_TEXT_VIEW, GncCellRendererTextViewClass))
+#define GNC_IS_CELL_RENDERER_TEXT_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GNC_TYPE_CELL_RENDERER_TEXT_VIEW))
+#define GNC_IS_CELL_RENDERER_TEXT_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), GNC_TYPE_CELL_RENDERER_TEXT_VIEW))
+#define GNC_CELL_RENDERER_TEXT_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GNC_TYPE_CELL_RENDERER_TEXT_VIEW, GncCellRendererTextViewClass))
+
+
+typedef struct _GncCellRendererTextView GncCellRendererTextView;
+typedef struct _GncCellRendererTextViewClass GncCellRendererTextViewClass;
+
+struct _GncCellRendererTextView
+{
+ GtkCellRendererText parent;
+
+ /* The editable entry. */
+ GtkWidget *editable;
+};
+
+struct _GncCellRendererTextViewClass
+{
+ GtkCellRendererTextClass parent_class;
+};
+
+GType gnc_cell_renderer_text_view_get_type (void) G_GNUC_CONST;
+
+GtkCellRenderer *gnc_cell_renderer_text_view_new (void);
+
+
+#endif /* __GNC_CELL_RENDERER_TEXT_VIEW_H__ */
diff --git a/gnucash/gnome-utils/gnc-cell-view.c b/gnucash/gnome-utils/gnc-cell-view.c
new file mode 100644
index 000000000..bf82389e5
--- /dev/null
+++ b/gnucash/gnome-utils/gnc-cell-view.c
@@ -0,0 +1,243 @@
+/*************************************************************************
+ * The following code implements a text view in a custom GtkCellRenderer.
+ *
+ * Copyright (C) 2020 Robert Fewell
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *************************************************************************/
+#include <config.h>
+
+#include <gtk/gtk.h>
+#include <glib/gi18n.h>
+#include <gdk/gdkkeysyms.h>
+#include <string.h>
+
+#include "gnc-cell-view.h"
+
+static void gnc_cell_view_init (GncCellView *cv);
+static void gnc_cell_view_class_init (GncCellViewClass *klass);
+static void gnc_cell_view_editable_init (GtkCellEditableIface *iface);
+static gboolean gcv_key_press_event (GtkWidget *box,
+ GdkEventKey *key_event);
+
+static void gnc_cell_view_set_property (GObject *object,
+ guint param_id,
+ const GValue *value,
+ GParamSpec *pspec);
+
+static void gnc_cell_view_get_property (GObject *object,
+ guint param_id,
+ GValue *value,
+ GParamSpec *pspec);
+
+enum {
+ PROP_0,
+ PROP_EDITING_CANCELED,
+};
+
+G_DEFINE_TYPE_WITH_CODE (GncCellView, gnc_cell_view, GTK_TYPE_EVENT_BOX,
+ G_IMPLEMENT_INTERFACE (GTK_TYPE_CELL_EDITABLE,
+ gnc_cell_view_editable_init))
+
+static void
+gnc_cell_view_finalize (GObject *gobject)
+{
+ G_OBJECT_CLASS (gnc_cell_view_parent_class)->finalize (gobject);
+}
+
+static void
+gnc_cell_view_init (GncCellView *cv)
+{
+ cv->editing_canceled = FALSE;
+
+ cv->text_view = g_object_new (GTK_TYPE_TEXT_VIEW, "accepts-tab", FALSE, NULL);
+ cv->buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(cv->text_view));
+
+ gtk_text_view_set_left_margin (GTK_TEXT_VIEW(cv->text_view), 2);
+ gtk_text_view_set_right_margin (GTK_TEXT_VIEW(cv->text_view), 2);
+
+ gtk_widget_set_tooltip_text (GTK_WIDGET(cv->text_view),
+ _("Use Shift combined with Return or Keypad Enter to finish editing"));
+
+ gtk_container_add (GTK_CONTAINER(cv), GTK_WIDGET(cv->text_view));
+ gtk_widget_show (cv->text_view);
+
+ gtk_widget_set_can_focus (GTK_WIDGET(cv->text_view), TRUE);
+ gtk_widget_add_events (GTK_WIDGET(cv), GDK_KEY_PRESS_MASK);
+ gtk_widget_add_events (GTK_WIDGET(cv), GDK_KEY_RELEASE_MASK);
+}
+
+static void
+gnc_cell_view_class_init (GncCellViewClass *klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass);
+
+ gobject_class->finalize = gnc_cell_view_finalize;
+
+ gobject_class->set_property = gnc_cell_view_set_property;
+ gobject_class->get_property = gnc_cell_view_get_property;
+
+ g_object_class_override_property (gobject_class,
+ PROP_EDITING_CANCELED,
+ "editing-canceled");
+}
+
+static void
+gnc_cell_view_set_property (GObject *object,
+ guint param_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ GncCellView *cv = GNC_CELL_VIEW(object);
+
+ switch (param_id)
+ {
+ case PROP_EDITING_CANCELED:
+ cv->editing_canceled = g_value_get_boolean (value);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, param_id, pspec);
+ break;
+ }
+}
+
+static void
+gnc_cell_view_get_property (GObject *object,
+ guint param_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ GncCellView *cv = GNC_CELL_VIEW(object);
+
+ switch (param_id)
+ {
+ case PROP_EDITING_CANCELED:
+ g_value_set_boolean (value, cv->editing_canceled);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, param_id, pspec);
+ break;
+ }
+}
+
+static gboolean
+gtk_cell_editable_key_press_event (GtkTextView *text_view,
+ GdkEventKey *key_event,
+ GncCellView *cv)
+{
+ if (key_event->keyval == GDK_KEY_Escape)
+ {
+ cv->editing_canceled = TRUE;
+ gtk_cell_editable_editing_done (GTK_CELL_EDITABLE(cv));
+
+ if (GTK_IS_CELL_EDITABLE(cv))
+ gtk_cell_editable_remove_widget (GTK_CELL_EDITABLE(cv));
+
+ return TRUE;
+ }
+
+ if ((key_event->keyval == GDK_KEY_Return || key_event->keyval == GDK_KEY_KP_Enter)
+ && (key_event->state & GDK_SHIFT_MASK))
+ {
+ gtk_cell_editable_editing_done (GTK_CELL_EDITABLE(cv));
+
+ if (GTK_IS_CELL_EDITABLE(cv))
+ gtk_cell_editable_remove_widget (GTK_CELL_EDITABLE(cv));
+
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static gboolean
+gcv_focus_out_event (GtkWidget *widget, GdkEvent *event, GncCellView *cv)
+{
+ cv->editing_canceled = TRUE;
+
+ if (cv->focus_out_id > 0)
+ {
+ g_signal_handler_disconnect (cv->text_view, cv->focus_out_id);
+ cv->focus_out_id = 0;
+ }
+ gtk_cell_editable_editing_done (GTK_CELL_EDITABLE(cv));
+ gtk_cell_editable_remove_widget (GTK_CELL_EDITABLE(cv));
+
+ return FALSE;
+}
+
+static gboolean
+gcv_remove_tooltip (GncCellView *cv)
+{
+ if (GTK_IS_WIDGET(cv->text_view))
+ gtk_widget_set_tooltip_text (GTK_WIDGET(cv->text_view), NULL);
+ return FALSE;
+}
+
+static void
+gcv_start_editing (GtkCellEditable *cell_editable,
+ GdkEvent *event)
+{
+ GncCellView *cv = GNC_CELL_VIEW(cell_editable);
+ GtkTextIter siter, eiter;
+
+ // Remove the text_view tooltip after 5secs
+ g_timeout_add (5000, (GSourceFunc) gcv_remove_tooltip, cv);
+
+ gtk_text_buffer_get_bounds (cv->buffer, &siter, &eiter);
+ gtk_text_buffer_select_range (cv->buffer, &eiter, &siter);
+
+ gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW(cv->text_view), TRUE);
+
+ gtk_widget_grab_focus (GTK_WIDGET(cv->text_view));
+
+ g_signal_connect (G_OBJECT(cv->text_view), "key_press_event",
+ G_CALLBACK(gtk_cell_editable_key_press_event), cv);
+
+ cv->focus_out_id = g_signal_connect (G_OBJECT(cv->text_view),
+ "focus-out-event",
+ G_CALLBACK(gcv_focus_out_event), cv);
+}
+
+static void
+gnc_cell_view_editable_init (GtkCellEditableIface *iface)
+{
+ iface->start_editing = gcv_start_editing;
+}
+
+void
+gnc_cell_view_set_text (GncCellView *cv, const gchar *text)
+{
+ g_return_if_fail (GNC_IS_CELL_VIEW(cv));
+
+ gtk_text_buffer_set_text (cv->buffer,
+ text ? text : "",
+ -1);
+}
+
+const gchar *
+gnc_cell_view_get_text (GncCellView *cv)
+{
+ GtkTextIter siter, eiter;
+
+ g_return_val_if_fail (GNC_IS_CELL_VIEW(cv), NULL);
+
+ gtk_text_buffer_get_bounds (cv->buffer, &siter, &eiter);
+
+ return gtk_text_buffer_get_text (cv->buffer, &siter, &eiter, TRUE);
+}
diff --git a/gnucash/gnome-utils/gnc-cell-view.h b/gnucash/gnome-utils/gnc-cell-view.h
new file mode 100644
index 000000000..7f76da6ac
--- /dev/null
+++ b/gnucash/gnome-utils/gnc-cell-view.h
@@ -0,0 +1,62 @@
+/*************************************************************************
+ * The following code implements a text view in a custom GtkCellRenderer.
+ *
+ * Copyright (C) 2020 Robert Fewell
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *************************************************************************/
+
+#ifndef __GNC_CELL_VIEW_H__
+#define __GNC_CELL_VIEW_H__
+
+#include <pango/pango.h>
+#include <gtk/gtk.h>
+
+#define GNC_TYPE_CELL_VIEW (gnc_cell_view_get_type ())
+#define GNC_CELL_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GNC_TYPE_CELL_VIEW, GncCellView))
+#define GNC_CELL_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GNC_TYPE_CELL_VIEW, GncCellViewClass))
+#define GNC_IS_CELL_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GNC_TYPE_CELL_VIEW))
+#define GNC_IS_CELL_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), GNC_TYPE_CELL_VIEW))
+#define GNC_CELL_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GNC_TYPE_CELL_VIEW, GncCellViewClass))
+
+typedef struct _GncCellView GncCellView;
+typedef struct _GncCellViewClass GncCellViewClass;
+
+struct _GncCellView
+{
+ GtkEventBox parent;
+
+ GtkWidget *text_view;
+ GtkTextBuffer *buffer;
+
+ gulong focus_out_id;
+ gboolean editing_canceled;
+};
+
+struct _GncCellViewClass
+{
+ GtkEventBoxClass parent_class;
+};
+
+GType gnc_cell_view_get_type (void) G_GNUC_CONST;
+
+GtkWidget *gnc_cell_view_new (void);
+
+void gnc_cell_view_set_text (GncCellView *cv, const gchar *text);
+
+const gchar *gnc_cell_view_get_text (GncCellView *cv);
+
+#endif /* __GNC_CELL_VIEW_H__ */
diff --git a/gnucash/gnome-utils/gnc-tree-view-account.c b/gnucash/gnome-utils/gnc-tree-view-account.c
index 6fabac1c0..1cdfdb0fd 100644
--- a/gnucash/gnome-utils/gnc-tree-view-account.c
+++ b/gnucash/gnome-utils/gnc-tree-view-account.c
@@ -931,11 +931,12 @@ gnc_tree_view_account_new_with_root (Account *root, gboolean show_root)
g_strdup(_("Account Color")), g_free);
priv->notes_column
- = gnc_tree_view_add_text_column(view, _("Notes"), "notes", NULL,
+ = gnc_tree_view_add_text_view_column(view, _("Notes"), "notes", NULL,
"Sample account notes.",
GNC_TREE_MODEL_ACCOUNT_COL_NOTES,
GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
sort_by_string);
+
tax_info_column
= gnc_tree_view_add_text_column(view, _("Tax Info"), "tax-info", NULL,
"Sample tax info.",
diff --git a/gnucash/gnome-utils/gnc-tree-view.c b/gnucash/gnome-utils/gnc-tree-view.c
index f89f81e96..69a5bc62a 100644
--- a/gnucash/gnome-utils/gnc-tree-view.c
+++ b/gnucash/gnome-utils/gnc-tree-view.c
@@ -43,6 +43,7 @@
#include "gnc-gnome-utils.h"
#include "gnc-gobject-utils.h"
#include "gnc-cell-renderer-date.h"
+#include "gnc-cell-renderer-text-view.h"
#include "gnc-state.h"
#include "gnc-prefs.h"
#include "dialog-utils.h"
@@ -1830,26 +1831,18 @@ renderer_edited_cb (GtkCellRendererText *renderer, gchar *path,
(priv->editing_finished_cb)(view, priv->editing_cb_data);
}
-/** This function adds a new text column to a GncTreeView base view.
- * It takes all the parameters necessary to hook a GtkTreeModel
- * column to a GtkTreeViewColumn. If the tree has a state section
- * associated with it, this function also wires up the column so that
- * its visibility and width are remembered.
- *
- * Parameters are defined in gnc-tree-view.h
- */
-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)
+
+static GtkTreeViewColumn *
+add_text_column_variant (GncTreeView *view, GtkCellRenderer *renderer,
+ 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)
{
GtkTreeViewColumn *column;
- GtkCellRenderer *renderer;
PangoLayout* layout;
int default_width, title_width;
@@ -1861,13 +1854,12 @@ gnc_tree_view_add_text_column (GncTreeView *view,
/* Set up an icon renderer if requested */
if (icon_name)
{
- renderer = gtk_cell_renderer_pixbuf_new ();
- g_object_set (renderer, "icon-name", icon_name, NULL);
- gtk_tree_view_column_pack_start (column, renderer, FALSE);
+ GtkCellRenderer *renderer_pix = gtk_cell_renderer_pixbuf_new ();
+ g_object_set (renderer_pix, "icon-name", icon_name, NULL);
+ gtk_tree_view_column_pack_start (column, renderer_pix, FALSE);
}
/* Set up a text renderer and attributes */
- renderer = gtk_cell_renderer_text_new ();
gtk_tree_view_column_pack_start (column, renderer, TRUE);
/* Set up the callbacks for when editing */
@@ -1906,6 +1898,70 @@ gnc_tree_view_add_text_column (GncTreeView *view,
}
+/** This function adds a new text column to a GncTreeView base view.
+ * It takes all the parameters necessary to hook a GtkTreeModel
+ * column to a GtkTreeViewColumn. If the tree has a state section
+ * associated with it, this function also wires up the column so that
+ * its visibility and width are remembered.
+ *
+ * Parameters are defined in gnc-tree-view.h
+ */
+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)
+{
+ GtkCellRenderer *renderer;
+
+ g_return_val_if_fail (GNC_IS_TREE_VIEW(view), NULL);
+
+ renderer = gtk_cell_renderer_text_new ();
+
+ return add_text_column_variant (view, renderer,
+ column_title, pref_name,
+ icon_name, sizing_text,
+ model_data_column,
+ model_visibility_column,
+ column_sort_fn);
+}
+
+/** This function adds a new text view column to a GncTreeView base view.
+ * It takes all the parameters necessary to hook a GtkTreeModel
+ * column to a GtkTreeViewColumn. If the tree has a state section
+ * associated with it, this function also wires up the column so that
+ * its visibility and width are remembered.
+ *
+ * Parameters are defined in gnc-tree-view.h
+ */
+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)
+{
+ GtkCellRenderer *renderer;
+
+ g_return_val_if_fail (GNC_IS_TREE_VIEW(view), NULL);
+
+ renderer = gnc_cell_renderer_text_view_new ();
+
+ return add_text_column_variant (view, renderer,
+ column_title, pref_name,
+ icon_name, sizing_text,
+ model_data_column,
+ model_visibility_column,
+ column_sort_fn);
+}
+
/** This function adds a new date column to a GncTreeView base view.
* It takes all the parameters necessary to hook a GtkTreeModel
diff --git a/gnucash/gnome-utils/gnc-tree-view.h b/gnucash/gnome-utils/gnc-tree-view.h
index 65d91b5cb..12c453d5d 100644
--- a/gnucash/gnome-utils/gnc-tree-view.h
+++ b/gnucash/gnome-utils/gnc-tree-view.h
@@ -199,6 +199,53 @@ gnc_tree_view_add_text_column (GncTreeView *view,
gint model_visibility_column,
GtkTreeIterCompareFunc column_sort_fn);
+/** This function adds a new text view column to a GncTreeView base view.
+ * It takes all the parameters necessary to hook a GtkTreeModel
+ * column to a GtkTreeViewColumn.
+ *
+ * @param view A pointer to a generic GncTreeView.
+ *
+ * @param column_title The title for this column.
+ *
+ * @param pref_name The internal name of this column. This name is
+ * used in several functions to look up the column, and it is also
+ * used when saving/restoring the view's state.
+ *
+ * @param icon_name The name of the icon to display to
+ * the left of the text in this column. Used for adding icons like
+ * the "account" icon to a view. This must be a registered icon,
+ * not a filename.
+ *
+ * @param sizing_text A string used to compute the default width of
+ * the column. This text is never displayed.
+ *
+ * @param model_data_column The index of the GtkTreeModel data column
+ * used to determine the data that will be displayed in this column
+ * for each row in the view. Use GNC_TREE_VIEW_COLUMN_DATA_NONE if
+ * you plan on using a non-model data source for this column. This
+ * index is connected to the "text" attribute of the cell renderer.
+ *
+ * @param model_visibility_column The index of the GtkTreeModel data
+ * column used to determine whether or not a checkbox for each row
+ * will be displayed at all. Use GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS
+ * if the checkbox should be displayed in all rows.
+ *
+ * @param column_sort_fn The function that GtkTreeModelSort
+ * will call to compare two rows to determine their displayed
+ * order.
+ *
+ * @return The newly created GtkTreeViewColumn.
+ */
+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 combobox column to a GncTreeView base
* view. The parameters it takes in common with
* gnc_tree_view_add_text_column() behave the same as there. In
Summary of changes:
gnucash/gnome-utils/CMakeLists.txt | 4 +
gnucash/gnome-utils/gnc-cell-renderer-text-view.c | 160 ++++++++++++++
gnucash/gnome-utils/gnc-cell-renderer-text-view.h | 57 +++++
gnucash/gnome-utils/gnc-cell-view.c | 243 ++++++++++++++++++++++
gnucash/gnome-utils/gnc-cell-view.h | 62 ++++++
gnucash/gnome-utils/gnc-tree-view-account.c | 3 +-
gnucash/gnome-utils/gnc-tree-view.c | 100 +++++++--
gnucash/gnome-utils/gnc-tree-view.h | 47 +++++
8 files changed, 653 insertions(+), 23 deletions(-)
create mode 100644 gnucash/gnome-utils/gnc-cell-renderer-text-view.c
create mode 100644 gnucash/gnome-utils/gnc-cell-renderer-text-view.h
create mode 100644 gnucash/gnome-utils/gnc-cell-view.c
create mode 100644 gnucash/gnome-utils/gnc-cell-view.h
More information about the gnucash-changes
mailing list