diff options
| author | Felix (xq) Queißner <git@mq32.de> | 2020-06-28 16:30:52 +0200 |
|---|---|---|
| committer | Felix (xq) Queißner <git@mq32.de> | 2020-06-28 16:30:52 +0200 |
| commit | 6edd9e7a12a3827fb6aac62a88be01085e41e176 (patch) | |
| tree | 4513475c7efaea92a154ff20e970ed3d4b475b7c /src/main.cpp | |
| parent | a53e490d2e96d22a24293019921af26e00f2bf7a (diff) | |
| download | kristall-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.cpp | 216 |
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(); +} |
