aboutsummaryrefslogtreecommitdiff
path: root/src/main.cpp
diff options
context:
space:
mode:
authorFelix (xq) Queißner <git@mq32.de>2020-06-28 16:30:52 +0200
committerFelix (xq) Queißner <git@mq32.de>2020-06-28 16:30:52 +0200
commit6edd9e7a12a3827fb6aac62a88be01085e41e176 (patch)
tree4513475c7efaea92a154ff20e970ed3d4b475b7c /src/main.cpp
parenta53e490d2e96d22a24293019921af26e00f2bf7a (diff)
downloadkristall-6edd9e7a12a3827fb6aac62a88be01085e41e176.tar.gz
Huge refacoring of the settings stuff. Provides automated migration between old and new configuration file stuff. Themes are now just files in a folder instead of encoded data in the config file.
Diffstat (limited to 'src/main.cpp')
-rw-r--r--src/main.cpp216
1 files changed, 178 insertions, 38 deletions
diff --git a/src/main.cpp b/src/main.cpp
index 6e71917..555734e 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -6,31 +6,32 @@
#include <QSettings>
#include <QCommandLineParser>
#include <QDebug>
-
#include <QStandardPaths>
-
-IdentityCollection global_identities;
-QSettings global_settings { "xqTechnologies", "Kristall" };
-QClipboard * global_clipboard;
-SslTrust global_gemini_trust;
-SslTrust global_https_trust;
-FavouriteCollection global_favourites;
-GenericSettings global_options;
-
-namespace kristall
-{
- QDir config_root;
- QDir cache_root;
- QDir offline_pages;
- QDir themes;
- QDir styles;
-}
+#include <cassert>
+
+ProtocolSetup kristall::protocols;
+IdentityCollection kristall::identities;
+QSettings * kristall::settings;
+QClipboard * kristall::clipboard;
+SslTrust kristall::trust::gemini;
+SslTrust kristall::trust::https;
+FavouriteCollection kristall::favourites;
+GenericSettings kristall::options;
+DocumentStyle kristall::document_style;
+
+QDir kristall::dirs::config_root;
+QDir kristall::dirs::cache_root;
+QDir kristall::dirs::offline_pages;
+QDir kristall::dirs::themes;
+QDir kristall::dirs::styles;
QString toFingerprintString(QSslCertificate const & certificate)
{
return QCryptographicHash::hash(certificate.toDer(), QCryptographicHash::Sha256).toHex(':');
}
+static QSettings * app_settings_ptr;
+
#define SSTR(X) STR(X)
#define STR(X) #X
@@ -53,7 +54,7 @@ int main(int argc, char *argv[])
QApplication app(argc, argv);
app.setApplicationVersion(SSTR(KRISTALL_VERSION));
- global_clipboard = app.clipboard();
+ kristall::clipboard = app.clipboard();
QCommandLineParser cli_parser;
cli_parser.addVersionOption();
@@ -62,33 +63,119 @@ int main(int argc, char *argv[])
cli_parser.process(app);
-
-
QString cache_root = QStandardPaths::writableLocation(QStandardPaths::CacheLocation);
QString config_root = QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation);
- kristall::config_root = QDir { config_root };
- kristall::cache_root = QDir { cache_root };
+ kristall::dirs::config_root = QDir { config_root };
+ kristall::dirs::cache_root = QDir { cache_root };
+
+ kristall::dirs::offline_pages = derive_dir(kristall::dirs::cache_root, "offline-pages");
+ kristall::dirs::themes = derive_dir(kristall::dirs::config_root, "themes");
+
+ kristall::dirs::styles = derive_dir(kristall::dirs::config_root, "styles");
+ kristall::dirs::styles.setNameFilters(QStringList { "*.kthm" });
+ kristall::dirs::styles.setFilter(QDir::Files);
+
+ QSettings app_settings {
+ kristall::dirs::config_root.absoluteFilePath("config.ini"),
+ QSettings::IniFormat
+ };
+ app_settings_ptr = &app_settings;
+
+ {
+ QSettings deprecated_settings { "xqTechnologies", "Kristall" };
+ if(QFile(deprecated_settings.fileName()).exists())
+ {
+ if(deprecated_settings.value("deprecated", false) == false)
+ {
+ qDebug() << "Migrating to new configuration style.";
+ for(auto const & key : deprecated_settings.allKeys())
+ {
+ app_settings.setValue(key, deprecated_settings.value(key));
+ }
+
+ // Migrate themes to new model
+ {
+ int items = deprecated_settings.beginReadArray("Themes");
+
+ for(int i = 0; i < items; i++)
+ {
+ deprecated_settings.setArrayIndex(i);
+
+ QString name = deprecated_settings.value("name").toString();
+
+ DocumentStyle style;
+ style.load(deprecated_settings);
+
+ QString fileName;
+ int index = 0;
+ do {
+ fileName = DocumentStyle::createFileNameFromName(name, index);
+ index += 1;
+ } while(kristall::dirs::styles.exists(fileName));
+
+ QSettings style_sheet {
+ kristall::dirs::styles.absoluteFilePath(fileName),
+ QSettings::IniFormat
+ };
+ style_sheet.setValue("name", name);
+ style.save(style_sheet);
+ style_sheet.sync();
+ }
+
+ deprecated_settings.endArray();
+ }
+
+ // Remove old theming stuff
+ app_settings.remove("Theme");
+ app_settings.remove("Themes");
+
+ // Migrate "current theme" to new format
+ {
+ DocumentStyle current_style;
+ deprecated_settings.beginGroup("Theme");
+ current_style.load(deprecated_settings);
+ deprecated_settings.endGroup();
+
+ app_settings.beginGroup("Theme");
+ current_style.save(app_settings);
+ app_settings.endGroup();
+ }
+
+ deprecated_settings.setValue("deprecated", true);
+ }
+ else
+ {
+ qDebug() << "Migration complete. Please delete" << deprecated_settings.fileName();
+ }
+ }
+ }
+
+ kristall::settings = &app_settings;
- kristall::offline_pages = derive_dir(kristall::cache_root, "offline-pages");
- kristall::themes = derive_dir(kristall::config_root, "themes");
- kristall::styles = derive_dir(kristall::config_root, "styles");
+ kristall::options.load(app_settings);
- global_options.load(global_settings);
+ app_settings.beginGroup("Protocols");
+ kristall::protocols.load(app_settings);
+ app_settings.endGroup();
- global_settings.beginGroup("Client Identities");
- global_identities.load(global_settings);
- global_settings.endGroup();
+ app_settings.beginGroup("Client Identities");
+ kristall::identities.load(app_settings);
+ app_settings.endGroup();
- global_settings.beginGroup("Trusted Servers");
- global_gemini_trust.load(global_settings);
- global_settings.endGroup();
+ app_settings.beginGroup("Trusted Servers");
+ kristall::trust::gemini.load(app_settings);
+ app_settings.endGroup();
- global_settings.beginGroup("Trusted HTTPS Servers");
- global_https_trust.load(global_settings);
- global_settings.endGroup();
+ app_settings.beginGroup("Trusted HTTPS Servers");
+ kristall::trust::https.load(app_settings);
+ app_settings.endGroup();
- global_favourites.load(global_settings);
+ app_settings.beginGroup("Theme");
+ kristall::document_style.load(app_settings);
+ app_settings.endGroup();
+
+ kristall::favourites.load(app_settings);
MainWindow w(&app);
@@ -106,9 +193,29 @@ int main(int argc, char *argv[])
else {
w.addEmptyTab(true, true);
}
+
+ app_settings.beginGroup("Window State");
+ if(app_settings.contains("geometry")) {
+ w.restoreGeometry(app_settings.value("geometry").toByteArray());
+ }
+ if(app_settings.contains("state")) {
+ w.restoreState(app_settings.value("state").toByteArray());
+ }
+ app_settings.endGroup();
+
+
w.show();
- return app.exec();
+ int exit_code = app.exec();
+
+ app_settings.beginGroup("Window State");
+ app_settings.setValue("geometry", w.saveGeometry());
+ app_settings.setValue("state", w.saveState());
+ app_settings.endGroup();
+
+ kristall::saveSettings();
+
+ return exit_code;
}
void GenericSettings::load(QSettings &settings)
@@ -161,3 +268,36 @@ void GenericSettings::save(QSettings &settings) const
settings.setValue("redirection_policy", int(redirection_policy));
settings.setValue("network_timeout", network_timeout);
}
+
+
+void kristall::saveSettings()
+{
+ assert(app_settings_ptr != nullptr);
+ QSettings & app_settings = *app_settings_ptr;
+
+ kristall::favourites.save(app_settings);
+
+ app_settings.beginGroup("Protocols");
+ kristall::protocols.save(app_settings);
+ app_settings.endGroup();
+
+ app_settings.beginGroup("Client Identities");
+ kristall::identities.save(app_settings);
+ app_settings.endGroup();
+
+ app_settings.beginGroup("Trusted Servers");
+ kristall::trust::gemini.save(app_settings);
+ app_settings.endGroup();
+
+ app_settings.beginGroup("Trusted HTTPS Servers");
+ kristall::trust::https.save(app_settings);
+ app_settings.endGroup();
+
+ app_settings.beginGroup("Theme");
+ kristall::document_style.save(app_settings);
+ app_settings.endGroup();
+
+ kristall::options.save(app_settings);
+
+ app_settings.sync();
+}