r23081 - gnucash/trunk/src/report/report-gnome - Rework custom reports dialog

Geert Janssens gjanssens at code.gnucash.org
Tue Jul 2 07:17:48 EDT 2013


Author: gjanssens
Date: 2013-07-02 07:17:47 -0400 (Tue, 02 Jul 2013)
New Revision: 23081
Trac: http://svn.gnucash.org/trac/changeset/23081

Modified:
   gnucash/trunk/src/report/report-gnome/dialog-custom-report.c
   gnucash/trunk/src/report/report-gnome/dialog-custom-report.glade
Log:
Rework custom reports dialog

Each saved report now has 3 actions
- run
- rename
- delete

Rename is a new feature that allows to rename a report without having to
delete/readd.

Modified: gnucash/trunk/src/report/report-gnome/dialog-custom-report.c
===================================================================
--- gnucash/trunk/src/report/report-gnome/dialog-custom-report.c	2013-07-02 11:17:33 UTC (rev 23080)
+++ gnucash/trunk/src/report/report-gnome/dialog-custom-report.c	2013-07-02 11:17:47 UTC (rev 23081)
@@ -51,6 +51,15 @@
     NUM_COLS
 };
 
+enum
+{
+    VIEW_COL_NAME = 0,
+    VIEW_COL_RUN,
+    VIEW_COL_EDIT,
+    VIEW_COL_DELETE,
+    NUM_VIEW_COLS
+};
+
 /* all the pertinent stuff needed to pass around */
 typedef struct _CustomReportDialog
 {
@@ -58,6 +67,11 @@
     GtkWidget *dialog;
     GtkWidget *reportview;
     GncMainWindow *window;
+    GtkTreeViewColumn *namecol;
+    GtkCellRenderer *namerenderer;
+    GtkTreeViewColumn *runcol;
+    GtkTreeViewColumn *editcol;
+    GtkTreeViewColumn *delcol;
 
     /* data */
     SCM reportlist;
@@ -65,11 +79,17 @@
 } CustomReportDialog;
 
 void custom_report_dialog_close_cb(GtkWidget* widget, gpointer data);
-void cancel_custom_report_clicked_cb(GtkWidget* widget, gpointer data);
-void run_custom_report_clicked_cb(GtkWidget* button, gpointer data);
-void delete_custom_report_clicked_cb(GtkWidget *button, gpointer data);
+void close_custom_report_clicked_cb(GtkWidget* widget, gpointer data);
 void custom_report_list_view_row_activated_cb(GtkTreeView *view, GtkTreePath *path,
         GtkTreeViewColumn *column, gpointer data);
+void custom_report_list_view_clicked_cb(GtkTreeView *view, GdkEventButton *event, gpointer data);
+void custom_report_name_edited_cb(GtkCellRendererText *renderer, gchar *path, gchar *new_text, gpointer data);
+void custom_report_query_tooltip_cb (GtkTreeView  *view,
+                                     gint        x,
+                                     gint        y,
+                                     gboolean    keyboard_mode,
+                                     GtkTooltip *tooltip,
+                                     gpointer    data);
 
 void
 custom_report_dialog_close_cb(GtkWidget* widget, gpointer data)
@@ -81,7 +101,7 @@
 
 
 void
-cancel_custom_report_clicked_cb(GtkWidget* widget, gpointer data)
+close_custom_report_clicked_cb(GtkWidget* widget, gpointer data)
 {
     CustomReportDialog *crd = data;
     custom_report_dialog_close_cb(NULL, crd);
@@ -151,11 +171,40 @@
 {
     GtkCellRenderer *renderer;
     GtkTreeModel *model;
+    GtkTreeViewColumn * col;
+    gint colnum;
 
-    renderer = gtk_cell_renderer_text_new();
+    crd->namerenderer = gtk_cell_renderer_text_new();
+    g_signal_connect (G_OBJECT (crd->namerenderer), "edited",
+                      G_CALLBACK (custom_report_name_edited_cb), crd);
+    gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (crd->reportview), -1,
+                                                 "Report Name", crd->namerenderer,
+                                                 "text", COL_NAME,
+                                                 NULL);
+    crd->namecol = gtk_tree_view_get_column (GTK_TREE_VIEW (crd->reportview), VIEW_COL_NAME);
+    gtk_tree_view_column_set_expand (crd->namecol, TRUE);
 
-    gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (crd->reportview), -1, "Report Name", renderer, "text", COL_NAME, NULL);
+    renderer = gtk_cell_renderer_pixbuf_new();
+    g_object_set (G_OBJECT (renderer), "stock-id", GTK_STOCK_EXECUTE, NULL);
+    gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (crd->reportview), -1,
+                                                 "R", renderer,
+                                                 NULL);
+    crd->runcol = gtk_tree_view_get_column (GTK_TREE_VIEW (crd->reportview), VIEW_COL_RUN);
 
+    renderer = gtk_cell_renderer_pixbuf_new();
+    g_object_set (G_OBJECT (renderer), "stock-id", GTK_STOCK_EDIT, NULL);
+    gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (crd->reportview), -1,
+                                                 "E", renderer,
+                                                 NULL);
+    crd->editcol = gtk_tree_view_get_column (GTK_TREE_VIEW (crd->reportview), VIEW_COL_EDIT);
+
+    renderer = gtk_cell_renderer_pixbuf_new();
+    g_object_set (G_OBJECT (renderer), "stock-id", GTK_STOCK_DELETE, NULL);
+    colnum = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (crd->reportview), -1,
+                                                 "D", renderer,
+                                                 NULL);
+    crd->delcol = gtk_tree_view_get_column (GTK_TREE_VIEW (crd->reportview), VIEW_COL_DELETE);
+
     model = create_and_fill_report_list(crd);
 
     gtk_tree_view_set_model (GTK_TREE_VIEW (crd->reportview), model);
@@ -178,21 +227,75 @@
     int report_id;
     GncMainWindow *window = crd->window;
 
-    if (!scm_is_null(guid))
-    {
-        /* this runs the report */
-        report_id = scm_to_int (scm_call_1(make_report, guid));
+    if (scm_is_null(guid))
+        return;
 
-        /* do this *before* the report because sometimes the report
-        	 takes a while... */
-        custom_report_dialog_close_cb(NULL, crd);
+    /* this generates the report */
+    report_id = scm_to_int (scm_call_1(make_report, guid));
 
-        /* display the report */
-        gnc_main_window_open_report(report_id, window);
+    /* do this *before* displaying the report because sometimes that
+         takes a while... */
+    custom_report_dialog_close_cb(NULL, crd);
+
+    /* display the report */
+    gnc_main_window_open_report(report_id, window);
+
+}
+
+/**************************************************************
+ * custom_report_run_report
+ *
+ * this procedure sets up and calls the report on the scheme
+ * side. This is what makes the report actually run.
+ **************************************************************/
+static void
+custom_report_edit_report_name (SCM guid,
+                                CustomReportDialog *crd,
+                                gchar *new_name)
+{
+    SCM rename_report = scm_c_eval_string("gnc:rename-report");
+    SCM new_name_scm = scm_from_locale_string(new_name);
+
+    if (scm_is_null(guid) || !new_name || (*new_name == '\0'))
+        return;
+
+    /* rename the report */
+    scm_call_2(rename_report, guid, new_name_scm);
+    update_report_list(GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(crd->reportview))),
+                       crd);
+
+}
+
+/*********************************************************************
+ * custom_report_delete
+ *
+ * this will delete the report, update the reports list and leave the
+ * dialog active for additional usage.
+ *********************************************************************/
+static void
+custom_report_delete (SCM guid, CustomReportDialog *crd)
+{
+    SCM template_menu_name = scm_c_eval_string("gnc:report-template-menu-name/report-guid");
+    gchar *report_name;
+
+    if (scm_is_null (guid))
+        return;
+
+    report_name = gnc_scm_to_locale_string(scm_call_2(template_menu_name, guid, SCM_BOOL_F));
+
+    /* we must confirm the user wants to delete their precious custom report! */
+    if (gnc_verify_dialog(crd->dialog, FALSE, "Are you sure you want to delete %s?", report_name))
+    {
+        SCM del_report = scm_c_eval_string("gnc:delete-report");
+        scm_call_1(del_report, guid);
+        update_report_list(GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(crd->reportview))),
+                           crd);
     }
+    g_free (report_name);
 }
 
 
+
 /********************************************************************
  * get_custom_report_selection
  *
@@ -262,47 +365,85 @@
 }
 
 
-/*********************************************************************
- * delete_custom_report_clicked_cb
+/**************************************************************
+ * custom_report_list_view_clicked_cb
  *
- * this will delete the report, update the reports list and leave the
- * dialog active for additional usage.
- *********************************************************************/
+ * this callback is called whenever a user clicked somewhere in
+ * the treeview widget. If the click was on an edit or delete
+ * pictogram, the corresponding action will be executed on the
+ * selected row.
+ **************************************************************/
 void
-delete_custom_report_clicked_cb(GtkWidget *button, gpointer data)
+custom_report_list_view_clicked_cb(GtkTreeView *view, GdkEventButton *event, gpointer data)
 {
     CustomReportDialog *crd = data;
+    GtkTreePath *path = NULL;
+    GtkTreeViewColumn *column = NULL;
+    gint cellx, celly;
 
-    SCM template_menu_name = scm_c_eval_string("gnc:report-template-menu-name/report-guid");
-    SCM guid;
+    g_return_if_fail ( view != NULL );
 
-    guid = get_custom_report_selection(crd, _("You must select a report to delete."));
-    if (!scm_is_null(guid))
+    if (gtk_tree_view_get_path_at_pos (view, event->x, event->y,
+                                            &path, &column,
+                                            &cellx, &celly))
     {
-        gchar *report_name;
-
-        report_name = gnc_scm_to_locale_string(scm_call_2(template_menu_name, guid, SCM_BOOL_F));
-
-        /* we must confirm the user wants to delete their precious custom report! */
-        if (gnc_verify_dialog(crd->dialog, FALSE, "Are you sure you want to delete %s?", report_name))
+        if (column == crd->runcol)
         {
-            SCM del_report = scm_c_eval_string("gnc:delete-report");
-            scm_call_1(del_report, guid);
-            update_report_list(GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(crd->reportview))),
-                               crd);
+            SCM guid = get_custom_report_selection(crd, _("You must select a report to run."));
+            custom_report_run_report (guid, crd);
         }
-        g_free (report_name);
+        else if (column == crd->editcol)
+        {
+            g_object_set(G_OBJECT(crd->namerenderer), "editable", TRUE, NULL);
+            gtk_tree_view_set_cursor_on_cell (view, path, crd->namecol,
+                                              crd->namerenderer, TRUE);
+        }
+        else if (column == crd->delcol)
+        {
+            SCM guid = get_custom_report_selection(crd, _("You must select a report to delete."));
+            custom_report_delete (guid, crd);
+        }
     }
 }
 
+void custom_report_name_edited_cb(GtkCellRendererText *renderer, gchar *path, gchar *new_text, gpointer data)
+{
+    CustomReportDialog *crd = data;
+    SCM guid = get_custom_report_selection(crd, _("Unable to change report name."));
+    custom_report_edit_report_name (guid, crd, new_text);
 
-void
-run_custom_report_clicked_cb (GtkWidget* button, gpointer data)
+    g_object_set(G_OBJECT(crd->namerenderer), "editable", FALSE, NULL);
+
+}
+void custom_report_query_tooltip_cb (GtkTreeView  *view,
+        gint        x,
+        gint        y,
+        gboolean    keyboard_mode,
+        GtkTooltip *tooltip,
+        gpointer    data)
 {
     CustomReportDialog *crd = data;
-    SCM guid = get_custom_report_selection(crd, _("You must select a report to run."));
-    custom_report_run_report(guid, crd);
+    GtkTreePath *path = NULL;
+    GtkTreeViewColumn *column = NULL;
+    gint cellx, celly;
 
+    g_return_if_fail ( view != NULL );
+
+    if (gtk_tree_view_get_path_at_pos (view, x, y,
+                                       &path, &column,
+                                       &cellx, &celly))
+    {
+        gtk_tree_view_set_tooltip_cell (view, tooltip, path, column, NULL);
+        if (column == crd->runcol)
+            gtk_tooltip_set_text (tooltip, _("Run preconfigured report"));
+        else if (column == crd->editcol)
+            gtk_tooltip_set_text (tooltip, _("Edit configuration name"));
+        else if (column == crd->delcol)
+            gtk_tooltip_set_text (tooltip, _("Delete preconfigured report"));
+        else
+            gtk_tooltip_set_text (tooltip, NULL);
+    }
+
 }
 
 

Modified: gnucash/trunk/src/report/report-gnome/dialog-custom-report.glade
===================================================================
--- gnucash/trunk/src/report/report-gnome/dialog-custom-report.glade	2013-07-02 11:17:33 UTC (rev 23080)
+++ gnucash/trunk/src/report/report-gnome/dialog-custom-report.glade	2013-07-02 11:17:47 UTC (rev 23081)
@@ -3,154 +3,75 @@
   <requires lib="gtk+" version="2.16"/>
   <!-- interface-naming-policy project-wide -->
   <object class="GtkDialog" id="custom_report_dialog">
-    <property name="can_focus">False</property>
     <property name="border_width">5</property>
+    <property name="title" translatable="yes">Preconfigured reports</property>
     <property name="window_position">center-on-parent</property>
     <property name="type_hint">dialog</property>
     <property name="skip_taskbar_hint">True</property>
     <property name="skip_pager_hint">True</property>
-    <signal name="close" handler="custom_report_dialog_close_cb" swapped="no"/>
+    <signal name="close" handler="custom_report_dialog_close_cb"/>
     <child internal-child="vbox">
       <object class="GtkVBox" id="dialog-vbox1">
         <property name="visible">True</property>
-        <property name="can_focus">False</property>
+        <property name="orientation">vertical</property>
         <property name="spacing">2</property>
-        <child internal-child="action_area">
-          <object class="GtkHButtonBox" id="dialog-action_area1">
+        <child>
+          <object class="GtkScrolledWindow" id="scrolledwindow1">
+            <property name="width_request">300</property>
+            <property name="height_request">150</property>
             <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="layout_style">end</property>
+            <property name="can_focus">True</property>
+            <property name="hscrollbar_policy">automatic</property>
+            <property name="vscrollbar_policy">automatic</property>
             <child>
-              <object class="GtkButton" id="delete_report_button">
-                <property name="label">gtk-delete</property>
+              <object class="GtkTreeView" id="custom_report_list_view">
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
                 <property name="has_tooltip">True</property>
-                <property name="tooltip_markup">Delete the currently selected report</property>
-                <property name="tooltip_text" translatable="yes">Delete the currently selected report</property>
-                <property name="use_action_appearance">False</property>
-                <property name="use_stock">True</property>
-                <signal name="clicked" handler="delete_custom_report_clicked_cb" swapped="no"/>
+                <property name="headers_visible">False</property>
+                <signal name="row_activated" handler="custom_report_list_view_row_activated_cb"/>
+                <signal name="button_release_event" handler="custom_report_list_view_clicked_cb"/>
+                <signal name="query_tooltip" handler="custom_report_query_tooltip_cb"/>
               </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">False</property>
-                <property name="position">0</property>
-              </packing>
             </child>
+          </object>
+          <packing>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child internal-child="action_area">
+          <object class="GtkHButtonBox" id="dialog-action_area1">
+            <property name="visible">True</property>
+            <property name="layout_style">end</property>
             <child>
-              <object class="GtkButton" id="cancel_report_button">
-                <property name="label">gtk-cancel</property>
+              <object class="GtkButton" id="close_report_button">
+                <property name="label">gtk-close</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="receives_default">True</property>
                 <property name="has_tooltip">True</property>
                 <property name="tooltip_markup">Exit the custom report dialog</property>
                 <property name="tooltip_text" translatable="yes">Exit the custom report dialog</property>
-                <property name="use_action_appearance">False</property>
                 <property name="use_stock">True</property>
-                <signal name="clicked" handler="cancel_custom_report_clicked_cb" swapped="no"/>
+                <signal name="clicked" handler="close_custom_report_clicked_cb"/>
               </object>
               <packing>
                 <property name="expand">False</property>
                 <property name="fill">False</property>
-                <property name="position">1</property>
+                <property name="position">0</property>
               </packing>
             </child>
-            <child>
-              <object class="GtkButton" id="run_report_button">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="has_tooltip">True</property>
-                <property name="tooltip_markup">Run the currently selected report</property>
-                <property name="tooltip_text" translatable="yes">Run the currently selected report</property>
-                <property name="use_action_appearance">False</property>
-                <signal name="clicked" handler="run_custom_report_clicked_cb" swapped="no"/>
-                <child>
-                  <object class="GtkAlignment" id="alignment1">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="xscale">0</property>
-                    <property name="yscale">0</property>
-                    <child>
-                      <object class="GtkHBox" id="hbox1">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <property name="spacing">2</property>
-                        <child>
-                          <object class="GtkImage" id="image1">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <property name="stock">gtk-go-forward</property>
-                          </object>
-                          <packing>
-                            <property name="expand">False</property>
-                            <property name="fill">False</property>
-                            <property name="position">0</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <object class="GtkLabel" id="label1">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <property name="label" translatable="yes">_Run</property>
-                            <property name="use_underline">True</property>
-                          </object>
-                          <packing>
-                            <property name="expand">False</property>
-                            <property name="fill">False</property>
-                            <property name="position">1</property>
-                          </packing>
-                        </child>
-                      </object>
-                    </child>
-                  </object>
-                </child>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">False</property>
-                <property name="position">2</property>
-              </packing>
-            </child>
           </object>
           <packing>
             <property name="expand">False</property>
-            <property name="fill">True</property>
             <property name="pack_type">end</property>
             <property name="position">0</property>
           </packing>
         </child>
-        <child>
-          <object class="GtkScrolledWindow" id="scrolledwindow1">
-            <property name="height_request">150</property>
-            <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="hscrollbar_policy">automatic</property>
-            <property name="vscrollbar_policy">automatic</property>
-            <child>
-              <object class="GtkTreeView" id="custom_report_list_view">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="headers_visible">False</property>
-                <signal name="row-activated" handler="custom_report_list_view_row_activated_cb" swapped="no"/>
-              </object>
-            </child>
-          </object>
-          <packing>
-            <property name="expand">True</property>
-            <property name="fill">True</property>
-            <property name="position">1</property>
-          </packing>
-        </child>
       </object>
     </child>
     <action-widgets>
-      <action-widget response="0">delete_report_button</action-widget>
-      <action-widget response="0">cancel_report_button</action-widget>
-      <action-widget response="0">run_report_button</action-widget>
+      <action-widget response="0">close_report_button</action-widget>
     </action-widgets>
   </object>
 </interface>



More information about the gnucash-changes mailing list