Migration of QtMvvm from github
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

170 lines
7.5 KiB

/*!
@class QtMvvm::ISettingsAccessor
This class is used by the SettingsViewModel and the @ref settings_generator "qsettingsgenerator"
to access settings. The interface is meant to be used as proxy for some kind of settings
backend (like QSettings), so access is kept generic and you can decide to use a different
storage if needed. While this class can be used directly, it is dsigned to only be used
as backend for a settings viewmodel or a generated settings instance, and thus lacks many
"comfort" methods one would otherwise expect.
@note All the semantincs desribed below, except for the change signals, are exactly the same
as for QSettings, as this interface is modeled after QSettings, in other words, the same rules
for keys and values as for QSettings apply to the methods of this interface.
@section ISettingsAccessor_keys Semantics of keys
Keys follow the following semantics. All keys are of the format `group/subgroup/key`. Keys
may or may not be case sensitive, depending on the plattform. The best approach is to assume
keys are case insensitive when storing, but case sensitive when loading. While the keys are
seperated into groups and keys, all groups can also serve as keys, i.e. `group/subgroup` is a
valid key as well.
@section ISettingsAccessor_storing Storing data
You can assume that data passed to save() is serializable via QDataStream. In other words, to
convert the variant to binary data, you can simply use operator<< and operator>> of the
QVariant. Also, just like with QSettings, the saved data does not have to retain the type. The
only condition is, that whatever you load() for the same key as used for storing must be
convertible to the same type as the variant, that was passed to the save() method.
Finally, saving data via this method does not have to immediatly store it permanently. However,
calling load() with the same key right after save() must always return the same value as
passed to it. Permanent storing can be done asynchronously, but should happen automatically
without to much time passing after the save() (or remove()), and must always happen before
the destruction of this object. Furthermore, users can use the sync() method to immediatly store
data permanently and load all changes done externally.
@section ISettingsAccessor_signals Change signals
Another specialty of this class are the change signals. They must be emitted whenever save()
or remove() are called, to ensure at least changes done within the same instance trigger the
according change signals. Changes done externally should lead to change signals, but don't have
to, if not supported. For example, the DataSyncSettingsAccessor can indeed detect changes as
they occur on other instances or externally, and thus emits the signals. QSettings however does
not support change signals of any kind, and thus external changes do change the data that can
be loaded, but do not emit any signals.
@section ISettingsAccessor_impl Available implementations
Currently, the following backends are supported:
- QSettingsAccessor: Wraps QSettings
- DataSyncSettingsAccessor: Part of mvvm datasync core, allows to store and sync settings via datasync
- AndroidSettingsAccessor: Wraps the SharedPreferences of the android API
@sa #QtMvvm_ISettingsAccessorIID, QSettingsAccessor, DataSyncSettingsAccessor,
AndroidSettingsAccessor, SettingsViewModel, DataSyncSettingsViewModel, @ref settings_generator
*/
/*!
@fn QtMvvm::ISettingsAccessor::setDefaultAccessor()
@tparam T The type to be registered as the default type. Must implement ISettingsAccessor
After setting the type via this method, createDefaultAccessor() will create instances of that
type when called.
@note In order for this to work, the passed type must have an invokable constructor, i.e.
@code{.cpp}
Q_INVOKABLE MySettingsAccessor(QObject *parent = nullptr);
@endcode
@sa ISettingsAccessor::createDefaultAccessor
*/
/*!
@fn QtMvvm::ISettingsAccessor::setDefaultAccessor(int)
@param typeId The typeId to be registered as the default type. Must implement ISettingsAccessor
After setting the type via this method, createDefaultAccessor() will create instances of that
type when called.
@note In order for this to work, the passed type must have an invokable constructor, i.e.
@code{.cpp}
Q_INVOKABLE MySettingsAccessor(QObject *parent = nullptr);
@endcode
@sa ISettingsAccessor::createDefaultAccessor
*/
/*!
@fn QtMvvm::ISettingsAccessor::createDefaultAccessor
@param parent The parent object to be passed to to accessor constructor
@returns A newly created instance of the default accessor type, or nullptr
Constructs and returns a new instance of the default accessor type. The default type is
QSettingsAccessor, but can be overwritten via setDefaultAccessor(). If the type set like that
is invalid or cannot be dynamically constructor, nullptr can be returned.
@sa ISettingsAccessor::setDefaultAccessor
*/
/*!
@fn QtMvvm::ISettingsAccessor::contains
@param key The key of the settings entry to be checked for existance
@returns true, if a value for that key was stored, false if not
This should only check for values, not for groups, i.e. if key referes to a group that has
child keys, but no value by itself, you should still return false.
@sa ISettingsAccessor::load
*/
/*!
@fn QtMvvm::ISettingsAccessor::load
@param key The key of the settings entry to be loaded
@param defaultValue A alternative value to be returned if there is no data stored for that key
@returns The data loaded for the key, or the default value
If the given value does exist, it should be loaded and returned. If the is on data stored for
that key, simply return whatever is passed as the default value.
@sa @ref ISettingsAccessor_storing, ISettingsAccessor::contains, ISettingsAccessor::save
*/
/*!
@fn QtMvvm::ISettingsAccessor::save
@param key The key of the settings entry to be saved
@param value The data to be stored under that key
Should simply store the passed data under the given key. You dont have to check if the variant
is actually serializable, as the meta system will automatically warn the user if thats not the
case. Permanent storing is done asynchronously, but can be forced via sync().
Any implementation of this method *must* emit the entryChanged() signal with the passed data and
key.
@sa @ref ISettingsAccessor_storing, ISettingsAccessor::entryChanged, ISettingsAccessor::load,
ISettingsAccessor::remove, ISettingsAccessor::sync
*/
/*!
@fn QtMvvm::ISettingsAccessor::remove
@param key The key of the settings entry to be removed
This method should remove the given key and all of its subkeys. If for example the settings
contained the values `group/subgroup` and `group/subgroup/key`, after this method, both must
have been removed. Permanent storing is done asynchronously, but can be forced via sync().
Any implementation of this method *must* emit the entryRemoved() signal for **all** the removed
entries. I.e. for the example above, it must be emitted for both, `group/subgroup` and
`group/subgroup/key`.
@sa @ref ISettingsAccessor_storing, ISettingsAccessor::entryRemoved, ISettingsAccessor::save,
ISettingsAccessor::sync
*/
/*!
@fn QtMvvm::ISettingsAccessor::sync
You can call this method to immediatly store any changed data to permanent store. This exists
because typically, calls to save() and remove() only "cache" the changes, and then later write
them to the permanent store in a single transaction, as this can be an expensive operation.
Normally, you don't have to care about this, as this happens automatically, but sometimes you
might want to manually perform this step. Thats what this method is for.
@sa ISettingsAccessor::save, ISettingsAccessor::remove, QSettings::sync
*/