New Masked Calender for GnuCash

Geert Janssens geert.gnucash at kobaltwit.be
Sat Nov 5 09:09:55 EDT 2016


On Friday 04 November 2016 08:08:46 John Ralls wrote:
> > On Nov 3, 2016, at 8:39 PM, Amin Aghabeiki
> > <amin.aghabeiki at gmail.com> wrote:
> > 
> > Hi John
> > 
> > I plane to change check box for calendar to combo box but its really
> > complicated there is any guide  to add combo box in preference?

Which check box are you referring to here ?
> 
> Amin,
> 
> No, I've never worked with the preferences dialog. Perhaps Geert can
> offer some help.
> 
> Regards,
> John Ralls

Hmm, it's been a while. Let's see what I remember...

I assume you want to add a combobox in which the user can select the calendar widget to use 
(Gregorian vs Jalali).

There are several examples you can follow in the preferences already. The date-format 
combobox is probably a good start.

First you should define your combobox in the glade interface file (src/gnome-
utils/gtkbuilder/dialog-preferences.glade). Note the name needs a particular format, which I'll 
get back to later.

Each combobox needs a model, which you can also define in the same glade file. For the date-
format combobox this is a gtkliststore with the name  "date-formats". You'll need to define one 
similar for your combobox.

Next, all settings you see in the preferences dialog are stored in gsettings. Gsettings uses xml 
configuration files to define its settings. You'll need to create the schema for your specific 
preference. The schema are stored in gsettings subdirectories in various places of the code. The 
other date-time related settings are defined in
src/gnome/gsettings/org.gnucash.gschema.xml.in.in	
Again you can follow the example of the date-format preference. You will need to add a key to 
the general schema for your preference. It will store an integer value which is the selected line 
number in the combobox' liststore (though 0-based). This sounds more complicated than it is 
really. If you offer the user two options in your combobox, like this:
Gregorian calendar
Jalali calendar
and the user selects "Jalali calendar", the value to store in the preference will be 1. Otherwise it 
will be 0. Note that I believe 0 should be the default to avoid unexpected changes to existing 
users.

And now for a crucial part: the name of your combobox in the glade file should be the gsettings 
path of your preference prefixed with "pref/". For the date-format preference for example this 
becomes:
pref/general/date-format
The combobox called that way will be tied automatically to the date-format gsettings 
preference in the general section in gsettings. This part is crucial. If the name of the widget is 
not correctly matched to the gsettings key, your preference will not work.

Lastly, due to the way gtkbuilder works, you'll have to explicitly tell gnucash to load the liststore 
you have defined for your combobox. It will load the combobox automatically, but not the 
liststore. This needs one more line in src/gnome-utils/dialog-preferences.c around line 1084.

After all that is done, your preference should just work.

For readability you should add a #define for the key of your preference in your own code, 
starting with "GNC_PREF_" and use that in combination with GNC_PREFS_GROUP_GENERAL in 
your calls to gnc_prefs_get_int to query the value of the new preference.

Finally, you may want to listen for changes in your new preference in order to update date/time 
widgets on open registers, report-option dialogs and anywhere else you are offering the jalali 
calendar as alternative. You can register callbacks to your preference via 
"gnc_prefs_register_cb"

Is that sufficient to get you going ?

Regards,

Geert


More information about the gnucash-devel mailing list