gnucash maint: Multiple changes pushed

Geert Janssens gjanssens at code.gnucash.org
Sat Aug 11 15:06:26 EDT 2018


Updated	 via  https://github.com/Gnucash/gnucash/commit/14335b78 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/b3f1104d (commit)
	 via  https://github.com/Gnucash/gnucash/commit/19d6eb90 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/9768a215 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/5ff8d8da (commit)
	 via  https://github.com/Gnucash/gnucash/commit/847766fc (commit)
	from  https://github.com/Gnucash/gnucash/commit/22dd716b (commit)



commit 14335b78626762d0eba11888334796cff6809d27
Merge: 22dd716 b3f1104
Author: Geert Janssens <geert at kobaltwit.be>
Date:   Sat Aug 11 21:04:26 2018 +0200

    Merge branch 'Bug796788' of https://github.com/Bob-IT/gnucash into maint


commit b3f1104d39d2326cba7304e7981836e0725aba6d
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Fri Aug 10 14:29:44 2018 +0100

    Fix a possible transient parent dialogue warning

diff --git a/gnucash/gnome-utils/dialog-options.c b/gnucash/gnome-utils/dialog-options.c
index da5c14a..7952fb1 100644
--- a/gnucash/gnome-utils/dialog-options.c
+++ b/gnucash/gnome-utils/dialog-options.c
@@ -4335,7 +4335,7 @@ scm_apply_cb (GNCOptionWin *win, gpointer data)
         results = gnc_option_db_commit (win->option_db);
         for (iter = results; iter; iter = iter->next)
         {
-            GtkWidget *dialog = gtk_message_dialog_new(NULL,
+            GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(gnc_options_dialog_widget(win)),
                                                        0,
                                                        GTK_MESSAGE_ERROR,
                                                        GTK_BUTTONS_OK,
diff --git a/gnucash/report/report-gnome/dialog-report-column-view.c b/gnucash/report/report-gnome/dialog-report-column-view.c
index ebd4e7e..4453c10 100644
--- a/gnucash/report/report-gnome/dialog-report-column-view.c
+++ b/gnucash/report/report-gnome/dialog-report-column-view.c
@@ -292,7 +292,7 @@ gnc_column_view_edit_apply_cb(GNCOptionWin * w, gpointer user_data)
     results = gnc_option_db_commit (win->odb);
     for (iter = results; iter; iter = iter->next)
     {
-        GtkWidget *dialog = gtk_message_dialog_new(NULL,
+        GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(gnc_options_dialog_widget(w)),
                                                    0,
                                                    GTK_MESSAGE_ERROR,
                                                    GTK_BUTTONS_OK,

commit 19d6eb902824e7dbca1b12476dffb83a58b717b9
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Sat Aug 11 12:39:48 2018 +0100

    Improve the button sensitivity function

diff --git a/gnucash/report/report-gnome/dialog-report-column-view.c b/gnucash/report/report-gnome/dialog-report-column-view.c
index 82751d1..ebd4e7e 100644
--- a/gnucash/report/report-gnome/dialog-report-column-view.c
+++ b/gnucash/report/report-gnome/dialog-report-column-view.c
@@ -239,44 +239,45 @@ gnc_column_view_update_buttons_cb (GtkTreeSelection *selection,
 {
     GtkTreeModel *model;
     GtkTreeIter iter;
-    GtkTreeSelection *available_selection;
+    gboolean is_selected;
 
-    /* compare selection to establish which treeview selected */
-    available_selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(r->available));
-
-    /* available treeview */
-    if (available_selection == selection)
+    /* compare treeviews to establish which selected treeview */
+    if (gtk_tree_selection_get_tree_view (selection) == r->available)
     {
-        if (gtk_tree_selection_get_selected(selection, &model, &iter))
-            gtk_widget_set_sensitive (r->add_button, TRUE);
-        else
-            gtk_widget_set_sensitive (r->add_button, FALSE);
+        /* available treeview */
+        is_selected = gtk_tree_selection_get_selected (selection, &model, &iter);
+        gtk_widget_set_sensitive (r->add_button, is_selected);
         return;
     }
 
     /* contents treeview */
-    if (gtk_tree_selection_get_selected(selection, &model, &iter))
+    is_selected = gtk_tree_selection_get_selected (selection, &model, &iter);
+    gtk_widget_set_sensitive (r->size_button, is_selected);
+    gtk_widget_set_sensitive (r->remove_button, is_selected);
+
+    if (is_selected)
     {
         int len = scm_ilength (r->contents_list);
 
-        gtk_tree_model_get(model, &iter,
+        gtk_tree_model_get (model, &iter,
                            CONTENTS_COL_ROW, &r->contents_selected, -1);
 
-        gtk_widget_set_sensitive (r->size_button, TRUE);
-        gtk_widget_set_sensitive (r->remove_button, TRUE);
-
         if (len > 1)
         {
             gtk_widget_set_sensitive (r->up_button, TRUE);
             gtk_widget_set_sensitive (r->down_button, TRUE);
+
+            if (r->contents_selected == len -1)
+                gtk_widget_set_sensitive (r->down_button, FALSE);
+
+            if (r->contents_selected == 0)
+                gtk_widget_set_sensitive (r->up_button, FALSE);
         }
     }
     else
     {
         gtk_widget_set_sensitive (r->up_button, FALSE);
         gtk_widget_set_sensitive (r->down_button, FALSE);
-        gtk_widget_set_sensitive (r->size_button, FALSE);
-        gtk_widget_set_sensitive (r->remove_button, FALSE);
     }
 }
 

commit 9768a2158d312d3d91c4661fd6f5ed1f4d73218c
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Fri Aug 10 12:40:51 2018 +0100

    Save the contents_selected value in selection callback
    
    With the use of the selection call back for button sensitivity it make
    sense to use that to store the contents_selected value for the contents
    tree view.

diff --git a/gnucash/report/report-gnome/dialog-report-column-view.c b/gnucash/report/report-gnome/dialog-report-column-view.c
index 1dc5587..82751d1 100644
--- a/gnucash/report/report-gnome/dialog-report-column-view.c
+++ b/gnucash/report/report-gnome/dialog-report-column-view.c
@@ -259,6 +259,9 @@ gnc_column_view_update_buttons_cb (GtkTreeSelection *selection,
     {
         int len = scm_ilength (r->contents_list);
 
+        gtk_tree_model_get(model, &iter,
+                           CONTENTS_COL_ROW, &r->contents_selected, -1);
+
         gtk_widget_set_sensitive (r->size_button, TRUE);
         gtk_widget_set_sensitive (r->remove_button, TRUE);
 
@@ -459,7 +462,7 @@ gnc_column_view_edit_add_cb(GtkButton * button, gpointer user_data)
     int oldlength, id;
     gchar *guid_str;
     GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(r->available));
-    GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW(r->available));
+    GtkTreeModel *model;
     GtkTreeIter iter;
 
     /* make sure there is a selected entry */
@@ -526,16 +529,6 @@ gnc_column_view_edit_remove_cb(GtkButton * button, gpointer user_data)
     SCM oldlist = r->contents_list;
     int count;
     int oldlength;
-    GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(r->contents));
-    GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW(r->contents));
-    GtkTreeIter iter;
-
-    /* make sure there is a selected entry */
-    if (gtk_tree_selection_get_selected(selection, &model, &iter))
-        gtk_tree_model_get(model, &iter,
-                           CONTENTS_COL_ROW, &r->contents_selected, -1);
-    else
-        return;
 
     if (scm_is_list(r->contents_list))
     {
@@ -579,16 +572,6 @@ gnc_edit_column_view_move_up_cb(GtkButton * button, gpointer user_data)
     SCM temp;
     int oldlength;
     int count;
-    GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(r->contents));
-    GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW(r->contents));
-    GtkTreeIter iter;
-
-    /* make sure there is a selected entry */
-    if (gtk_tree_selection_get_selected(selection, &model, &iter))
-        gtk_tree_model_get(model, &iter,
-                           CONTENTS_COL_ROW, &r->contents_selected, -1);
-    else
-        return;
 
     oldlength = scm_ilength(r->contents_list);
     if ((r->contents_selected > 0) && (oldlength > r->contents_selected))
@@ -627,16 +610,6 @@ gnc_edit_column_view_move_down_cb(GtkButton * button, gpointer user_data)
     SCM temp;
     int oldlength;
     int count;
-    GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(r->contents));
-    GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW(r->contents));
-    GtkTreeIter iter;
-
-    /* make sure there is a selected entry */
-    if (gtk_tree_selection_get_selected(selection, &model, &iter))
-        gtk_tree_model_get(model, &iter,
-                           CONTENTS_COL_ROW, &r->contents_selected, -1);
-    else
-        return;
 
     oldlength = scm_ilength(r->contents_list);
     if (oldlength > (r->contents_selected + 1))

commit 5ff8d8daba7278b242628ba8c0f9f23fae868904
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Fri Aug 10 11:36:41 2018 +0100

    Update buttons on Multicolumn report options
    
    Change the sensitivity of the multicolumn report options based on the
    selection in the two tree views using the select callback.

diff --git a/gnucash/gtkbuilder/dialog-report.glade b/gnucash/gtkbuilder/dialog-report.glade
index c7dd029..17d2ea5 100644
--- a/gnucash/gtkbuilder/dialog-report.glade
+++ b/gnucash/gtkbuilder/dialog-report.glade
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.20.0 -->
+<!-- Generated with glade 3.20.4 -->
 <interface>
   <requires lib="gtk+" version="3.10"/>
   <object class="GtkAdjustment" id="col_adjustment">
@@ -95,9 +95,10 @@
               </packing>
             </child>
             <child>
-              <object class="GtkButton" id="button85">
+              <object class="GtkButton" id="add_button1">
                 <property name="label" translatable="yes">A_dd  >></property>
                 <property name="visible">True</property>
+                <property name="sensitive">False</property>
                 <property name="can_focus">True</property>
                 <property name="receives_default">True</property>
                 <property name="use_underline">True</property>
@@ -110,9 +111,10 @@
               </packing>
             </child>
             <child>
-              <object class="GtkButton" id="button86">
+              <object class="GtkButton" id="remove_button1">
                 <property name="label" translatable="yes"><< _Remove</property>
                 <property name="visible">True</property>
+                <property name="sensitive">False</property>
                 <property name="can_focus">True</property>
                 <property name="receives_default">True</property>
                 <property name="use_underline">True</property>
@@ -137,9 +139,10 @@
               </packing>
             </child>
             <child>
-              <object class="GtkButton" id="button87">
+              <object class="GtkButton" id="up_button1">
                 <property name="label" translatable="yes">Move _up</property>
                 <property name="visible">True</property>
+                <property name="sensitive">False</property>
                 <property name="can_focus">True</property>
                 <property name="receives_default">True</property>
                 <property name="use_underline">True</property>
@@ -152,9 +155,10 @@
               </packing>
             </child>
             <child>
-              <object class="GtkButton" id="button88">
+              <object class="GtkButton" id="down_button1">
                 <property name="label" translatable="yes">Move dow_n</property>
                 <property name="visible">True</property>
+                <property name="sensitive">False</property>
                 <property name="can_focus">True</property>
                 <property name="receives_default">True</property>
                 <property name="use_underline">True</property>
@@ -179,9 +183,10 @@
               </packing>
             </child>
             <child>
-              <object class="GtkButton" id="button89">
+              <object class="GtkButton" id="size_button1">
                 <property name="label" translatable="yes">Si_ze...</property>
                 <property name="visible">True</property>
+                <property name="sensitive">False</property>
                 <property name="can_focus">True</property>
                 <property name="receives_default">True</property>
                 <property name="use_underline">True</property>
@@ -241,9 +246,11 @@
         </child>
       </object>
     </child>
+    <child type="titlebar">
+      <placeholder/>
+    </child>
   </object>
   <object class="GtkDialog" id="html_style_sheet_dialog">
-    <property name="visible">False</property>
     <property name="can_focus">False</property>
     <property name="title" translatable="yes">HTML Style Sheets</property>
     <property name="type_hint">dialog</property>
@@ -416,6 +423,9 @@
     <action-widgets>
       <action-widget response="-7">closebutton1</action-widget>
     </action-widgets>
+    <child>
+      <placeholder/>
+    </child>
   </object>
   <object class="GtkAdjustment" id="row_adjustment">
     <property name="upper">100</property>
@@ -573,6 +583,9 @@
       <action-widget response="-6">cancelbutton</action-widget>
       <action-widget response="-5">okbutton</action-widget>
     </action-widgets>
+    <child>
+      <placeholder/>
+    </child>
   </object>
   <object class="GtkDialog" id="select_style_sheet_dialog">
     <property name="can_focus">False</property>
@@ -690,6 +703,9 @@
       <action-widget response="2">delete_button</action-widget>
       <action-widget response="-7">close_button</action-widget>
     </action-widgets>
+    <child>
+      <placeholder/>
+    </child>
   </object>
   <object class="GtkListStore" id="template_liststore">
     <columns>
@@ -849,5 +865,8 @@
       <action-widget response="-6">cancelbutton1</action-widget>
       <action-widget response="-5">okbutton1</action-widget>
     </action-widgets>
+    <child>
+      <placeholder/>
+    </child>
   </object>
 </interface>
diff --git a/gnucash/report/report-gnome/dialog-report-column-view.c b/gnucash/report/report-gnome/dialog-report-column-view.c
index 84bdd93..1dc5587 100644
--- a/gnucash/report/report-gnome/dialog-report-column-view.c
+++ b/gnucash/report/report-gnome/dialog-report-column-view.c
@@ -67,6 +67,12 @@ struct gncp_column_view_edit
     SCM       available_list;
     SCM       contents_list;
     int       contents_selected;
+
+    GtkWidget *add_button;
+    GtkWidget *remove_button;
+    GtkWidget *up_button;
+    GtkWidget *down_button;
+    GtkWidget *size_button;
 };
 
 void gnc_column_view_edit_add_cb(GtkButton * button, gpointer user_data);
@@ -228,6 +234,50 @@ update_contents_lists(gnc_column_view_edit * view)
 }
 
 static void
+gnc_column_view_update_buttons_cb (GtkTreeSelection *selection,
+                                       gnc_column_view_edit *r)
+{
+    GtkTreeModel *model;
+    GtkTreeIter iter;
+    GtkTreeSelection *available_selection;
+
+    /* compare selection to establish which treeview selected */
+    available_selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(r->available));
+
+    /* available treeview */
+    if (available_selection == selection)
+    {
+        if (gtk_tree_selection_get_selected(selection, &model, &iter))
+            gtk_widget_set_sensitive (r->add_button, TRUE);
+        else
+            gtk_widget_set_sensitive (r->add_button, FALSE);
+        return;
+    }
+
+    /* contents treeview */
+    if (gtk_tree_selection_get_selected(selection, &model, &iter))
+    {
+        int len = scm_ilength (r->contents_list);
+
+        gtk_widget_set_sensitive (r->size_button, TRUE);
+        gtk_widget_set_sensitive (r->remove_button, TRUE);
+
+        if (len > 1)
+        {
+            gtk_widget_set_sensitive (r->up_button, TRUE);
+            gtk_widget_set_sensitive (r->down_button, TRUE);
+        }
+    }
+    else
+    {
+        gtk_widget_set_sensitive (r->up_button, FALSE);
+        gtk_widget_set_sensitive (r->down_button, FALSE);
+        gtk_widget_set_sensitive (r->size_button, FALSE);
+        gtk_widget_set_sensitive (r->remove_button, FALSE);
+    }
+}
+
+static void
 gnc_column_view_edit_apply_cb(GNCOptionWin * w, gpointer user_data)
 {
     SCM  dirty_report = scm_c_eval_string("gnc:report-set-dirty?!");
@@ -278,6 +328,7 @@ gnc_column_view_edit_options(SCM options, SCM view)
     GtkListStore *store;
     GtkCellRenderer *renderer;
     GtkTreeViewColumn *column;
+    GtkTreeSelection *selection;
 
     ptr = scm_call_1(get_editor, view);
     if (ptr != SCM_BOOL_F)
@@ -304,6 +355,13 @@ gnc_column_view_edit_options(SCM options, SCM view)
         editor       = GTK_WIDGET(gtk_builder_get_object (builder, "view_contents_table"));
         r->available = GTK_TREE_VIEW (gtk_builder_get_object (builder, "available_view"));
         r->contents  = GTK_TREE_VIEW (gtk_builder_get_object (builder, "contents_view"));
+
+        r->add_button = GTK_WIDGET(gtk_builder_get_object (builder, "add_button1"));
+        r->remove_button = GTK_WIDGET(gtk_builder_get_object (builder, "remove_button1"));
+        r->up_button = GTK_WIDGET(gtk_builder_get_object (builder, "up_button1"));
+        r->down_button = GTK_WIDGET(gtk_builder_get_object (builder, "down_button1"));
+        r->size_button = GTK_WIDGET(gtk_builder_get_object (builder, "size_button1"));
+
         r->options   = options;
         r->view      = view;
         r->available_list = SCM_EOL;
@@ -335,6 +393,11 @@ gnc_column_view_edit_options(SCM options, SCM view)
                  NULL);
         gtk_tree_view_append_column(r->available, column);
 
+        /* use the selection cb to update buttons */
+        selection = gtk_tree_view_get_selection(r->available);
+        g_signal_connect(selection, "changed",
+                         G_CALLBACK(gnc_column_view_update_buttons_cb), r);
+
         /* Build the 'contents' view */
         store = gtk_list_store_new (NUM_CONTENTS_COLS, G_TYPE_STRING, G_TYPE_INT,
                                     G_TYPE_INT, G_TYPE_INT);
@@ -359,6 +422,11 @@ gnc_column_view_edit_options(SCM options, SCM view)
                  NULL);
         gtk_tree_view_append_column(r->contents, column);
 
+        /* use the selection cb to update buttons */
+        selection = gtk_tree_view_get_selection(r->contents);
+        g_signal_connect(selection, "changed",
+                         G_CALLBACK(gnc_column_view_update_buttons_cb), r);
+
         update_available_lists(r);
         update_contents_lists(r);
 

commit 847766fc136154dc35ebcb6eeb7dc7bf6c1bc30a
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Wed Aug 8 15:43:36 2018 +0100

    Bug 796788 - strange behaviour in options of multicolumn report
    
    This bug stemmed from the use of GTK_TREE_SORTABLE, the list store
    entries for available reports are not stored as entered but in a sorted
    order. Replaced the use of entry numbers to that of the report guid and
    also used the tree selection to maintain a pointer to the
    selected report. Also separated the updating of the two treeviews so
    selected report position will be maintained.

diff --git a/gnucash/report/report-gnome/dialog-report-column-view.c b/gnucash/report/report-gnome/dialog-report-column-view.c
index 76e0b9d..84bdd93 100644
--- a/gnucash/report/report-gnome/dialog-report-column-view.c
+++ b/gnucash/report/report-gnome/dialog-report-column-view.c
@@ -41,7 +41,7 @@
 enum available_cols
 {
     AVAILABLE_COL_NAME = 0,
-    AVAILABLE_COL_ROW,
+    AVAILABLE_COL_GUID,
     NUM_AVAILABLE_COLS
 };
 
@@ -65,8 +65,6 @@ struct gncp_column_view_edit
     GNCOptionDB  * odb;
 
     SCM       available_list;
-    int       available_selected;
-
     SCM       contents_list;
     int       contents_selected;
 };
@@ -104,82 +102,95 @@ gnc_column_view_edit_destroy(gnc_column_view_edit * view)
 }
 
 static void
-update_display_lists(gnc_column_view_edit * view)
+update_available_lists(gnc_column_view_edit * view)
 {
     SCM   get_rpt_guids = scm_c_eval_string("gnc:all-report-template-guids");
     SCM   template_menu_name = scm_c_eval_string("gnc:report-template-menu-name/report-guid");
-    SCM   report_menu_name = scm_c_eval_string("gnc:report-menu-name");
     SCM   rpt_guids = scm_call_0(get_rpt_guids);
-    SCM   contents =
-        gnc_option_db_lookup_option(view->odb, "__general", "report-list",
-                                    SCM_BOOL_F);
-    SCM   this_report;
     SCM   selection;
+
     gchar *name;
-    int   row, i, id;
+    gchar *guid_str;
+
+    GtkTreeModel *model;
     GtkListStore *store;
     GtkTreeIter iter;
-    GtkTreePath *path;
     GtkTreeSelection *tree_selection;
 
-
     /* Update the list of available reports (left selection box). */
-    row = view->available_selected;
+    tree_selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(view->available));
+    model = gtk_tree_view_get_model (GTK_TREE_VIEW(view->available));
 
-    if (scm_is_list(view->available_list) && !scm_is_null (view->available_list))
+    if (gtk_tree_selection_get_selected(tree_selection, &model, &iter))
     {
-        row = MIN (row, scm_ilength (view->available_list) - 1);
-        selection = scm_list_ref (view->available_list, scm_from_int  (row));
+        gchar *guid_str;
+        gtk_tree_model_get(model, &iter,
+                           AVAILABLE_COL_GUID, &guid_str,
+                           -1);
+        selection = scm_from_utf8_string(guid_str);
+        g_free (guid_str);
     }
     else
-    {
         selection = SCM_UNDEFINED;
-    }
 
     scm_gc_unprotect_object(view->available_list);
     view->available_list = rpt_guids;
     scm_gc_protect_object(view->available_list);
 
-    store = GTK_LIST_STORE(gtk_tree_view_get_model(view->available));
+    store = GTK_LIST_STORE(model);
     gtk_list_store_clear(store);
 
     if (scm_is_list(rpt_guids))
     {
-        for (i = 0; !scm_is_null(rpt_guids); rpt_guids = SCM_CDR(rpt_guids), i++)
+        for (int i = 0; !scm_is_null(rpt_guids); rpt_guids = SCM_CDR(rpt_guids), i++)
         {
-            if (scm_is_equal (SCM_CAR(rpt_guids), selection))
-                row = i;
-            name = gnc_scm_to_utf8_string (scm_call_2(template_menu_name, SCM_CAR(rpt_guids),
+            SCM rpt_guids_temp = SCM_CAR(rpt_guids);
+
+            guid_str = scm_to_utf8_string (rpt_guids_temp);
+            name = gnc_scm_to_utf8_string (scm_call_2(template_menu_name, rpt_guids_temp,
                                              SCM_BOOL_F));
 
             gtk_list_store_append(store, &iter);
             gtk_list_store_set(store, &iter,
                                AVAILABLE_COL_NAME, _(name),
-                               AVAILABLE_COL_ROW, i,
+                               AVAILABLE_COL_GUID, guid_str,
                                -1);
+
+            if (scm_is_equal (rpt_guids_temp, selection))
+                gtk_tree_selection_select_iter (tree_selection, &iter);
+
             g_free (name);
+            g_free (guid_str);
         }
-
     }
+}
 
-    tree_selection = gtk_tree_view_get_selection(view->available);
-    path = gtk_tree_path_new_from_indices(row, -1);
-    gtk_tree_selection_select_path(tree_selection, path);
-    gtk_tree_path_free(path);
+static void
+update_contents_lists(gnc_column_view_edit * view)
+{
+    SCM   report_menu_name = scm_c_eval_string("gnc:report-menu-name");
+    SCM   contents =
+        gnc_option_db_lookup_option(view->odb, "__general", "report-list",
+                                    SCM_BOOL_F);
+    SCM   this_report;
+    SCM   selection;
+    gchar *name;
 
+    GtkListStore *store;
+    GtkTreeIter iter;
+    GtkTreeSelection *tree_selection;
 
     /* Update the list of selected reports (right selection box). */
-    row = view->contents_selected;
+    tree_selection = gtk_tree_view_get_selection(view->contents);
 
     if (scm_is_list(view->contents_list) && !scm_is_null (view->contents_list))
     {
+        int row = view->contents_selected;
         row = MIN (row, scm_ilength (view->contents_list) - 1);
-        selection = scm_list_ref (view->contents_list, scm_from_int  (row));
+        selection = scm_list_ref (view->contents_list, scm_from_int (row));
     }
     else
-    {
         selection = SCM_UNDEFINED;
-    }
 
     scm_gc_unprotect_object(view->contents_list);
     view->contents_list = contents;
@@ -187,14 +198,15 @@ update_display_lists(gnc_column_view_edit * view)
 
     store = GTK_LIST_STORE(gtk_tree_view_get_model(view->contents));
     gtk_list_store_clear(store);
+
     if (scm_is_list(contents))
     {
-        for (i = 0; !scm_is_null(contents); contents = SCM_CDR(contents), i++)
+        for (int i = 0; !scm_is_null(contents); contents = SCM_CDR(contents), i++)
         {
-            if (scm_is_equal (SCM_CAR(contents), selection))
-                row = i;
+            SCM contents_temp = SCM_CAR(contents);
+
+            int id = scm_to_int(SCM_CAAR(contents));
 
-            id = scm_to_int(SCM_CAAR(contents));
             this_report = gnc_report_find(id);
             name = gnc_scm_to_utf8_string (scm_call_1(report_menu_name, this_report));
 
@@ -203,44 +215,16 @@ update_display_lists(gnc_column_view_edit * view)
             (store, &iter,
              CONTENTS_COL_NAME, _(name),
              CONTENTS_COL_ROW, i,
-             CONTENTS_COL_REPORT_COLS, scm_to_int(SCM_CADR(SCM_CAR(contents))),
-             CONTENTS_COL_REPORT_ROWS, scm_to_int(SCM_CADDR(SCM_CAR(contents))),
+             CONTENTS_COL_REPORT_COLS, scm_to_int(SCM_CADR(contents_temp)),
+             CONTENTS_COL_REPORT_ROWS, scm_to_int(SCM_CADDR(contents_temp)),
              -1);
+
+            if (scm_is_equal (contents_temp, selection))
+                gtk_tree_selection_select_iter (tree_selection, &iter);
+
             g_free (name);
         }
     }
-
-    tree_selection = gtk_tree_view_get_selection(view->contents);
-    path = gtk_tree_path_new_from_indices(row, -1);
-    gtk_tree_selection_select_path(tree_selection, path);
-    //  gtk_tree_view_scroll_to_cell(view->contents, path, NULL, TRUE, 0.5, 0.0);
-    gtk_tree_path_free(path);
-}
-
-static void
-gnc_column_view_select_avail_cb(GtkTreeSelection *selection,
-                                gnc_column_view_edit *r)
-{
-    GtkTreeModel *model;
-    GtkTreeIter iter;
-
-    if (gtk_tree_selection_get_selected(selection, &model, &iter))
-        gtk_tree_model_get(model, &iter,
-                           AVAILABLE_COL_ROW, &r->available_selected,
-                           -1);
-}
-
-static void
-gnc_column_view_select_contents_cb(GtkTreeSelection *selection,
-                                   gnc_column_view_edit *r)
-{
-    GtkTreeModel *model;
-    GtkTreeIter iter;
-
-    if (gtk_tree_selection_get_selected(selection, &model, &iter))
-        gtk_tree_model_get(model, &iter,
-                           AVAILABLE_COL_ROW, &r->contents_selected,
-                           -1);
 }
 
 static void
@@ -294,7 +278,6 @@ gnc_column_view_edit_options(SCM options, SCM view)
     GtkListStore *store;
     GtkCellRenderer *renderer;
     GtkTreeViewColumn *column;
-    GtkTreeSelection *selection;
 
     ptr = scm_call_1(get_editor, view);
     if (ptr != SCM_BOOL_F)
@@ -323,7 +306,6 @@ gnc_column_view_edit_options(SCM options, SCM view)
         r->contents  = GTK_TREE_VIEW (gtk_builder_get_object (builder, "contents_view"));
         r->options   = options;
         r->view      = view;
-        r->available_selected = 0;
         r->available_list = SCM_EOL;
         r->contents_selected = 0;
         r->contents_list = SCM_EOL;
@@ -342,7 +324,7 @@ gnc_column_view_edit_options(SCM options, SCM view)
         scm_gc_protect_object(r->contents_list);
 
         /* Build the 'available' view */
-        store = gtk_list_store_new (NUM_AVAILABLE_COLS, G_TYPE_STRING, G_TYPE_INT);
+        store = gtk_list_store_new (NUM_AVAILABLE_COLS, G_TYPE_STRING, G_TYPE_STRING);
         gtk_tree_view_set_model(r->available, GTK_TREE_MODEL(store));
         gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store), AVAILABLE_COL_NAME, GTK_SORT_ASCENDING);
         g_object_unref(store);
@@ -353,10 +335,6 @@ gnc_column_view_edit_options(SCM options, SCM view)
                  NULL);
         gtk_tree_view_append_column(r->available, column);
 
-        selection = gtk_tree_view_get_selection(r->available);
-        g_signal_connect(selection, "changed",
-                         G_CALLBACK(gnc_column_view_select_avail_cb), r);
-
         /* Build the 'contents' view */
         store = gtk_list_store_new (NUM_CONTENTS_COLS, G_TYPE_STRING, G_TYPE_INT,
                                     G_TYPE_INT, G_TYPE_INT);
@@ -381,11 +359,8 @@ gnc_column_view_edit_options(SCM options, SCM view)
                  NULL);
         gtk_tree_view_append_column(r->contents, column);
 
-        selection = gtk_tree_view_get_selection(r->contents);
-        g_signal_connect(selection, "changed",
-                         G_CALLBACK(gnc_column_view_select_contents_cb), r);
-
-        update_display_lists(r);
+        update_available_lists(r);
+        update_contents_lists(r);
 
         gnc_options_dialog_set_apply_cb(r->optwin,
                                         gnc_column_view_edit_apply_cb, r);
@@ -414,12 +389,22 @@ gnc_column_view_edit_add_cb(GtkButton * button, gpointer user_data)
     SCM oldlist = r->contents_list;
     int count;
     int oldlength, id;
+    gchar *guid_str;
+    GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(r->available));
+    GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW(r->available));
+    GtkTreeIter iter;
+
+    /* make sure there is a selected entry */
+    if (gtk_tree_selection_get_selected(selection, &model, &iter))
+        gtk_tree_model_get(model, &iter,
+                           AVAILABLE_COL_GUID, &guid_str, -1);
+    else
+        return;
 
-    if (scm_is_list(r->available_list) &&
-            (scm_ilength(r->available_list) > r->available_selected))
+    if (scm_is_list(r->available_list))
     {
-        template_name = scm_list_ref(r->available_list,
-                                     scm_from_int (r->available_selected));
+        template_name = scm_from_utf8_string(guid_str);
+
         new_report = scm_call_1(make_report, template_name);
         id = scm_to_int(new_report);
         scm_call_2(mark_report, gnc_report_find(id), SCM_BOOL_T);
@@ -461,8 +446,8 @@ gnc_column_view_edit_add_cb(GtkButton * button, gpointer user_data)
                                    r->contents_list);
         gnc_options_dialog_changed (r->optwin);
     }
-
-    update_display_lists(r);
+    g_free (guid_str);
+    update_contents_lists(r);
 }
 
 void
@@ -473,6 +458,16 @@ gnc_column_view_edit_remove_cb(GtkButton * button, gpointer user_data)
     SCM oldlist = r->contents_list;
     int count;
     int oldlength;
+    GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(r->contents));
+    GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW(r->contents));
+    GtkTreeIter iter;
+
+    /* make sure there is a selected entry */
+    if (gtk_tree_selection_get_selected(selection, &model, &iter))
+        gtk_tree_model_get(model, &iter,
+                           CONTENTS_COL_ROW, &r->contents_selected, -1);
+    else
+        return;
 
     if (scm_is_list(r->contents_list))
     {
@@ -504,8 +499,7 @@ gnc_column_view_edit_remove_cb(GtkButton * button, gpointer user_data)
 
         gnc_options_dialog_changed (r->optwin);
     }
-
-    update_display_lists(r);
+    update_contents_lists(r);
 }
 
 void
@@ -517,6 +511,16 @@ gnc_edit_column_view_move_up_cb(GtkButton * button, gpointer user_data)
     SCM temp;
     int oldlength;
     int count;
+    GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(r->contents));
+    GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW(r->contents));
+    GtkTreeIter iter;
+
+    /* make sure there is a selected entry */
+    if (gtk_tree_selection_get_selected(selection, &model, &iter))
+        gtk_tree_model_get(model, &iter,
+                           CONTENTS_COL_ROW, &r->contents_selected, -1);
+    else
+        return;
 
     oldlength = scm_ilength(r->contents_list);
     if ((r->contents_selected > 0) && (oldlength > r->contents_selected))
@@ -542,7 +546,7 @@ gnc_edit_column_view_move_up_cb(GtkButton * button, gpointer user_data)
 
         gnc_options_dialog_changed (r->optwin);
 
-        update_display_lists(r);
+        update_contents_lists(r);
     }
 }
 
@@ -555,6 +559,16 @@ gnc_edit_column_view_move_down_cb(GtkButton * button, gpointer user_data)
     SCM temp;
     int oldlength;
     int count;
+    GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(r->contents));
+    GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW(r->contents));
+    GtkTreeIter iter;
+
+    /* make sure there is a selected entry */
+    if (gtk_tree_selection_get_selected(selection, &model, &iter))
+        gtk_tree_model_get(model, &iter,
+                           CONTENTS_COL_ROW, &r->contents_selected, -1);
+    else
+        return;
 
     oldlength = scm_ilength(r->contents_list);
     if (oldlength > (r->contents_selected + 1))
@@ -580,7 +594,7 @@ gnc_edit_column_view_move_down_cb(GtkButton * button, gpointer user_data)
 
         gnc_options_dialog_changed (r->optwin);
 
-        update_display_lists(r);
+        update_contents_lists(r);
     }
 }
 
@@ -636,7 +650,7 @@ gnc_column_view_edit_size_cb(GtkButton * button, gpointer user_data)
                                               current);
             scm_gc_protect_object(r->contents_list);
             gnc_options_dialog_changed (r->optwin);
-            update_display_lists(r);
+            update_contents_lists(r);
         }
 
         g_object_unref(G_OBJECT(builder));



Summary of changes:
 gnucash/gnome-utils/dialog-options.c               |   2 +-
 gnucash/gtkbuilder/dialog-report.glade             |  33 +++-
 .../report-gnome/dialog-report-column-view.c       | 214 +++++++++++++--------
 3 files changed, 162 insertions(+), 87 deletions(-)



More information about the gnucash-changes mailing list