r22312 - gnucash/trunk/src/gnome - Bug #463969 - Allow Selection of Multiple Transactions During Reconcile
Geert Janssens
gjanssens at code.gnucash.org
Wed Aug 15 05:55:00 EDT 2012
Author: gjanssens
Date: 2012-08-15 05:54:59 -0400 (Wed, 15 Aug 2012)
New Revision: 22312
Trac: http://svn.gnucash.org/trac/changeset/22312
Modified:
gnucash/trunk/src/gnome/reconcile-view.c
gnucash/trunk/src/gnome/reconcile-view.h
gnucash/trunk/src/gnome/ui/gnc-reconcile-window-ui.xml
gnucash/trunk/src/gnome/window-reconcile.c
Log:
Bug #463969 - Allow Selection of Multiple Transactions During Reconcile
Bug #628402 - Ctrl-F in Reconcile doesn't invoke search, but (F)inishes
the reconciliation
Author: Robert Fewell <14ubobit at gmail.com>
Modified: gnucash/trunk/src/gnome/reconcile-view.c
===================================================================
--- gnucash/trunk/src/gnome/reconcile-view.c 2012-08-15 08:37:34 UTC (rev 22311)
+++ gnucash/trunk/src/gnome/reconcile-view.c 2012-08-15 09:54:59 UTC (rev 22312)
@@ -87,7 +87,6 @@
"GncReconcileView",
&gnc_reconcile_view_info, 0);
}
-
return gnc_reconcile_view_type;
}
@@ -122,7 +121,7 @@
/* Set the selection method */
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (qview));
- gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE);
+ gtk_tree_selection_set_mode (selection, GTK_SELECTION_MULTIPLE);
/* Now set up the signals for the QueryView */
g_signal_connect (G_OBJECT (qview), "column_toggled",
@@ -135,6 +134,7 @@
G_CALLBACK(gnc_reconcile_view_key_press_cb), view);
}
+
GtkWidget *
gnc_reconcile_view_new (Account *account, GNCReconcileViewType type,
time_t statement_date)
@@ -420,7 +420,7 @@
gpointer user_data)
{
GNCReconcileView *view;
-
+ /* item is the entry */
g_return_if_fail (user_data);
g_return_if_fail (GNC_IS_QUERY_VIEW (qview));
@@ -437,7 +437,7 @@
gpointer user_data)
{
GNCReconcileView *view;
-
+ /* item is the number of selected entries */
g_return_if_fail(user_data);
g_return_if_fail(GNC_IS_QUERY_VIEW(qview));
@@ -448,7 +448,100 @@
}
+void
+gnc_reconcile_view_set_list ( GNCReconcileView *view, gboolean reconcile)
+{
+ GNCQueryView *qview = GNC_QUERY_VIEW(view);
+ GtkTreeSelection *selection;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ gpointer entry;
+ gboolean toggled;
+ GList *node;
+ GList *list_of_rows;
+
+ model = gtk_tree_view_get_model (GTK_TREE_VIEW (qview));
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (qview));
+ list_of_rows = gtk_tree_selection_get_selected_rows (selection, &model);
+
+ /* We get a list of TreePaths */
+ for(node = list_of_rows; node; node = node->next)
+ {
+ GtkTreeIter iter;
+ if(gtk_tree_model_get_iter(model, &iter, node->data))
+ {
+ /* now iter is a valid row iterator */
+ gtk_tree_model_get (model, &iter, 0, &entry, -1);
+ gtk_tree_model_get (model, &iter, 5, &toggled, -1);
+
+ if(reconcile)
+ gtk_list_store_set (GTK_LIST_STORE (model), &iter, 5, 1, -1);
+ else
+ gtk_list_store_set (GTK_LIST_STORE (model), &iter, 5, 0, -1);
+
+ if(reconcile != toggled)
+ gnc_reconcile_view_toggle (view, entry);
+ }
+ gtk_tree_path_free(node->data);
+ }
+ g_list_free(list_of_rows);
+}
+
+
+gint
+gnc_reconcile_view_num_selected (GNCReconcileView *view )
+{
+ GNCQueryView *qview = GNC_QUERY_VIEW(view);
+ GtkTreeSelection *selection;
+
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (qview));
+ return gtk_tree_selection_count_selected_rows (selection);
+}
+
+
static gboolean
+gnc_reconcile_view_set_toggle (GNCReconcileView *view)
+{
+ GNCQueryView *qview = GNC_QUERY_VIEW(view);
+ GtkTreeSelection *selection;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ gboolean toggled;
+ GList *node;
+ GList *list_of_rows;
+ gint num_toggled = 0;
+ gint num_selected = 0;
+
+ model = gtk_tree_view_get_model (GTK_TREE_VIEW (qview));
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (qview));
+ list_of_rows = gtk_tree_selection_get_selected_rows (selection, &model);
+ num_selected = gtk_tree_selection_count_selected_rows (selection);
+
+ /* We get a list of TreePaths */
+ for(node = list_of_rows; node; node = node->next)
+ {
+ GtkTreeIter iter;
+ toggled = FALSE;
+ if(gtk_tree_model_get_iter(model, &iter, node->data))
+ {
+ /* now iter is a valid row iterator */
+ gtk_tree_model_get (model, &iter, 5, &toggled, -1);
+
+ if(toggled)
+ num_toggled++;
+ }
+ gtk_tree_path_free(node->data);
+ }
+ g_list_free(list_of_rows);
+
+ if(num_toggled == num_selected)
+ return FALSE;
+ else
+ return TRUE;
+}
+
+
+static gboolean
gnc_reconcile_view_key_press_cb (GtkWidget *widget, GdkEventKey *event,
gpointer user_data)
{
@@ -464,34 +557,45 @@
case GDK_space:
g_signal_stop_emission_by_name (widget, "key_press_event");
- entry = gnc_query_view_get_selected_entry (qview);
+ if (gnc_reconcile_view_num_selected (view) == 1)
+ {
- model = gtk_tree_view_get_model (GTK_TREE_VIEW (qview));
- valid = gtk_tree_model_get_iter_first (model, &iter);
+ entry = gnc_query_view_get_selected_entry (qview);
- while (valid)
- {
- /* Walk through the list, reading each row, column 0
- has a pointer to the required entry */
- gtk_tree_model_get (model, &iter, 0, &pointer, -1);
+ model = gtk_tree_view_get_model (GTK_TREE_VIEW (qview));
+ valid = gtk_tree_model_get_iter_first (model, &iter);
- if(pointer == entry)
+ while (valid)
{
- /* Column 5 is the toggle column */
- gtk_tree_model_get (model, &iter, 5, &toggle, -1);
+ /* Walk through the list, reading each row, column 0
+ has a pointer to the required entry */
+ gtk_tree_model_get (model, &iter, 0, &pointer, -1);
- if(toggle)
- gtk_list_store_set (GTK_LIST_STORE (model), &iter, 5, 0, -1);
- else
- gtk_list_store_set (GTK_LIST_STORE (model), &iter, 5, 1, -1);
+ if(pointer == entry)
+ {
+ /* Column 5 is the toggle column */
+ gtk_tree_model_get (model, &iter, 5, &toggle, -1);
+
+ if(toggle)
+ gtk_list_store_set (GTK_LIST_STORE (model), &iter, 5, 0, -1);
+ else
+ gtk_list_store_set (GTK_LIST_STORE (model), &iter, 5, 1, -1);
+ }
+ valid = gtk_tree_model_iter_next (model, &iter);
}
- valid = gtk_tree_model_iter_next (model, &iter);
+ gnc_reconcile_view_toggle (view, entry);
+
+ return TRUE;
+ break;
}
- gnc_reconcile_view_toggle (view, entry);
+ else
+ {
+ toggle = gnc_reconcile_view_set_toggle (view);
+ gnc_reconcile_view_set_list (view, toggle);
+ return TRUE;
+ break;
+ }
- return TRUE;
- break;
-
default:
return FALSE;
}
@@ -508,7 +612,6 @@
g_hash_table_destroy (view->reconciled);
view->reconciled = NULL;
}
-
G_OBJECT_CLASS (parent_class)->finalize (object);
}
Modified: gnucash/trunk/src/gnome/reconcile-view.h
===================================================================
--- gnucash/trunk/src/gnome/reconcile-view.h 2012-08-15 08:37:34 UTC (rev 22311)
+++ gnucash/trunk/src/gnome/reconcile-view.h 2012-08-15 09:54:59 UTC (rev 22312)
@@ -64,7 +64,7 @@
GtkTreeViewClass parent_class;
void (*toggle_reconciled) (GNCReconcileView *view, Split *split);
- void (*line_selected) (GNCReconcileView *view, Split *split);
+ void (*line_selected) (GNCReconcileView *view, gpointer item);
void (*double_click_split) (GNCReconcileView *view, Split *split);
} GNCReconcileViewClass;
@@ -82,8 +82,12 @@
gint gnc_reconcile_view_get_num_splits (GNCReconcileView *view);
+gint gnc_reconcile_view_num_selected (GNCReconcileView *view );
+
Split * gnc_reconcile_view_get_current_split (GNCReconcileView *view);
+void gnc_reconcile_view_set_list (GNCReconcileView *view, gboolean reconcile);
+
void gnc_reconcile_view_refresh (GNCReconcileView *view);
gnc_numeric gnc_reconcile_view_reconciled_balance (GNCReconcileView *view);
Modified: gnucash/trunk/src/gnome/ui/gnc-reconcile-window-ui.xml
===================================================================
--- gnucash/trunk/src/gnome/ui/gnc-reconcile-window-ui.xml 2012-08-15 08:37:34 UTC (rev 22311)
+++ gnucash/trunk/src/gnome/ui/gnc-reconcile-window-ui.xml 2012-08-15 09:54:59 UTC (rev 22312)
@@ -21,6 +21,8 @@
<menuitem name="TransNew" action="TransNewAction"/>
<menuitem name="TransBalance" action="TransBalanceAction"/>
<menuitem name="TransEdit" action="TransEditAction"/>
+ <menuitem name="TransRec" action="TransRecAction"/>
+ <menuitem name="TransUnRec" action="TransUnRecAction"/>
<menuitem name="TransDelete" action="TransDeleteAction"/>
</menu>
@@ -32,6 +34,8 @@
<popup name="MainPopup" action="FakeToplevel">
<menuitem name="TransNew" action="TransNewAction"/>
<menuitem name="TransEdit" action="TransEditAction"/>
+ <menuitem name="TransRec" action="TransRecAction"/>
+ <menuitem name="TransUnRec" action="TransUnRecAction"/>
<menuitem name="TransDelete" action="TransDeleteAction"/>
</popup>
@@ -39,6 +43,8 @@
<toolitem name="TransNew" action="TransNewAction"/>
<toolitem name="TransBalance" action="TransBalanceAction"/>
<toolitem name="TransEdit" action="TransEditAction"/>
+ <toolitem name="TransRec" action="TransRecAction"/>
+ <toolitem name="TransUnRec" action="TransUnRecAction"/>
<toolitem name="TransDelete" action="TransDeleteAction"/>
<separator name="ToolbarSep2"/>
<toolitem name="AccountOpenAccount" action="AccountOpenAccountAction"/>
Modified: gnucash/trunk/src/gnome/window-reconcile.c
===================================================================
--- gnucash/trunk/src/gnome/window-reconcile.c 2012-08-15 08:37:34 UTC (rev 22311)
+++ gnucash/trunk/src/gnome/window-reconcile.c 2012-08-15 09:54:59 UTC (rev 22312)
@@ -816,11 +816,11 @@
GtkAction *action;
view = GNC_RECONCILE_VIEW(recnData->debit);
- if (gnc_reconcile_view_get_current_split(view) != NULL)
+ if (gnc_reconcile_view_num_selected(view) == 1)
sensitive = TRUE;
view = GNC_RECONCILE_VIEW(recnData->credit);
- if (gnc_reconcile_view_get_current_split(view) != NULL)
+ if (gnc_reconcile_view_num_selected(view) == 1)
sensitive = TRUE;
action = gtk_action_group_get_action (recnData->action_group,
@@ -829,11 +829,28 @@
action = gtk_action_group_get_action (recnData->action_group,
"TransDeleteAction");
gtk_action_set_sensitive(action, sensitive);
+
+ sensitive = FALSE;
+
+ view = GNC_RECONCILE_VIEW(recnData->debit);
+ if (gnc_reconcile_view_num_selected(view) > 0)
+ sensitive = TRUE;
+
+ view = GNC_RECONCILE_VIEW(recnData->credit);
+ if (gnc_reconcile_view_num_selected(view) > 0)
+ sensitive = TRUE;
+
+ action = gtk_action_group_get_action (recnData->action_group,
+ "TransRecAction");
+ gtk_action_set_sensitive(action, sensitive);
+ action = gtk_action_group_get_action (recnData->action_group,
+ "TransUnRecAction");
+ gtk_action_set_sensitive(action, sensitive);
}
static void
-gnc_reconcile_window_list_cb(GNCReconcileView *view, Split *split,
+gnc_reconcile_window_toggled_cb(GNCReconcileView *view, Split *split,
gpointer data)
{
RecnWindow *recnData = data;
@@ -843,7 +860,7 @@
static void
-gnc_reconcile_window_row_cb(GNCReconcileView *view, Split *split,
+gnc_reconcile_window_row_cb(GNCReconcileView *view, gpointer item,
gpointer data)
{
RecnWindow *recnData = data;
@@ -1090,7 +1107,7 @@
*list_save = view;
g_signal_connect(view, "toggle_reconciled",
- G_CALLBACK(gnc_reconcile_window_list_cb),
+ G_CALLBACK(gnc_reconcile_window_toggled_cb),
recnData);
g_signal_connect(view, "line_selected",
G_CALLBACK(gnc_reconcile_window_row_cb),
@@ -1222,6 +1239,34 @@
static void
+gnc_ui_reconcile_window_rec_cb(GtkButton *button, gpointer data)
+{
+ RecnWindow *recnData = data;
+ GNCReconcileView *debit, *credit;
+
+ debit = GNC_RECONCILE_VIEW(recnData->debit);
+ credit = GNC_RECONCILE_VIEW(recnData->credit);
+
+ gnc_reconcile_view_set_list (debit, TRUE);
+ gnc_reconcile_view_set_list (credit, TRUE);
+}
+
+
+static void
+gnc_ui_reconcile_window_unrec_cb(GtkButton *button, gpointer data)
+{
+ RecnWindow *recnData = data;
+ GNCReconcileView *debit, *credit;
+
+ debit = GNC_RECONCILE_VIEW(recnData->debit);
+ credit = GNC_RECONCILE_VIEW(recnData->credit);
+
+ gnc_reconcile_view_set_list (debit, FALSE);
+ gnc_reconcile_view_set_list (credit, FALSE);
+}
+
+
+static void
gnc_ui_reconcile_window_delete_cb(GtkButton *button, gpointer data)
{
RecnWindow *recnData = data;
@@ -2179,7 +2224,7 @@
G_CALLBACK (gnc_ui_reconcile_window_change_cb)
},
{
- "RecnFinishAction", GTK_STOCK_YES, N_("_Finish"), "<control>f",
+ "RecnFinishAction", GTK_STOCK_YES, N_("_Finish"), "<control>w",
N_("Finish the reconciliation of this account"),
G_CALLBACK(recnFinishCB)
},
@@ -2240,6 +2285,16 @@
N_("Delete the selected transaction"),
G_CALLBACK(gnc_ui_reconcile_window_delete_cb)
},
+ {
+ "TransRecAction", GTK_STOCK_APPLY, N_("_Reconcile Selection"), "<control>r",
+ N_("Reconcile the selected transactions"),
+ G_CALLBACK(gnc_ui_reconcile_window_rec_cb)
+ },
+ {
+ "TransUnRecAction", GTK_STOCK_CLEAR, N_("_Unreconcile Selection"), "<control>u",
+ N_("Unreconcile the selected transactions"),
+ G_CALLBACK(gnc_ui_reconcile_window_unrec_cb)
+ },
/* Help menu */
More information about the gnucash-changes
mailing list