Phil,

Quoting Phil Longstaff <[email protected]>:

A number of bugs in bugzilla reference the idea of splitting global preferences from per-file preferences, so I thought I would take a stab at this. Here's my design idea, and I'm looking for any response/feedback:

1) Preferences are currently stored in gconf. Global preferences will continue to be stored there, but local preferences will be stored as kvp entries of the QofBook. This is per-file, uses existing mechanisms (I'll need to check that the xml/dbi backends load/save book kvp entries) and fits with the gconf/preferences hierarchical nature.

Note that there are really three categories for preferences/properties:

1) Global for a user (Applies for a specific user to all data files)
2) Specific to a data file (Applies to a specific data file for all users)
3) Per-user, Per-Datafile (Applies to a specific user using a specific
  data file).

Your proposal only touches #1 and #2, but I do think we need to handle
#3 as well.  For example, "current open reports" probably belongs in
this category, and I'm sure we can come up with more values that
belong here instead of #1 or #2.

Also note that we do have the File -> Properties which are like preferences
and stored in the Book KVP.

2) Over the past few years, I've grown to really like the interface idea when two pieces of code need to interact. It allows one module to use another module's services while only having a dependence on the interface, not the implementation behind it. Therefore, I'll create a GncPrefs GObject-based interface (GInterface - is that the right term?) with get_string/boolean/double/int and set_string/boolean/double/int methods.

Sounds like a good approach to me.

3) A GncPrefsFromGconf GObject will be created and will implement GncPrefs. This object will interact with gconf (will replace the gnc_gconf_xxx() functions).

4) A GncPrefsFromQofBook GObject will be created and will implement GncPrefs. For a set operation, this will store the value into the QofBook kvp frames. For a get operation, this will look for the value in the QofBook kvp frames. If found, it will be returned. If not found, it will relay the request to the global prefs to get the value from gconf and then will set the value in the QofBook kvp frames. This will handle transfering values which are currently global and make them local. If the key is not found globally, a default value will be returned.

I'm wondering if it would be better to do the migration only once,
like when the data file is loaded.  If the Book Prefs KVP doesn't exist
prompt the user to upgrade and if so do the migration (or perhaps
do the migration anyways and just inform the user you've done it).

5) New routines GncPrefs* qof_session_get_local_prefs() and GncPrefs* qof_session_get_global_prefs() will return the local and global prefs, respectively.

See above about prefs object #3.

6) I don't think anything needs to be done for a newly created book. For current installations, #4 will copy global values from gconf to the book and then they will be used from the book from that time forward. For new installations with no current gconf values, the defaults will be used until they are changed.

Of course, then there is the decision about which current prefs stay global and which become local. I haven't looked into that yet, but when I do, I'll make a proposal.

There's also the question of how you define the prefs..  And how you know
where something is supposed to live.  Right now the user of the pref
needs to know where it lives so you would need to do something like:

 GncPref* gnc_get_global_pref(const char *prefpage, const char *prefname);
 GncPref* gnc_get_book_pref(QofBook*, const char*, const char *);
 GncPref* gnc_get_user_book_pref(QofBook*, const char*, const char*);

Then of course we would need to define the set of prefs in each
PrefsSet, so there's the Global prefs set, Book PrefsSet, and the
User/Book PrefsSet.  So we would need a registration procedure so
that GnuCash can register preferences settings in each section.

That preference definition could contain the page, name, tooltip,
default value, etc for each preference.

If we want to abstract out the pref location (Global, Book, or UserBook)
from the caller/user of the pref then we need to assure that a pref
isn't duplicated anywhere and DEFINITELY need a "global" registry.

Phil

-derek

--
      Derek Atkins, SB '93 MIT EE, SM '95 MIT Media Laboratory
      Member, MIT Student Information Processing Board  (SIPB)
      URL: http://web.mit.edu/warlord/    PP-ASEL-IA     N1NWH
      [email protected]                        PGP key available

_______________________________________________
gnucash-devel mailing list
[email protected]
https://lists.gnucash.org/mailman/listinfo/gnucash-devel

Reply via email to