gnucash future: Multiple changes pushed

John Ralls jralls at code.gnucash.org
Thu Sep 10 19:23:48 EDT 2026


Updated	 via  https://github.com/Gnucash/gnucash/commit/abe2716e (commit)
	 via  https://github.com/Gnucash/gnucash/commit/06e76ca4 (commit)
	from  https://github.com/Gnucash/gnucash/commit/5069b715 (commit)



commit abe2716e0b58d78b13c12386a706dda15e115784
Merge: 5069b71583 06e76ca49e
Author: John Ralls <jralls at ceridwen.us>
Date:   Thu Sep 10 16:12:14 2026 -0700

    Merge Étienne Beaulé's 'bug/798042' into future.


commit 06e76ca49e50beb3317e7312527fc98e57c023e6
Author: Étienne Beaulé <etienne at dashsocial.com>
Date:   Wed Sep 2 01:46:12 2026 -0300

    Lot Dialog: Use GList of Splits for multi-select

diff --git a/gnucash/gnome/dialog-lot-viewer.c b/gnucash/gnome/dialog-lot-viewer.c
index 4fa86b9471..97f2013c37 100644
--- a/gnucash/gnome/dialog-lot-viewer.c
+++ b/gnucash/gnome/dialog-lot-viewer.c
@@ -446,23 +446,30 @@ gnc_lot_viewer_fill (GNCLotViewer *lv)
 }
 
 /* ======================================================================== */
-/* Get selected split in a split list view */
+/* Get selected splits in a split list view. The caller owns the returned
+ * list, but not the splits it contains. */
 
-static Split *
-lv_get_selected_split (GNCLotViewer *lv, GtkTreeView *view)
+static GList *
+lv_get_selected_splits (GtkTreeView *view)
 {
-    Split *split = NULL;
-    GtkTreeModel *model;
-    GtkTreeSelection *selection;
-    GtkTreeIter iter;
+    GtkTreeModel *model = NULL;
+    GtkTreeSelection *selection = gtk_tree_view_get_selection (view);
+    GList *selected_rows = gtk_tree_selection_get_selected_rows (selection, &model);
+    GList *selected_splits = NULL;
 
-    selection = gtk_tree_view_get_selection (view);
-    if (gtk_tree_selection_get_selected (selection, &model, &iter))
+    for (GList *node = selected_rows; node; node = node->next)
     {
-        gtk_tree_model_get (model, &iter, SPLIT_COL_PNTR, &split, -1);
+        GtkTreeIter iter;
+        Split *split = NULL;
+
+        if (gtk_tree_model_get_iter (model, &iter, node->data))
+            gtk_tree_model_get (model, &iter, SPLIT_COL_PNTR, &split, -1);
+        if (split)
+            selected_splits = g_list_prepend (selected_splits, split);
     }
 
-    return split;
+    g_list_free_full (selected_rows, (GDestroyNotify)gtk_tree_path_free);
+    return g_list_reverse (selected_splits);
 }
 
 /* ======================================================================== */
@@ -583,20 +590,30 @@ gnc_split_viewer_fill (GNCLotViewer *lv, GtkListStore *store, SplitList *split_l
 static void
 lv_update_split_buttons (GNCLotViewer *lv)
 {
-    Split *split;
+    GList *selected_splits;
+    gboolean can_remove_all = TRUE;
+
     gtk_widget_set_sensitive (GTK_WIDGET(lv->add_split_to_lot_button), FALSE);
     gtk_widget_set_sensitive (GTK_WIDGET(lv->remove_split_from_lot_button), FALSE);
     if (NULL != lv->selected_lot)
     {
-        if (NULL != lv_get_selected_split (lv, lv->split_free_view) )
-        {
+        selected_splits = lv_get_selected_splits (lv->split_free_view);
+        if (selected_splits)
             gtk_widget_set_sensitive (GTK_WIDGET(lv->add_split_to_lot_button), TRUE);
-        }
-        split = lv_get_selected_split (lv, lv->split_in_lot_view);
-        if (NULL != split && TRUE == lv_can_remove_split_from_lot (split, lv->selected_lot))
+        g_list_free (selected_splits);
+
+        selected_splits = lv_get_selected_splits (lv->split_in_lot_view);
+        for (GList *node = selected_splits; node; node = node->next)
         {
-            gtk_widget_set_sensitive (GTK_WIDGET(lv->remove_split_from_lot_button), TRUE);
+            if (!lv_can_remove_split_from_lot (node->data, lv->selected_lot))
+            {
+                can_remove_all = FALSE;
+                break;
+            }
         }
+        if (selected_splits && can_remove_all)
+            gtk_widget_set_sensitive (GTK_WIDGET(lv->remove_split_from_lot_button), TRUE);
+        g_list_free (selected_splits);
     }
 }
 
@@ -723,39 +740,49 @@ lv_split_selection_changed_cb (GtkTreeSelection *selection,
 static void
 lv_add_split_to_lot_cb (GtkWidget *widget, GNCLotViewer * lv)
 {
-    Split *split;
+    GList *selected_splits;
 
     if ( NULL == lv->selected_lot ) return;
-    split = lv_get_selected_split (lv, lv->split_free_view);
-    if ( NULL == split ) return;
+    selected_splits = lv_get_selected_splits (lv->split_free_view);
+    if ( NULL == selected_splits ) return;
 
     gnc_suspend_gui_refresh ();
     xaccAccountBeginEdit (lv->account);
-    gnc_lot_add_split (lv->selected_lot, split);
+    for (GList *node = selected_splits; node; node = node->next)
+        gnc_lot_add_split (lv->selected_lot, node->data);
     xaccAccountCommitEdit (lv->account);
     gnc_resume_gui_refresh ();
 
+    g_list_free (selected_splits);
     lv_refresh (lv);
 }
 
 static void
 lv_remove_split_from_lot_cb (GtkWidget *widget, GNCLotViewer * lv)
 {
-    Split *split;
+    GList *selected_splits;
 
     if ( NULL == lv->selected_lot ) return;
-    split = lv_get_selected_split (lv, lv->split_in_lot_view);
-    if ( NULL == split ) return;
+    selected_splits = lv_get_selected_splits (lv->split_in_lot_view);
+    if ( NULL == selected_splits ) return;
 
-    if ( FALSE == lv_can_remove_split_from_lot (split, lv->selected_lot) )
-        return;
+    for (GList *node = selected_splits; node; node = node->next)
+    {
+        if (!lv_can_remove_split_from_lot (node->data, lv->selected_lot))
+        {
+            g_list_free (selected_splits);
+            return;
+        }
+    }
 
     gnc_suspend_gui_refresh ();
     xaccAccountBeginEdit (lv->account);
-    gnc_lot_remove_split (lv->selected_lot, split);
+    for (GList *node = selected_splits; node; node = node->next)
+        gnc_lot_remove_split (lv->selected_lot, node->data);
     xaccAccountCommitEdit (lv->account);
     gnc_resume_gui_refresh ();
 
+    g_list_free (selected_splits);
     lv_refresh (lv);
 }
 
@@ -1059,6 +1086,7 @@ lv_init_split_view (GNCLotViewer *lv, GtkTreeView *view)
 
     /* Set up the selection callbacks */
     selection = gtk_tree_view_get_selection (view);
+    gtk_tree_selection_set_mode (selection, GTK_SELECTION_MULTIPLE);
     g_signal_connect (selection, "changed",
                       G_CALLBACK(lv_split_selection_changed_cb), lv);
 



Summary of changes:
 gnucash/gnome/dialog-lot-viewer.c | 84 ++++++++++++++++++++++++++-------------
 1 file changed, 56 insertions(+), 28 deletions(-)



More information about the gnucash-changes mailing list