r19123 - gnucash/trunk - Bug #612212: Provide a method to set the default budget
Christian Stimming
cstim at code.gnucash.org
Thu May 6 05:01:47 EDT 2010
Author: cstim
Date: 2010-05-06 05:01:46 -0400 (Thu, 06 May 2010)
New Revision: 19123
Trac: http://svn.gnucash.org/trac/changeset/19123
Modified:
gnucash/trunk/make-gnucash-potfiles.in
gnucash/trunk/po/POTFILES.in
gnucash/trunk/src/app-utils/app-utils.scm
gnucash/trunk/src/app-utils/options.scm
gnucash/trunk/src/business/business-utils/business-prefs.scm
gnucash/trunk/src/business/business-utils/business-utils.scm
gnucash/trunk/src/engine/engine.i
gnucash/trunk/src/engine/gnc-budget.c
gnucash/trunk/src/libqof/qof/qofbook.c
gnucash/trunk/src/libqof/qof/qofbookslots.h
Log:
Bug #612212: Provide a method to set the default budget
Patch by Jeff Kletsky.
(Cstim: Accepted even though string freeze is in effect because it was
submitted before the freeze. Also, the string additions are very minor.)
Summary of Changes:
* Initial story related to providing default budget control
* Add a "Budgeting" tab to the book-level preferences dialog
* Add a "Default Budget" selector to the "Budgeting" tab
* Modify gnc_budget_get_default() to
* Respect the new KVP, if present
* Fall back to 2.2.x behavior, if not present
* Modify gnc:make-budget-option
* Reformatted for readability with additional comments
* Default is now "#f" so that selected value is always saved
Otherwise, if selection happened to be the current default
and the default was later changed, the report would change
* getter, setter, and generate-restore-form all now consistent
* setter now always takes a budget object
* generate-restore-form does not rely on "hack" in setter that
previously allowed either a budget object or a GUID string
This is a different fix for 603215 -- see Known Issues
* Provide translation support for "Trading Acccounts" (and "Budgeting")
* Refactor #define names for consistency and extensibility
* KVP_OPTION_PATH for consistency with Guile usage
* OPTION_SECTION_blahblah
* OPTION_NAME_blahblah
* Modify qofbookslots.h to be "SWIG-aware"
* Pick up qofbookslots.h in make-gnucash-potfiles.in and po/POTFILES.in
Known Issues:
* There is no selection (yet) for "Use default budget" so changing the
default budget and reloading a report does not change the budget used
* setter is no more robust to "bad" values than in previous code
* Budget reports created with 2.3.x after r18528 (between 2.3.8 and
2.3.9) may not load or re-render as they relied on the setter taking
either a budget object or a GUID as a string This should not impact
any 2.2.x users as nothing was saved under 2.2.x related to the
default budget. This can be resolved through removing the option
restore code in ~/.gnucash/saved-reports-2.4 and, if affected reports
were open, in ~/.gnucash/books/<name_of_book>
* Budget reports prior to r18528 did not save budget selection (603215)
Modified: gnucash/trunk/make-gnucash-potfiles.in
===================================================================
--- gnucash/trunk/make-gnucash-potfiles.in 2010-05-06 08:36:59 UTC (rev 19122)
+++ gnucash/trunk/make-gnucash-potfiles.in 2010-05-06 09:01:46 UTC (rev 19123)
@@ -52,5 +52,6 @@
# These are also added, even though they are outside of src/
print "src/gnome/gnucash.desktop.in.in\n";
print "src/libqof/qof/gnc-date.c\n";
+print "src/libqof/qof/qofbookslots.h\n";
print "intl-scm/guile-strings.c\n";
print "doc/tip_of_the_day.list.in\n";
Modified: gnucash/trunk/po/POTFILES.in
===================================================================
--- gnucash/trunk/po/POTFILES.in 2010-05-06 08:36:59 UTC (rev 19122)
+++ gnucash/trunk/po/POTFILES.in 2010-05-06 09:01:46 UTC (rev 19123)
@@ -521,5 +521,6 @@
src/gnome/gnucash.desktop.in.in
src/libqof/backend/file/qsf-backend.c
src/libqof/qof/gnc-date.c
+src/libqof/qof/qofbookslots.h
intl-scm/guile-strings.c
doc/tip_of_the_day.list.in
Modified: gnucash/trunk/src/app-utils/app-utils.scm
===================================================================
--- gnucash/trunk/src/app-utils/app-utils.scm 2010-05-06 08:36:59 UTC (rev 19122)
+++ gnucash/trunk/src/app-utils/app-utils.scm 2010-05-06 09:01:46 UTC (rev 19123)
@@ -257,7 +257,7 @@
(export simple-obj-from-list)
(export make-simple-obj)
-(define gnc:*kvp-option-path* (list BOOK-OPTIONS-NAME))
+(define gnc:*kvp-option-path* (list KVP-OPTION-PATH))
(export gnc:*kvp-option-path*)
(load-from-path "c-interface.scm")
Modified: gnucash/trunk/src/app-utils/options.scm
===================================================================
--- gnucash/trunk/src/app-utils/options.scm 2010-05-06 08:36:59 UTC (rev 19122)
+++ gnucash/trunk/src/app-utils/options.scm 2010-05-06 09:01:46 UTC (rev 19123)
@@ -304,52 +304,96 @@
#f #f #f #f)))
;; budget option
-;; TODO: need to double-check this proc
+;; TODO: need to double-check this proc (dates back to r11545 or eariler)
+;;
+;; Always takes/returns a budget
+;; Stores the GUID in the KVP
+;;
(define (gnc:make-budget-option
section
name
sort-tag
documentation-string)
- (define (budget->guid budget)
- (cond ((eq? budget #f) #f)
- ((string? budget) budget)
- (else (gncBudgetGetGUID budget))))
+ (let* ((initial-budget (gnc-budget-get-default (gnc-get-current-book)))
+ (selection-budget initial-budget)
+ )
- (define (guid->budget budget)
- (if (string? budget)
- (gnc-budget-lookup budget (gnc-get-current-book))
- budget))
-
- (let* ((default-value (gnc-budget-get-default (gnc-get-current-book)))
- (value (budget->guid default-value))
- (option-set #f)
- (value->string (lambda ()
- (string-append "'" (gnc:value->string value))))
- )
(gnc:make-option
- section name sort-tag 'budget documentation-string
- ;; the getter should always return a budget pointer
- (lambda () (guid->budget ;; getter
- (if option-set
- value
- default-value))
- )
+ section
+ name
+ sort-tag
+ 'budget
+ documentation-string
- (lambda (x) (set! value (budget->guid x))
- (set! option-set #t)) ;; setter
+ ;; getter -- Return a budget pointer
+ (lambda ()
+ selection-budget)
+
+ ;; setter -- takes a budget
+ (lambda (x)
+ (set! selection-budget x))
+
+ ;; default-getter
+ ;; Default now is #f so saving is independent of book-level default
(lambda ()
- (guid->budget
- (gnc-budget-get-default (gnc-get-current-book)))) ;; default-getter
- (gnc:restore-form-generator value->string) ;; ??
- (lambda (f p) (kvp-frame-set-slot-path-gslist f value p))
+ #f)
+
+ ;; generate-restore-form
+ ;; "return 'ascii represention of a function'
+ ;; that will set the option passed as its lone parameter
+ ;; to the value it was when the picker was first displayed"
+ ;;
+ ;; *This* is used to restore reports, not the KVP -- and is stored as text
+ ;; This does not run in closure with direct access to the option's
+ ;; internal variables, so the setter generally gets used
+ (lambda ()
+ (string-append
+ "(lambda (option) "
+ "(if option ((gnc:option-setter option) "
+ "(gnc-budget-lookup "
+ (gnc:value->string (gncBudgetGetGUID selection-budget))
+ " (gnc-get-current-book)))))"))
+
+ ;; scm->kvp -- commit the change
+ ;; f -- kvp-frame; p -- key-path
+ (lambda (f p)
+ (kvp-frame-set-slot-path-gslist
+ f (gncBudgetGetGUID selection-budget) p))
+
+ ;; kvp->scm -- get the stored value
(lambda (f p)
(let ((v (kvp-frame-get-slot-path-gslist f p)))
(if (and v (string? v))
- (set! value v))))
- (lambda (x) (list #t x)) ;; value-validator
- #f #f #f #f)))
+ (begin
+ (set! selection-budget (gnc-budget-lookup v (gnc-get-current-book)))))))
+ ;; value-validator -- returns (#t value) or (#f "failure message")
+ ;; As no user-generated input, this legacy hard-wire is probably ok
+ (lambda (x)
+ (list #t x))
+
+ ;; option-data
+ #f
+
+ ;; option-data-fns -- used for multi-pick (this isn't one), or #f
+ ;; Vector of five functions
+ ;; 1) () => number of choices
+ ;; 2) (n) => key for the nth choice
+ ;; 3) (n) => string for the nth choice
+ ;; 4) (n) => description for the nth choice
+ ;; 5) (key) => n (assuming this is the reverse key lookup)
+ #f
+
+ ;; strings-getter -- list of all translatable strings in the option
+ #f
+
+ ;; options-widget-changed-proc -- callback for what it sounds like
+ #f
+
+ ))) ;; completes gnc:make-budget-option
+
+
;; commodity options use a specialized widget for entering commodities
;; in the GUI implementation.
(define (gnc:make-commodity-option
Modified: gnucash/trunk/src/business/business-utils/business-prefs.scm
===================================================================
--- gnucash/trunk/src/business/business-utils/business-prefs.scm 2010-05-06 08:36:59 UTC (rev 19122)
+++ gnucash/trunk/src/business/business-utils/business-prefs.scm 2010-05-06 09:01:46 UTC (rev 19123)
@@ -84,9 +84,18 @@
(reg-option
(gnc:make-simple-boolean-option
- gnc:*book-label* gnc:*trading-accounts*
- "a" (N_ "True if trading accounts should be used for transactions involving more than one commodity")
+ gnc:*option-section-accounts* gnc:*option-name-trading-accounts*
+ "a" (N_ "Check to have trading accounts used for transactions involving more than one currency or commodity")
#f))
+
+ ;; Budgeting Tab
+
+ (reg-option
+ (gnc:make-budget-option
+ gnc:*option-section-budgeting* gnc:*option-name-default-budget*
+ "a" (N_ "Budget to be used when none has been otherwise specified")))
+
)
+
(gnc-register-kvp-option-generator QOF-ID-BOOK-SCM book-options-generator)
Modified: gnucash/trunk/src/business/business-utils/business-utils.scm
===================================================================
--- gnucash/trunk/src/business/business-utils/business-utils.scm 2010-05-06 08:36:59 UTC (rev 19122)
+++ gnucash/trunk/src/business/business-utils/business-utils.scm 2010-05-06 09:01:46 UTC (rev 19123)
@@ -18,10 +18,15 @@
gnc:*company-phone* gnc:*company-fax* gnc:*company-url*
gnc:*company-email* gnc:*company-contact*)
-(define gnc:*book-label* ACCOUNT-OPTIONS-SECTION)
-(define gnc:*trading-accounts* TRADING-ACCOUNTS-OPTION)
+(define gnc:*option-section-accounts* OPTION-SECTION-ACCOUNTS)
+(define gnc:*option-name-trading-accounts* OPTION-NAME-TRADING-ACCOUNTS)
-(export gnc:*book-label* gnc:*trading-accounts*)
+(export gnc:*option-section-accounts* gnc:*option-name-trading-accounts*)
+(define gnc:*option-section-budgeting* OPTION-SECTION-BUDGETING)
+(define gnc:*option-name-default-budget* OPTION-NAME-DEFAULT-BUDGET)
+
+(export gnc:*option-section-budgeting* gnc:*option-name-default-budget*)
+
(load-from-path "business-options.scm")
(load-from-path "business-prefs.scm")
Modified: gnucash/trunk/src/engine/engine.i
===================================================================
--- gnucash/trunk/src/engine/engine.i 2010-05-06 08:36:59 UTC (rev 19122)
+++ gnucash/trunk/src/engine/engine.i 2010-05-06 09:01:46 UTC (rev 19123)
@@ -297,10 +297,14 @@
SET_ENUM("TRANS-DESCRIPTION");
SET_ENUM("TRANS-NUM");
- SET_ENUM("BOOK-OPTIONS-NAME");
- SET_ENUM("ACCOUNT-OPTIONS-SECTION");
- SET_ENUM("TRADING-ACCOUNTS-OPTION");
+ SET_ENUM("KVP-OPTION-PATH");
+ SET_ENUM("OPTION-SECTION-ACCOUNTS");
+ SET_ENUM("OPTION-NAME-TRADING-ACCOUNTS");
+
+ SET_ENUM("OPTION-SECTION-BUDGETING");
+ SET_ENUM("OPTION-NAME-DEFAULT-BUDGET");
+
SET_ENUM("ACCOUNT-CODE-"); /* sic */
#undefine SET_ENUM
Modified: gnucash/trunk/src/engine/gnc-budget.c
===================================================================
--- gnucash/trunk/src/engine/gnc-budget.c 2010-05-06 08:36:59 UTC (rev 19122)
+++ gnucash/trunk/src/engine/gnc-budget.c 2010-05-06 09:01:46 UTC (rev 19123)
@@ -28,6 +28,7 @@
#include <glib/gi18n.h>
#include <time.h>
#include "qof.h"
+#include "qofbookslots.h"
#include "Account.h"
@@ -596,13 +597,38 @@
{
QofCollection *col;
GncBudget *bgt = NULL;
+ kvp_value *kvp_default_budget;
+ const GncGUID *default_budget_guid;
g_return_val_if_fail(book, NULL);
- col = qof_book_get_collection(book, GNC_ID_BUDGET);
- if (qof_collection_count(col) > 0)
- {
- qof_collection_foreach(col, just_get_one, &bgt);
+
+ /* See if there is a budget selected in the KVP perferences */
+
+ kvp_default_budget = kvp_frame_get_slot_path(qof_book_get_slots (book),
+ KVP_OPTION_PATH,
+ OPTION_SECTION_BUDGETING,
+ OPTION_NAME_DEFAULT_BUDGET,
+ NULL);
+
+ if (kvp_default_budget != NULL ) {
+ default_budget_guid = kvp_value_get_guid(kvp_default_budget);
+ if (default_budget_guid != NULL) {
+ col = qof_book_get_collection(book, GNC_ID_BUDGET);
+ bgt = (GncBudget *) qof_collection_lookup_entity(col,
+ default_budget_guid);
+ }
}
+
+ /* Revert to 2.2.x behavior if there is no defined budget in KVP */
+
+ if ( bgt == NULL ) {
+ col = qof_book_get_collection(book, GNC_ID_BUDGET);
+ if (qof_collection_count(col) > 0)
+ {
+ qof_collection_foreach(col, just_get_one, &bgt);
+ }
+ }
+
return bgt;
}
Modified: gnucash/trunk/src/libqof/qof/qofbook.c
===================================================================
--- gnucash/trunk/src/libqof/qof/qofbook.c 2010-05-06 08:36:59 UTC (rev 19122)
+++ gnucash/trunk/src/libqof/qof/qofbook.c 2010-05-06 09:01:46 UTC (rev 19123)
@@ -457,11 +457,11 @@
const char *opt;
kvp_value *kvp_val;
-
kvp_val = kvp_frame_get_slot_path (qof_book_get_slots (book),
- BOOK_OPTIONS_NAME,
- ACCOUNT_OPTIONS_SECTION,
- TRADING_ACCOUNTS_OPTION, NULL);
+ KVP_OPTION_PATH,
+ OPTION_SECTION_ACCOUNTS,
+ OPTION_NAME_TRADING_ACCOUNTS,
+ NULL);
if (kvp_val == NULL)
return FALSE;
Modified: gnucash/trunk/src/libqof/qof/qofbookslots.h
===================================================================
--- gnucash/trunk/src/libqof/qof/qofbookslots.h 2010-05-06 08:36:59 UTC (rev 19122)
+++ gnucash/trunk/src/libqof/qof/qofbookslots.h 2010-05-06 09:01:46 UTC (rev 19123)
@@ -19,6 +19,12 @@
* *
\********************************************************************/
+#ifndef SWIG /* swig doesn't see N_() as a string constant */
+#include <glib/gi18n.h>
+#else
+#define N_(string) string
+#endif
+
/** @name Book parameter names
* These define the names used for the slots used to store book level parameters.
@@ -26,8 +32,48 @@
* Scheme code too.
@{
*/
-#define BOOK_OPTIONS_NAME "options"
-#define ACCOUNT_OPTIONS_SECTION "Accounts"
-#define TRADING_ACCOUNTS_OPTION "Trading Accounts"
+
+/*
+ * See also SET_ENUM() in src/engine/engine.i
+ *
+ * SOME_DEFINED_NAME gets mapped into SOME-DEFINED-NAME by SWIG
+ * http://www.swig.org/Doc1.3/Guile.html#Guile_nn10
+ */
+
+
+/*
+ * gnc:*kvp-option-path* is used to refer to the kvp frame
+ * in which book-level options are stored.
+ * It is tied from this C #define in
+ * src/app-utils/app-utils.scm
+ * and is extensively used in
+ * src/app-utils/option-util.c
+ * src/gnome-utils/gnome-utils.scm
+ * various reports
+ */
+
+#define KVP_OPTION_PATH "options"
+
+/*
+ * Various option sections and options within those sections
+ * The untranslated string is used for the key in the KVP
+ * The translated string appears as the tab name and as the
+ * text associated with the option selector on the tab
+ */
+
+#define OPTION_SECTION_ACCOUNTS N_("Accounts")
+#define OPTION_NAME_TRADING_ACCOUNTS N_("Use Trading Accounts")
+
+#define OPTION_SECTION_BUDGETING N_("Budgeting")
+#define OPTION_NAME_DEFAULT_BUDGET N_("Default Budget")
+
/** @} */
+
+/* For the grep-happy:
+ * KVP-OPTION-PATH
+ * OPTION-SECTION-ACCOUNTS
+ * OPTION-NAME-TRADING-ACCOUNTS
+ * OPTION-SECTION-BUDGETING
+ * OPTION-NAME-DEFAULT-BUDGET
+ */
More information about the gnucash-changes
mailing list