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>
This commit is contained in:
Berthold Stoeger 2024-06-13 22:59:32 +02:00 committed by bstoeger
parent 82fc9de40b
commit ccdd92aeb7
78 changed files with 645 additions and 694 deletions

View file

@ -27,11 +27,10 @@ HANDLE_PREFERENCE_BOOL(CloudStorage, "cloud_auto_sync", cloud_auto_sync);
void qPrefCloudStorage::set_cloud_base_url(const QString &value)
{
if (value != prefs.cloud_base_url) {
if (value.toStdString() != prefs.cloud_base_url) {
// only free and set if not default
if (prefs.cloud_base_url != default_prefs.cloud_base_url) {
qPrefPrivate::copy_txt(&prefs.cloud_base_url, value);
}
if (prefs.cloud_base_url != default_prefs.cloud_base_url)
prefs.cloud_base_url = value.toStdString();
disk_cloud_base_url(true);
emit instance()->cloud_base_urlChanged(value);
@ -42,14 +41,15 @@ void qPrefCloudStorage::store_cloud_base_url(const QString &value)
{
// this is used if we want to update the on-disk settings without changing
// the runtime preference
qPrefPrivate::propSetValue(keyFromGroupAndName(group, "cloud_base_url"), value, default_prefs.cloud_base_url);
qPrefPrivate::propSetValue(keyFromGroupAndName(group, "cloud_base_url"), value, QString::fromStdString(default_prefs.cloud_base_url));
}
void qPrefCloudStorage::disk_cloud_base_url(bool doSync)
{
// we don't allow to automatically write back the prefs value for the cloud_base_url.
// in order to do that you need to use the explicit function above store_cloud_base_url()
if (!doSync)
prefs.cloud_base_url = copy_qstring(qPrefPrivate::propValue(keyFromGroupAndName(group, "cloud_base_url"), default_prefs.cloud_base_url).toString());
prefs.cloud_base_url = qPrefPrivate::propValue(keyFromGroupAndName(group, "cloud_base_url"),
QString::fromStdString(default_prefs.cloud_base_url)).toString().toStdString();
}
HANDLE_PREFERENCE_TXT(CloudStorage, "email", cloud_storage_email);
@ -58,8 +58,8 @@ HANDLE_PREFERENCE_TXT(CloudStorage, "email_encoded", cloud_storage_email_encoded
void qPrefCloudStorage::set_cloud_storage_password(const QString &value)
{
if (value != prefs.cloud_storage_password) {
qPrefPrivate::copy_txt(&prefs.cloud_storage_password, value);
if (value.toStdString() != prefs.cloud_storage_password) {
prefs.cloud_storage_password = value.toStdString();
disk_cloud_storage_password(true);
emit instance()->cloud_storage_passwordChanged(value);
}
@ -68,9 +68,11 @@ void qPrefCloudStorage::disk_cloud_storage_password(bool doSync)
{
if (doSync) {
if (prefs.save_password_local)
qPrefPrivate::propSetValue(keyFromGroupAndName(group, "password"), prefs.cloud_storage_password, default_prefs.cloud_storage_password);
qPrefPrivate::propSetValue(keyFromGroupAndName(group, "password"), prefs.cloud_storage_password,
default_prefs.cloud_storage_password);
} else {
prefs.cloud_storage_password = copy_qstring(qPrefPrivate::propValue(keyFromGroupAndName(group, "password"), default_prefs.cloud_storage_password).toString());
prefs.cloud_storage_password = qPrefPrivate::propValue(keyFromGroupAndName(group, "password"),
default_prefs.cloud_storage_password).toString().toStdString();
}
}
@ -84,17 +86,17 @@ HANDLE_PREFERENCE_BOOL(CloudStorage, "save_password_local", save_password_local)
QString qPrefCloudStorage::diveshare_uid()
{
return qPrefPrivate::propValue(keyFromGroupAndName("", "diveshareExport/uid"), "").toString();
return qPrefPrivate::propValue(keyFromGroupAndName("", "diveshareExport/uid"), QString()).toString();
}
void qPrefCloudStorage::set_diveshare_uid(const QString &value)
{
qPrefPrivate::propSetValue(keyFromGroupAndName("", "diveshareExport/uid"), value, "");
qPrefPrivate::propSetValue(keyFromGroupAndName("", "diveshareExport/uid"), value, QString());
emit instance()->diveshare_uidChanged(value);
}
bool qPrefCloudStorage::diveshare_private()
{
return qPrefPrivate::propValue(keyFromGroupAndName("", "diveshareExport/private"), "").toBool();
return qPrefPrivate::propValue(keyFromGroupAndName("", "diveshareExport/private"), QString()).toBool();
}
void qPrefCloudStorage::set_diveshare_private(bool value)
{
@ -104,21 +106,20 @@ void qPrefCloudStorage::set_diveshare_private(bool value)
QString qPrefCloudStorage::divelogde_user()
{
return qPrefPrivate::propValue(keyFromGroupAndName("", "divelogde_user"), "").toString();
return qPrefPrivate::propValue(keyFromGroupAndName("", "divelogde_user"), QString()).toString();
}
void qPrefCloudStorage::set_divelogde_user(const QString &value)
{
qPrefPrivate::propSetValue(keyFromGroupAndName("", "divelogde_user"), value, "");
qPrefPrivate::propSetValue(keyFromGroupAndName("", "divelogde_user"), value, QString());
emit instance()->divelogde_userChanged(value);
}
QString qPrefCloudStorage::divelogde_pass()
{
return qPrefPrivate::propValue(keyFromGroupAndName("", "divelogde_pass"), "").toString();
return qPrefPrivate::propValue(keyFromGroupAndName("", "divelogde_pass"), QString()).toString();
}
void qPrefCloudStorage::set_divelogde_pass(const QString &value)
{
qPrefPrivate::propSetValue(keyFromGroupAndName("", "divelogde_pass"), value, "");
qPrefPrivate::propSetValue(keyFromGroupAndName("", "divelogde_pass"), value, QString());
emit instance()->divelogde_passChanged(value);
}

View file

@ -41,11 +41,11 @@ public:
Q_ENUM(cloud_status);
static bool cloud_auto_sync() { return prefs.cloud_auto_sync; }
static QString cloud_base_url() { return prefs.cloud_base_url; }
static QString cloud_storage_email() { return prefs.cloud_storage_email; }
static QString cloud_storage_email_encoded() { return prefs.cloud_storage_email_encoded; }
static QString cloud_storage_password() { return prefs.cloud_storage_password; }
static QString cloud_storage_pin() { return prefs.cloud_storage_pin; }
static QString cloud_base_url() { return QString::fromStdString(prefs.cloud_base_url); }
static QString cloud_storage_email() { return QString::fromStdString(prefs.cloud_storage_email); }
static QString cloud_storage_email_encoded() { return QString::fromStdString(prefs.cloud_storage_email_encoded); }
static QString cloud_storage_password() { return QString::fromStdString(prefs.cloud_storage_password); }
static QString cloud_storage_pin() { return QString::fromStdString(prefs.cloud_storage_pin); }
static int cloud_timeout() { return prefs.cloud_timeout; }
static int cloud_verification_status() { return prefs.cloud_verification_status; }
static bool save_password_local() { return prefs.save_password_local; }

View file

@ -77,9 +77,9 @@ void qPrefDisplay::set_divelist_font(const QString &value)
if (value.contains(","))
newValue = value.left(value.indexOf(","));
if (newValue != prefs.divelist_font &&
!subsurface_ignore_font(qPrintable(newValue))) {
qPrefPrivate::copy_txt(&prefs.divelist_font, value);
if (newValue.toStdString() != prefs.divelist_font &&
!subsurface_ignore_font(newValue.toStdString())) {
prefs.divelist_font = value.toStdString();
disk_divelist_font(true);
qApp->setFont(QFont(newValue));
@ -170,12 +170,10 @@ void qPrefDisplay::setCorrectFont()
QString fontName = defaultFont.toString();
if (fontName.contains(","))
fontName = fontName.left(fontName.indexOf(","));
if (subsurface_ignore_font(qPrintable(fontName))) {
defaultFont = QFont(prefs.divelist_font);
} else {
free((void *)prefs.divelist_font);
prefs.divelist_font = copy_qstring(fontName);
}
if (subsurface_ignore_font(fontName.toStdString()))
defaultFont = QFont(QString::fromStdString(prefs.divelist_font));
else
prefs.divelist_font = fontName.toStdString();
defaultFont.setPointSizeF(prefs.font_size * prefs.mobile_scale);
qApp->setFont(defaultFont);

View file

@ -38,7 +38,7 @@ public:
public:
static int animation_speed() { return prefs.animation_speed; }
static QString divelist_font() { return prefs.divelist_font; }
static QString divelist_font() { return QString::fromStdString(prefs.divelist_font); }
static double font_size() { return prefs.font_size; }
static double mobile_scale() { return prefs.mobile_scale; }
static bool display_invalid_dives() { return prefs.display_invalid_dives; }

View file

@ -6,11 +6,11 @@
#include <QObject>
#define IMPLEMENT5GETTERS(name) \
static QString name() { return prefs.dive_computer.name; } \
static QString name##1() { return prefs.dive_computer##1 .name; } \
static QString name##2() { return prefs.dive_computer##2 .name; } \
static QString name##3() { return prefs.dive_computer##3 .name; } \
static QString name##4() { return prefs.dive_computer##4 .name; }
static QString name() { return QString::fromStdString(prefs.dive_computer.name); } \
static QString name##1() { return QString::fromStdString(prefs.dive_computer##1 .name); } \
static QString name##2() { return QString::fromStdString(prefs.dive_computer##2 .name); } \
static QString name##3() { return QString::fromStdString(prefs.dive_computer##3 .name); } \
static QString name##4() { return QString::fromStdString(prefs.dive_computer##4 .name); }
class qPrefDiveComputer : public QObject {
Q_OBJECT

View file

@ -20,7 +20,7 @@ public:
static void sync() { loadSync(true); }
public:
static QString default_cylinder() { return prefs.default_cylinder; }
static QString default_cylinder() { return QString::fromStdString(prefs.default_cylinder); }
static bool include_unused_tanks() { return prefs.include_unused_tanks; }
static bool display_default_tank_infos() { return prefs.display_default_tank_infos; }

View file

@ -25,12 +25,12 @@ public:
static void sync() { loadSync(true); }
public:
static const QString date_format() { return prefs.date_format; }
static const QString date_format() { return QString::fromStdString(prefs.date_format); }
static bool date_format_override() { return prefs.date_format_override; }
static const QString date_format_short() { return prefs.date_format_short; }
static const QString language() { return prefs.locale.language; }
static const QString lang_locale() { return prefs.locale.lang_locale; }
static const QString time_format() { return prefs.time_format; }
static const QString date_format_short() { return QString::fromStdString(prefs.date_format_short); }
static const QString language() { return QString::fromStdString(prefs.locale.language); }
static const QString lang_locale() { return QString::fromStdString(prefs.locale.lang_locale); }
static const QString time_format() { return QString::fromStdString(prefs.time_format); }
static bool time_format_override() { return prefs.time_format_override; }
static bool use_system_language() { return prefs.locale.use_system_language; }

View file

@ -28,7 +28,7 @@ void qPrefLog::set_default_file_behavior(enum def_file_behavior value)
if (value == UNDEFINED_DEFAULT_FILE) {
// undefined, so check if there's a filename set and
// use that, otherwise go with no default file
prefs.default_file_behavior = QString(prefs.default_filename).isEmpty() ? NO_DEFAULT_FILE : LOCAL_DEFAULT_FILE;
prefs.default_file_behavior = prefs.default_filename.empty() ? NO_DEFAULT_FILE : LOCAL_DEFAULT_FILE;
} else {
prefs.default_file_behavior = value;
}
@ -45,7 +45,7 @@ void qPrefLog::disk_default_file_behavior(bool doSync)
if (prefs.default_file_behavior == UNDEFINED_DEFAULT_FILE)
// undefined, so check if there's a filename set and
// use that, otherwise go with no default file
prefs.default_file_behavior = QString(prefs.default_filename).isEmpty() ? NO_DEFAULT_FILE : LOCAL_DEFAULT_FILE;
prefs.default_file_behavior = prefs.default_filename.empty() ? NO_DEFAULT_FILE : LOCAL_DEFAULT_FILE;
}
}
@ -58,4 +58,3 @@ HANDLE_PREFERENCE_BOOL(Log, "use_default_file", use_default_file);
HANDLE_PREFERENCE_BOOL(Log, "salinityEditDefault", salinityEditDefault);
HANDLE_PREFERENCE_BOOL(Log, "show_average_depth", show_average_depth);

View file

@ -23,7 +23,7 @@ public:
static void sync() { return loadSync(true); }
public:
static QString default_filename() { return prefs.default_filename; }
static QString default_filename() { return QString::fromStdString(prefs.default_filename); }
static enum def_file_behavior default_file_behavior() { return prefs.default_file_behavior; }
static bool use_default_file() { return prefs.use_default_file; }
static bool extraEnvironmentalDefault() { return prefs.extraEnvironmentalDefault; }

View file

@ -23,4 +23,3 @@ HANDLE_PREFERENCE_BOOL(Media, "auto_recalculate_thumbnails", auto_recalculate_th
HANDLE_PREFERENCE_BOOL(Media, "extract_video_thumbnails", extract_video_thumbnails);
HANDLE_PREFERENCE_INT(Media, "extract_video_thumbnails_position", extract_video_thumbnails_position);
HANDLE_PREFERENCE_TXT(Media, "ffmpeg_executable", ffmpeg_executable);

View file

@ -24,7 +24,7 @@ public:
static bool auto_recalculate_thumbnails() { return prefs.auto_recalculate_thumbnails; }
static bool extract_video_thumbnails() { return prefs.extract_video_thumbnails; }
static int extract_video_thumbnails_position() { return prefs.extract_video_thumbnails_position; }
static QString ffmpeg_executable() { return prefs.ffmpeg_executable; }
static QString ffmpeg_executable() { return QString::fromStdString(prefs.ffmpeg_executable); }
public slots:
static void set_auto_recalculate_thumbnails(bool value);

View file

@ -4,12 +4,6 @@
#include <QSettings>
void qPrefPrivate::copy_txt(const char **name, const QString &string)
{
free((void *)*name);
*name = copy_qstring(string);
}
QString keyFromGroupAndName(QString group, QString name)
{
QString slash = (group.endsWith('/') || name.startsWith('/')) ? "" : "/";
@ -35,8 +29,19 @@ void qPrefPrivate::propSetValue(const QString &key, const QVariant &value, const
s.remove(key);
}
void qPrefPrivate::propSetValue(const QString &key, const std::string &value, const std::string &defaultValue)
{
propSetValue(key, QString::fromStdString(value), QString::fromStdString(defaultValue));
}
QVariant qPrefPrivate::propValue(const QString &key, const QVariant &defaultValue)
{
QSettings s;
return s.value(key, defaultValue);
}
QVariant qPrefPrivate::propValue(const QString &key, const std::string &defaultValue)
{
QSettings s;
return s.value(key, QString::fromStdString(defaultValue));
}

View file

@ -16,10 +16,10 @@ class qPrefPrivate {
public:
// Helper functions
static void copy_txt(const char **name, const QString &string);
static void propSetValue(const QString &key, const QVariant &value, const QVariant &defaultValue);
static void propSetValue(const QString &key, const std::string &value, const std::string &defaultValue);
static QVariant propValue(const QString &key, const QVariant &defaultValue);
static QVariant propValue(const QString &key, const std::string &defaultValue);
private:
qPrefPrivate() {}
@ -134,29 +134,29 @@ extern QString keyFromGroupAndName(QString group, QString name);
#define DISK_LOADSYNC_TXT_EXT(usegroup, name, field, usestruct) \
void qPref##usegroup::disk_##field(bool doSync) \
{ \
static QString current_state; \
static std::string current_state; \
if (doSync) { \
if (current_state != QString(prefs.usestruct field)) { \
current_state = QString(prefs.usestruct field); \
qPrefPrivate::propSetValue(keyFromGroupAndName(group, name), prefs.usestruct field, default_prefs.usestruct field); \
if (current_state != prefs.usestruct field) { \
current_state = prefs.usestruct field; \
qPrefPrivate::propSetValue(keyFromGroupAndName(group, name), QString::fromStdString(prefs.usestruct field), QString::fromStdString(default_prefs.usestruct field)); \
} \
} else { \
prefs.usestruct field = copy_qstring(qPrefPrivate::propValue(keyFromGroupAndName(group, name), default_prefs.usestruct field).toString()); \
current_state = QString(prefs.usestruct field); \
prefs.usestruct field = qPrefPrivate::propValue(keyFromGroupAndName(group, name), QString::fromStdString(default_prefs.usestruct field)).toString().toStdString(); \
current_state = prefs.usestruct field; \
} \
}
#define DISK_LOADSYNC_TXT_EXT_ALT(usegroup, name, field, usestruct, alt) \
void qPref##usegroup::disk_##field##alt(bool doSync) \
{ \
static QString current_state; \
static std::string current_state; \
if (doSync) { \
if (current_state != QString(prefs.usestruct ## alt .field)) { \
current_state = QString(prefs.usestruct ## alt .field); \
qPrefPrivate::propSetValue(keyFromGroupAndName(group, name), prefs.usestruct ##alt .field, default_prefs.usestruct ##alt .field); \
if (current_state != prefs.usestruct ## alt .field) { \
current_state = prefs.usestruct ## alt .field; \
qPrefPrivate::propSetValue(keyFromGroupAndName(group, name), QString::fromStdString(prefs.usestruct ##alt .field), QString::fromStdString(default_prefs.usestruct ##alt .field)); \
} \
} else { \
prefs.usestruct ##alt .field = copy_qstring(qPrefPrivate::propValue(keyFromGroupAndName(group, name), default_prefs.usestruct ##alt .field).toString()); \
current_state = QString(prefs.usestruct ##alt .field); \
prefs.usestruct ##alt .field = qPrefPrivate::propValue(keyFromGroupAndName(group, name), QString::fromStdString(default_prefs.usestruct ##alt .field)).toString().toStdString(); \
current_state = prefs.usestruct ##alt .field; \
} \
}
#define DISK_LOADSYNC_TXT(usegroup, name, field) \
@ -226,8 +226,8 @@ extern QString keyFromGroupAndName(QString group, QString name);
#define SET_PREFERENCE_TXT_EXT(usegroup, field, usestruct) \
void qPref##usegroup::set_##field(const QString &value) \
{ \
if (value != prefs.usestruct field) { \
qPrefPrivate::copy_txt(&prefs.usestruct field, value); \
if (value.toStdString() != prefs.usestruct field) { \
prefs.usestruct field = value.toStdString(); \
disk_##field(true); \
emit instance()->field##Changed(value); \
} \
@ -236,8 +236,8 @@ extern QString keyFromGroupAndName(QString group, QString name);
#define SET_PREFERENCE_TXT_EXT_ALT(usegroup, field, usestruct, alt) \
void qPref##usegroup::set_##field##alt(const QString &value) \
{ \
if (value != prefs.usestruct ##alt .field) { \
qPrefPrivate::copy_txt(&prefs.usestruct ##alt .field, value); \
if (value.toStdString() != prefs.usestruct ##alt .field) { \
prefs.usestruct ##alt .field = value.toStdString(); \
disk_##field##alt(true); \
emit instance()->field##alt##Changed(value); \
} \

View file

@ -25,11 +25,11 @@ public:
public:
static bool proxy_auth() { return prefs.proxy_auth; }
static QString proxy_host() { return prefs.proxy_host; }
static QString proxy_pass() { return prefs.proxy_pass; }
static QString proxy_host() { return QString::fromStdString(prefs.proxy_host); }
static QString proxy_pass() { return QString::fromStdString(prefs.proxy_pass); }
static int proxy_port() { return prefs.proxy_port; }
static int proxy_type() { return prefs.proxy_type; }
static QString proxy_user() { return prefs.proxy_user; }
static QString proxy_user() { return QString::fromStdString(prefs.proxy_user); }
public slots:
static void set_proxy_auth(bool value);

View file

@ -41,7 +41,7 @@ void qPrefUpdateManager::disk_next_check(bool doSync)
if (doSync)
qPrefPrivate::propSetValue(keyFromGroupAndName(group, "NextCheck"), prefs.update_manager.next_check, default_prefs.update_manager.next_check);
else
prefs.update_manager.next_check = qPrefPrivate::propValue(keyFromGroupAndName(group, "NextCheck"), 0).toInt();
prefs.update_manager.next_check = qPrefPrivate::propValue(keyFromGroupAndName(group, "NextCheck"), QVariant(0)).toInt();
}
HANDLE_PROP_QSTRING(UpdateManager, "UpdateManager/UUID", uuidString);

View file

@ -23,7 +23,7 @@ public:
public:
static bool dont_check_for_updates() { return prefs.update_manager.dont_check_for_updates; }
static const QString last_version_used() { return prefs.update_manager.last_version_used; }
static const QString last_version_used() { return QString::fromStdString(prefs.update_manager.last_version_used); }
static const QDate next_check() { return QDate::fromJulianDay(prefs.update_manager.next_check); }
static const QString uuidString() { return st_uuidString; }