subsurface/core/settings
Berthold Stoeger ccdd92aeb7 preferences: use std::string in struct preferences
This is a messy commit, because the "qPref" system relies
heavily on QString, which means lots of conversions between
the two worlds. Ultimately, I plan to base the preferences
system on std::string and only convert to QString when
pushing through Qt's property system or when writing into
Qt's settings.

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2024-08-13 19:28:30 +02:00
..
qPref.cpp core: remove location service preferences 2021-09-13 11:21:34 -07:00
qPref.h Cleanup: don't instantiate a QPref object 2019-04-04 09:29:45 -07:00
qPrefCloudStorage.cpp preferences: use std::string in struct preferences 2024-08-13 19:28:30 +02:00
qPrefCloudStorage.h preferences: use std::string in struct preferences 2024-08-13 19:28:30 +02:00
qPrefDisplay.cpp preferences: use std::string in struct preferences 2024-08-13 19:28:30 +02:00
qPrefDisplay.h preferences: use std::string in struct preferences 2024-08-13 19:28:30 +02:00
qPrefDiveComputer.cpp Import: Add option to sync time on dive computer download 2023-04-17 07:56:02 -07:00
qPrefDiveComputer.h preferences: use std::string in struct preferences 2024-08-13 19:28:30 +02:00
qPrefDivePlanner.cpp core/settings: make qPref* constructors private 2019-12-05 11:48:26 -08:00
qPrefDivePlanner.h core/settings: remove Q_PROPERTY warning in qPref headers 2019-12-05 11:48:26 -08:00
qPrefEquipment.cpp Equipment: Include Unused Tanks in Merge if Preference is Enabled. 2023-07-25 11:19:03 +12:00
qPrefEquipment.h preferences: use std::string in struct preferences 2024-08-13 19:28:30 +02:00
qPrefGeneral.cpp mobile: remove filter settings 2020-03-01 10:21:44 -08:00
qPrefGeneral.h mobile: remove filter settings 2020-03-01 10:21:44 -08:00
qPrefGeocoding.cpp Preferences UI: final cleanup 2019-12-25 02:57:42 +09:00
qPrefGeocoding.h Preferences UI: final cleanup 2019-12-25 02:57:42 +09:00
qPrefLanguage.cpp core/settings: make qPref* constructors private 2019-12-05 11:48:26 -08:00
qPrefLanguage.h preferences: use std::string in struct preferences 2024-08-13 19:28:30 +02:00
qPrefLog.cpp preferences: use std::string in struct preferences 2024-08-13 19:28:30 +02:00
qPrefLog.h preferences: use std::string in struct preferences 2024-08-13 19:28:30 +02:00
qPrefMedia.cpp preferences: use std::string in struct preferences 2024-08-13 19:28:30 +02:00
qPrefMedia.h preferences: use std::string in struct preferences 2024-08-13 19:28:30 +02:00
qPrefPartialPressureGas.cpp core/settings: make qPref* constructors private 2019-12-05 11:48:26 -08:00
qPrefPartialPressureGas.h core/settings: remove Q_PROPERTY warning in qPref headers 2019-12-05 11:48:26 -08:00
qPrefPrivate.cpp preferences: use std::string in struct preferences 2024-08-13 19:28:30 +02:00
qPrefPrivate.h preferences: use std::string in struct preferences 2024-08-13 19:28:30 +02:00
qPrefProxy.cpp core/settings: make qPref* constructors private 2019-12-05 11:48:26 -08:00
qPrefProxy.h preferences: use std::string in struct preferences 2024-08-13 19:28:30 +02:00
qPrefTechnicalDetails.cpp Desktop: Add a Button to Hide the Infobox in the Dive Profile. 2023-06-25 14:40:23 +02:00
qPrefTechnicalDetails.h Desktop: Add a Button to Hide the Infobox in the Dive Profile. 2023-06-25 14:40:23 +02:00
qPrefUnit.cpp core/settings: removed unnecessary if 2020-01-20 09:55:57 -08:00
qPrefUnit.h core/settings:: remove string functions for units 2020-01-20 09:55:26 -08:00
qPrefUpdateManager.cpp preferences: use std::string in struct preferences 2024-08-13 19:28:30 +02:00
qPrefUpdateManager.h preferences: use std::string in struct preferences 2024-08-13 19:28:30 +02:00
README.md core/settings: add README 2018-08-30 05:36:36 -07:00

Short explanation of how qPref works

System startup:

core/qt-init.cpp init_qt_late()

does

qPref::load();

to load all properties from all qPref* classes

System shutdown:

subsurface-mobile-main.cpp and subsurface-desktop-main.cpp main()

calls

call qPref::sync()

to save all changes to disk, this is needed because part of the program modifies struct preferences instead of calling the set method.

EXCEPTION:

Variables not present in struct preferences (local static variables in the class are not written, see later.

System startup/shutdown common handling:

qPref::load() calls qPref::doSync(false)
qPref::sync() calls qPref::doSync(true)

qPrefDoSync()

qPref::doSync() calls qPref::doSync() for all qPref* classes Meaning qPref knows which classes exist, but not which variables

qPref*::doSync() calls

disk_<variable name>() for each variable

EXCEPTION:

some variables are not in struct preferences, but local static variables which can only be accessed through the set/get functions, therefore there are no need to sync them

	if (!doSync) // meaining load
		load_<variable_name>()

qPref*::disk_*()

qPref*::disk_*() calls qPrefPrivate::propSetValue to save a property, and qPrefPrivate::propValue() to read a property. The function also keeps struct preferences in sync.

qPrefPrivate::propSetValue()

qPrefPrivate::propSetValue() is static and calls QSettings to write property

qPrefPrivate::propValue()

qPrefPrivate::propValue() is static and calls QSettings to read property

macros

the macros are defined in qPrefPrivate.h

the macros are used in qPref*cpp

Reading properties

Reading a property is done through an inline function, and thus no more expensive than accessing the variable directly.

qPref*::<variable_name>()

Setting properties

Setting a property is done through a dedicated set function which are static to simplify the call:

qPref<class>::set_<variable_name>(value)

like:

qPrefDisplay::animation_speed(500);

the set function updates struct preferences (if not a local variable), and saves the property to disk, however save is only done if the variable is changed.

Updating struct preferences

When a program part updates struct preferences directly, changes are NOT saved to disk if the programm crashes, otherwise all variables are saved to disk with the program exists.