gnucash stable: Multiple changes pushed

John Ralls jralls at code.gnucash.org
Thu Jun 22 16:37:55 EDT 2023


Updated	 via  https://github.com/Gnucash/gnucash/commit/cf3d2f36 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/d4be0d07 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/0449b73e (commit)
	 via  https://github.com/Gnucash/gnucash/commit/59ec7e46 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/ed2b92c4 (commit)
	from  https://github.com/Gnucash/gnucash/commit/4c67cc09 (commit)



commit cf3d2f3656d026fc95c23d00e718d1cce5b5e179
Merge: 4c67cc09a6 d4be0d0711
Author: John Ralls <jralls at ceridwen.us>
Date:   Thu Jun 22 13:36:32 2023 -0700

    Merge Bob Fewell's reg-desc-fixes into stable.


commit d4be0d071182e81f98de8a7b6d8e9a5060a8a621
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Tue Jun 20 12:00:03 2023 +0100

    Bug 798960 - Transaction completion horizontal scrolling
    
    This commit is the second part to the bug that will scroll horizontally
    to where the matching description text is.

diff --git a/gnucash/register/register-gnome/completioncell-gnome.c b/gnucash/register/register-gnome/completioncell-gnome.c
index 14eb81af50..ff3729d72c 100644
--- a/gnucash/register/register-gnome/completioncell-gnome.c
+++ b/gnucash/register/register-gnome/completioncell-gnome.c
@@ -54,6 +54,7 @@ typedef struct _PopBox
     GtkListStore* item_store; // the item list store
 
     gchar*        newval; // string value to find
+    gint          newval_len; // length of string value to find
 
     gboolean      signals_connected; // list signals connected
     gboolean      list_popped;  // list is popped up
@@ -76,9 +77,10 @@ typedef struct _PopBox
 /** Enumeration for the list-store */
 enum GncCompletionColumn
 {
-    TEXT_COL,        //0
-    TEXT_MARKUP_COL, //1
-    WEIGHT_COL,      //2
+    TEXT_COL,           //0
+    TEXT_MARKUP_COL,    //1
+    WEIGHT_COL,         //2
+    FOUND_LOCATION_COL, //3
 };
 
 static void gnc_completion_cell_gui_realize (BasicCell* bcell, gpointer w);
@@ -116,8 +118,8 @@ gnc_completion_cell_init (CompletionCell* cell)
     box->sheet = NULL;
     box->item_edit = NULL;
     box->item_list = NULL;
-    box->item_store = gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_STRING,
-                                             G_TYPE_INT);
+    box->item_store = gtk_list_store_new (4, G_TYPE_STRING, G_TYPE_STRING,
+                                             G_TYPE_INT, G_TYPE_INT);
     box->signals_connected = FALSE;
     box->list_popped = FALSE;
     box->autosize = FALSE;
@@ -156,6 +158,52 @@ select_item_cb (GncItemList* item_list, char* item_string, gpointer user_data)
     hide_popup (box);
 }
 
+static gint
+text_width (PangoLayout *layout)
+{
+    PangoRectangle logical_rect;
+    pango_layout_set_width (layout, -1);
+    pango_layout_get_pixel_extents (layout, NULL, &logical_rect);
+    return logical_rect.width;
+}
+
+static void
+horizontal_scroll_to_found_text (PopBox* box, char* item_string, gint found_location)
+{
+    GtkAllocation alloc;
+    gtk_widget_get_allocation (GTK_WIDGET(box->item_list->tree_view), &alloc);
+    gint scroll_point = 0;
+    gchar *start_string = g_utf8_substring (item_string, 0, found_location + box->newval_len);
+
+    PangoLayout *layout = gtk_widget_create_pango_layout (GTK_WIDGET(box->item_list->tree_view), item_string);
+    PangoAttrList *atlist = pango_attr_list_new ();
+    PangoAttribute *bold_weight = pango_attr_weight_new (PANGO_WEIGHT_BOLD);
+    bold_weight->start_index = found_location;
+    bold_weight->end_index = found_location + box->newval_len;
+    pango_attr_list_insert (atlist, bold_weight);
+    pango_layout_set_attributes (layout, atlist);
+
+    gint item_string_width = text_width (layout);
+
+    pango_layout_set_text (layout, start_string, -1);
+
+    gint start_string_width = text_width (layout);
+
+    pango_attr_list_unref (atlist);
+    g_object_unref (layout);
+    g_free (start_string);
+
+    if (item_string_width <= alloc.width)
+        scroll_point = 0;
+    else
+        scroll_point = start_string_width - alloc.width / 2;
+
+    if (scroll_point < 0)
+        scroll_point = 0;
+
+    gtk_tree_view_scroll_to_point (box->item_list->tree_view, scroll_point, -1);
+}
+
 static void
 change_item_cb (GncItemList* item_list, char* item_string, gpointer user_data)
 {
@@ -165,6 +213,16 @@ change_item_cb (GncItemList* item_list, char* item_string, gpointer user_data)
     box->in_list_select = TRUE;
     gnucash_sheet_modify_current_cell (box->sheet, item_string);
     box->in_list_select = FALSE;
+
+    GtkTreeModel *model = gtk_tree_view_get_model (item_list->tree_view);
+    GtkTreeSelection *selection = gtk_tree_view_get_selection (item_list->tree_view);
+    GtkTreeIter iter;
+    if (gtk_tree_selection_get_selected (selection, &model, &iter))
+    {
+        gint found_location;
+        gtk_tree_model_get (model, &iter, FOUND_LOCATION_COL, &found_location, -1);
+        horizontal_scroll_to_found_text (box, item_string, found_location);
+    }
 }
 
 static void
@@ -434,7 +492,7 @@ gnc_completion_cell_set_value (CompletionCell* cell, const char* str)
 
 static inline void
 list_store_append (GtkListStore *store, char* string,
-                   char* markup, gint weight)
+                   char* markup, gint weight, gint found_location)
 {
     GtkTreeIter iter;
 
@@ -446,7 +504,8 @@ list_store_append (GtkListStore *store, char* string,
 
     gtk_list_store_set (store, &iter, TEXT_COL, string,
                                       TEXT_MARKUP_COL, markup,
-                                      WEIGHT_COL, weight, -1);
+                                      WEIGHT_COL, weight,
+                                      FOUND_LOCATION_COL, found_location, -1);
 }
 
 static char*
@@ -514,7 +573,7 @@ test_and_add (PopBox* box, const gchar *text, gint start_pos,
             if (g_strcmp0 (sub_text_norm_fold, box->newval) == 0) // exact match
                 weight = 1;
 
-            list_store_append (box->item_store, key, markup, weight);
+            list_store_append (box->item_store, key, markup, weight, found_location);
         }
         g_free (markup);
         g_free (prefix);
@@ -565,10 +624,6 @@ select_first_entry_in_list (PopBox* box)
     if (!gtk_tree_model_iter_next (model, &iter))
         return;
 
-    // reset horizontal scrolling
-    gtk_tree_view_column_queue_resize (gtk_tree_view_get_column (
-                                       box->item_list->tree_view, TEXT_COL));
-
     gtk_tree_model_get (model, &iter, TEXT_COL, &string, -1);
 
     gnc_item_list_select (box->item_list, string);
@@ -595,6 +650,8 @@ populate_list_store (CompletionCell* cell, const gchar* str)
     else
         return;
 
+    box->newval_len = g_utf8_strlen (str, -1);
+
     // disconnect list store from tree view
     box->item_store = gnc_item_list_disconnect_store (box->item_list);
 
@@ -607,7 +664,7 @@ populate_list_store (CompletionCell* cell, const gchar* str)
 
     // add the don't first entry
     gchar *markup = g_markup_printf_escaped ("<i>%s</i>", DONT_TEXT);
-    list_store_append (box->item_store, DONT_TEXT, markup, 0);
+    list_store_append (box->item_store, DONT_TEXT, markup, 0, 0);
     g_free (markup);
 
     // add to the list store
@@ -621,6 +678,10 @@ populate_list_store (CompletionCell* cell, const gchar* str)
     // reconnect list store to tree view
     gnc_item_list_connect_store (box->item_list, box->item_store);
 
+    // reset horizontal scrolling
+    gtk_tree_view_column_queue_resize (gtk_tree_view_get_column (
+                                       box->item_list->tree_view, TEXT_COL));
+
     // if no entries, do not show popup
     if (gtk_tree_model_iter_n_children (GTK_TREE_MODEL(box->item_store), NULL) == 1)
     {
@@ -892,6 +953,26 @@ popup_get_width (GtkWidget* widget,
     return alloc.width;
 }
 
+static void
+tree_view_size_allocate_cb (GtkWidget *widget,
+                            G_GNUC_UNUSED GtkAllocation *allocation,
+                            gpointer user_data)
+{
+    GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW(widget));
+    GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(widget));
+    GtkTreeIter iter;
+    if (gtk_tree_selection_get_selected (selection, &model, &iter))
+    {
+        PopBox* box = user_data;
+        gint found_location;
+        gchar *item_text;
+        gtk_tree_model_get (model, &iter, TEXT_COL, &item_text,
+                                          FOUND_LOCATION_COL, &found_location, -1);
+        horizontal_scroll_to_found_text (box, item_text, found_location);
+        g_free (item_text);
+    }
+}
+
 static gboolean
 gnc_completion_cell_enter (BasicCell* bcell,
                            int* cursor_position,
@@ -918,6 +999,9 @@ gnc_completion_cell_enter (BasicCell* bcell,
     gtk_tree_view_column_add_attribute (column, box->item_list->renderer,
                                         "markup", TEXT_MARKUP_COL);
 
+    g_signal_connect (G_OBJECT(box->item_list->tree_view), "size-allocate",
+                      G_CALLBACK(tree_view_size_allocate_cb), box);
+
     completion_connect_signals (cell);
 
     *cursor_position = -1;

commit 0449b73e960c62be134265329af160b291273d92
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Mon Jun 19 09:51:58 2023 +0100

    Bug 798960 - Transaction completion horizontal scrolling
    
    When a description popup has long text a horizontal scroll bar will be
    used. If a subsequent popup has short text which does not need a scroll
    bar, the previous one is still visible so queue a tree view column
    resize to reevaluate the need for a scroll bar.

diff --git a/gnucash/register/register-gnome/completioncell-gnome.c b/gnucash/register/register-gnome/completioncell-gnome.c
index 75ed61d2e2..14eb81af50 100644
--- a/gnucash/register/register-gnome/completioncell-gnome.c
+++ b/gnucash/register/register-gnome/completioncell-gnome.c
@@ -565,6 +565,10 @@ select_first_entry_in_list (PopBox* box)
     if (!gtk_tree_model_iter_next (model, &iter))
         return;
 
+    // reset horizontal scrolling
+    gtk_tree_view_column_queue_resize (gtk_tree_view_get_column (
+                                       box->item_list->tree_view, TEXT_COL));
+
     gtk_tree_model_get (model, &iter, TEXT_COL, &string, -1);
 
     gnc_item_list_select (box->item_list, string);

commit 59ec7e4613c6f1213424c87eece836b4cac53790
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Mon Jun 19 09:43:19 2023 +0100

    Change the search text to be up to the cursor position
    
    When editing an existing entry, similar descriptions would not show so
    instead of using the whole of the description text to search on just
    use the portion up to the cursor.

diff --git a/gnucash/register/register-gnome/completioncell-gnome.c b/gnucash/register/register-gnome/completioncell-gnome.c
index 6136200854..75ed61d2e2 100644
--- a/gnucash/register/register-gnome/completioncell-gnome.c
+++ b/gnucash/register/register-gnome/completioncell-gnome.c
@@ -670,7 +670,9 @@ gnc_completion_cell_modify_verify (BasicCell* bcell,
     if (change == NULL || *cursor_position < bcell->value_chars)
         *start_selection = *end_selection = *cursor_position;
 
-    populate_list_store (cell, newval);
+    gchar *start_of_text = g_utf8_substring (newval, 0, *cursor_position);
+    populate_list_store (cell, start_of_text);
+    g_free (start_of_text);
 
     if (g_strcmp0 (newval, "") == 0)
     {

commit ed2b92c428ce55e8466033d245412b72bbab879b
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Mon Jun 19 09:34:12 2023 +0100

    Fix cursor position when deleting selected text

diff --git a/gnucash/register/register-gnome/completioncell-gnome.c b/gnucash/register/register-gnome/completioncell-gnome.c
index c4bc0aaceb..6136200854 100644
--- a/gnucash/register/register-gnome/completioncell-gnome.c
+++ b/gnucash/register/register-gnome/completioncell-gnome.c
@@ -666,6 +666,10 @@ gnc_completion_cell_modify_verify (BasicCell* bcell,
          box->stop_searching = FALSE;
     }
 
+    // Are were deleting or inserting in the middle.
+    if (change == NULL || *cursor_position < bcell->value_chars)
+        *start_selection = *end_selection = *cursor_position;
+
     populate_list_store (cell, newval);
 
     if (g_strcmp0 (newval, "") == 0)



Summary of changes:
 .../register/register-gnome/completioncell-gnome.c | 114 +++++++++++++++++++--
 1 file changed, 104 insertions(+), 10 deletions(-)



More information about the gnucash-changes mailing list