RFC: KConfig XT (KDE 3.2)
Benjamin Meyer
ben at meyerhome.net
Tue Mar 18 18:36:51 GMT 2003
After reading Waldo's reply to me and thinking about it some more I concluded
that he was right. There might be a way to take the best of KAutoConfig and
KPrefs. After thinking about the problem and coding it out a few different
ways I have come to the following conclusion:
To improve the situation beyond what is currently available (default values in
2 places) the default values must be stored in the application (in 1 place).
Storing them in an external file for others to look at wont work. Exporting
the default will work though.
Rather then storing all of the data in one place like KPrefs or KAutoConfig I
propose breaking it up a bit and putting the different components where they
best fit. KBaseConfig handles the default values, KAutoConfig handles widget
interaction, and the applications still determines if and when the value
should be read/saved.
Everything in the system/application must be able to access the default
values. An example being KAutoConfig and class foo that calls readEntry() on
its 10 local variables. Due to the nature of the data (the default values) I
propose storing it in KBaseConfig by adding it to KBaseConfig with the
following two functions:
void setDefaultValues(const QString &group, const QAsciiDict<QVariant>
&defaultValues);
const QAsciiDict<QVariant> getDefaultValues(const QString &group) const;
KBaseConfig would get the following "protected:" addition:
QMap<const QString group, const QAsciiDict<QVariant> > defaultValues;
Information such as description, range/validation are not necessary for the
running of the application and should be provided in an external file that
does not have to be installed. Putting it within the binary would only
increase the binary size at little extra gain. A possible exceptions would
be adding the ability for KAutoConfig to output all known widget settings
descriptions based upon WhatsThis and specified known ranges (such as in
QSpinBox and QSlider). In that case the information already exists for the
users benefit. I would say simply to have a script that rips the information
out of the ui file, but not all applications use ui files. This file should
be standardized such as "kapprc_info".
Because default values normally are not desired to be saved (use up hd space,
have to be saved/loaded) there should be a method for extracting all of them.
Because I am not completely familiar with the KConfig/KApplication code
currently I submit the following idea (other ideas welcome): a command line
option --extractDefaultSettings which would tell KBaseConfig to output the
default values (and type!) every time setDefaultValues are called. Also
--extractAllSettings could be added to have KConfigBase output anytime a
read*Entry() function is called with the name, default, type. This way as
the application progresses you can see what all of the widgets (and
subwidgets) request allowing for very fine tuning of that applications
behavior. This file should be standardized such as "kapprc_default".
KAutoConfig would be modified to no longer "read" the default values from the
dialog, but to simply grab it from kconfig(). This way KAutoConfig simply
manages the settings<->widgets interaction and nothing more. This is would
make KAutoConfig faster the before.
The only downside to the above is that it would bloat every application by the
size of its default values just like how we store the application about text
even if it is never used.
The following example from my modification of KTron in exploring this
solution.
// In ktron.cpp constructor the default values for all of the settings of
this class
QAsciiDict<QVariant> defaultValues;
defaultValues.insert("Name_Pl1" new QVariant(QString("")));
defaultValues.insert("Name_Pl2", new QVariant(QString("")));
kapp->konfig()->setDefaultValues("Game",defaultValues);
}
// read in the settings for this class using the default values from kconfig
void KTron::readSettings() {
const QAsciiDict<QVariant> defaultValues =
kapp->konfig()->getDefaultValues("Game");
QAsciiDict<QVariant> defaultValues;
KConfig *config=kapp->config();
config->setGroup("Game");
playerName[0]=config->readEntry("Name_Pl1", defaultValues["Name_Pl1"]);
if ( playerName[0].isEmpty() )
playerName[0] = i18n("Player 1");
playerName[1]=config->readEntry("Name_Pl2", defaultValues["Name_Pl2"]);
if ( playerName[1].isEmpty() )
playerName[1] = i18n("Player 2");
updateStatusbar();
}
Hopefully I have been clear in my explination.
-Benjamin Meyer
More information about the kde-core-devel
mailing list