aboutsummaryrefslogtreecommitdiff
path: root/src
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
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')
-rw-r--r--src/browsertab.cpp38
-rw-r--r--src/dialogs/certificatemanagementdialog.cpp34
-rw-r--r--src/dialogs/certificatemanagementdialog.hpp6
-rw-r--r--src/dialogs/certificatemanagementdialog.ui2
-rw-r--r--src/dialogs/certificateselectiondialog.cpp10
-rw-r--r--src/dialogs/newidentitiydialog.cpp2
-rw-r--r--src/dialogs/settingsdialog.cpp40
-rw-r--r--src/documentstyle.cpp232
-rw-r--r--src/documentstyle.hpp3
-rw-r--r--src/identitycollection.cpp63
-rw-r--r--src/identitycollection.hpp5
-rw-r--r--src/kristall.hpp45
-rw-r--r--src/main.cpp216
-rw-r--r--src/mainwindow.cpp101
-rw-r--r--src/mainwindow.hpp6
-rw-r--r--src/protocols/abouthandler.cpp2
-rw-r--r--src/protocols/geminiclient.cpp4
-rw-r--r--src/protocols/webclient.cpp4
-rw-r--r--src/protocolsetup.cpp4
-rw-r--r--src/renderers/geminirenderer.cpp2
-rw-r--r--src/renderers/gophermaprenderer.cpp2
-rw-r--r--src/widgets/searchbar.cpp2
22 files changed, 567 insertions, 256 deletions
diff --git a/src/browsertab.cpp b/src/browsertab.cpp
index c47858f..c979b4c 100644
--- a/src/browsertab.cpp
+++ b/src/browsertab.cpp
@@ -110,7 +110,7 @@ BrowserTab::~BrowserTab()
void BrowserTab::navigateTo(const QUrl &url, PushToHistory mode)
{
- if (mainWindow->protocols.isSchemeSupported(url.scheme()) != ProtocolSetup::Enabled)
+ if (kristall::protocols.isSchemeSupported(url.scheme()) != ProtocolSetup::Enabled)
{
QMessageBox::warning(this, "Kristall", "URI scheme not supported or disabled: " + url.scheme());
return;
@@ -180,11 +180,11 @@ void BrowserTab::toggleIsFavourite(bool isFavourite)
{
if (isFavourite)
{
- global_favourites.add(this->current_location);
+ kristall::favourites.add(this->current_location);
}
else
{
- global_favourites.remove(this->current_location);
+ kristall::favourites.remove(this->current_location);
}
this->updateUI();
@@ -425,11 +425,11 @@ void BrowserTab::on_requestComplete(const QByteArray &ref_data, const QString &m
this->outline.clear();
- auto doc_style = mainWindow->current_style.derive(this->current_location);
+ auto doc_style = kristall::document_style.derive(this->current_location);
this->ui->text_browser->setStyleSheet(QString("QTextBrowser { background-color: %1; }").arg(doc_style.background_color.name()));
- bool plaintext_only = (global_options.text_display == GenericSettings::PlainText);
+ bool plaintext_only = (kristall::options.text_display == GenericSettings::PlainText);
if (not plaintext_only and mime.is("text", "gemini"))
{
@@ -587,7 +587,7 @@ void BrowserTab::on_redirected(const QUrl &uri, bool is_permanent)
this->network_timeout_timer.stop();
- if (redirection_count >= global_options.max_redirections)
+ if (redirection_count >= kristall::options.max_redirections)
{
setErrorMessage(QString("Too many consecutive redirections. The last redirection would have redirected you to:\r\n%1").arg(uri.toString(QUrl::FullyEncoded)));
return;
@@ -598,7 +598,7 @@ void BrowserTab::on_redirected(const QUrl &uri, bool is_permanent)
bool is_cross_host = (this->current_location.host() != uri.host());
QString question;
- if(global_options.redirection_policy == GenericSettings::WarnAlways)
+ if(kristall::options.redirection_policy == GenericSettings::WarnAlways)
{
question = QString(
"The location you visited wants to redirect you to another location:\r\n"
@@ -606,7 +606,7 @@ void BrowserTab::on_redirected(const QUrl &uri, bool is_permanent)
"Do you want to allow the redirection?"
).arg(uri.toString(QUrl::FullyEncoded));
}
- else if((global_options.redirection_policy & (GenericSettings::WarnOnHostChange | GenericSettings::WarnOnSchemeChange)) and is_cross_protocol and is_cross_host)
+ else if((kristall::options.redirection_policy & (GenericSettings::WarnOnHostChange | GenericSettings::WarnOnSchemeChange)) and is_cross_protocol and is_cross_host)
{
question = QString(
"The location you visited wants to redirect you to another host and switch the protocol.\r\n"
@@ -615,7 +615,7 @@ void BrowserTab::on_redirected(const QUrl &uri, bool is_permanent)
"Do you want to allow the redirection?"
).arg(uri.scheme()).arg(uri.host());
}
- else if((global_options.redirection_policy & GenericSettings::WarnOnSchemeChange) and is_cross_protocol)
+ else if((kristall::options.redirection_policy & GenericSettings::WarnOnSchemeChange) and is_cross_protocol)
{
question = QString(
"The location you visited wants to switch the protocol.\r\n"
@@ -623,7 +623,7 @@ void BrowserTab::on_redirected(const QUrl &uri, bool is_permanent)
"Do you want to allow the redirection?"
).arg(uri.scheme());
}
- else if((global_options.redirection_policy & GenericSettings::WarnOnHostChange) and is_cross_host)
+ else if((kristall::options.redirection_policy & GenericSettings::WarnOnHostChange) and is_cross_host)
{
question = QString(
"The location you visited wants to redirect you to another host.\r\n"
@@ -720,10 +720,10 @@ void BrowserTab::on_text_browser_anchorClicked(const QUrl &url)
}
if(this->current_location.scheme() == "gemini") {
- global_gemini_trust.addTrust(this->current_location, this->current_server_certificate);
+ kristall::trust::gemini.addTrust(this->current_location, this->current_server_certificate);
}
else if(this->current_location.scheme() == "https") {
- global_https_trust.addTrust(this->current_location, this->current_server_certificate);
+ kristall::trust::https.addTrust(this->current_location, this->current_server_certificate);
}
else {
assert(false and "missing protocol implementation!");
@@ -745,7 +745,7 @@ void BrowserTab::on_text_browser_anchorClicked(const QUrl &url)
if (real_url.isRelative())
real_url = this->current_location.resolved(url);
- auto support = mainWindow->protocols.isSchemeSupported(real_url.scheme());
+ auto support = kristall::protocols.isSchemeSupported(real_url.scheme());
if (support == ProtocolSetup::Enabled)
{
@@ -757,7 +757,7 @@ void BrowserTab::on_text_browser_anchorClicked(const QUrl &url)
}
else
{
- if (global_options.use_os_scheme_handler)
+ if (kristall::options.use_os_scheme_handler)
{
if (not QDesktopServices::openUrl(url))
{
@@ -806,7 +806,7 @@ void BrowserTab::on_requestProgress(qint64 transferred)
emit this->fileLoaded(this->current_stats);
this->network_timeout_timer.stop();
- this->network_timeout_timer.start(global_options.network_timeout);
+ this->network_timeout_timer.start(kristall::options.network_timeout);
}
void BrowserTab::on_back_button_clicked()
@@ -830,7 +830,7 @@ void BrowserTab::updateUI()
this->ui->stop_button->setVisible(in_progress);
this->ui->fav_button->setEnabled(this->successfully_loaded);
- this->ui->fav_button->setChecked(global_favourites.contains(this->current_location));
+ this->ui->fav_button->setChecked(kristall::favourites.contains(this->current_location));
}
bool BrowserTab::trySetClientCertificate(const QString &query)
@@ -939,7 +939,7 @@ bool BrowserTab::startRequest(const QUrl &url, ProtocolHandler::RequestOptions o
}
}
else if(not this->current_identity.isValid()) {
- for(auto ident_ptr : global_identities.allIdentities())
+ for(auto ident_ptr : kristall::identities.allIdentities())
{
if(ident_ptr->isAutomaticallyEnabledOn(url)) {
@@ -969,7 +969,7 @@ bool BrowserTab::startRequest(const QUrl &url, ProtocolHandler::RequestOptions o
this->current_location = url;
this->ui->url_bar->setText(url.toString(QUrl::FormattingOptions(QUrl::FullyEncoded)));
- this->network_timeout_timer.start(global_options.network_timeout);
+ this->network_timeout_timer.start(kristall::options.network_timeout);
return this->current_handler->startRequest(url, options);
}
@@ -1016,7 +1016,7 @@ void BrowserTab::on_text_browser_customContextMenuRequested(const QPoint &pos)
});
connect(menu.addAction("Copy link"), &QAction::triggered, [real_url]() {
- global_clipboard->setText(real_url.toString(QUrl::FullyEncoded));
+ kristall::clipboard->setText(real_url.toString(QUrl::FullyEncoded));
});
menu.addSeparator();
diff --git a/src/dialogs/certificatemanagementdialog.cpp b/src/dialogs/certificatemanagementdialog.cpp
index 5141b30..1ed78dd 100644
--- a/src/dialogs/certificatemanagementdialog.cpp
+++ b/src/dialogs/certificatemanagementdialog.cpp
@@ -17,7 +17,7 @@ CertificateManagementDialog::CertificateManagementDialog(QWidget *parent) :
{
ui->setupUi(this);
- this->ui->certificates->setModel(&global_identities);
+ this->ui->certificates->setModel(&identity_set);
this->ui->certificates->expandAll();
connect(
@@ -34,11 +34,23 @@ CertificateManagementDialog::~CertificateManagementDialog()
delete ui;
}
+IdentityCollection CertificateManagementDialog::identitySet() const
+{
+ return this->identity_set;
+}
+
+void CertificateManagementDialog::setIdentitySet(const IdentityCollection &src)
+{
+ this->identity_set = src;
+ this->ui->certificates->expandAll();
+
+}
+
void CertificateManagementDialog::on_certificates_selected(QModelIndex const& index, QModelIndex const & previous)
{
Q_UNUSED(previous);
- selected_identity = global_identities.getMutableIdentity(index);
+ selected_identity = identity_set.getMutableIdentity(index);
this->ui->export_cert_button->setEnabled(selected_identity != nullptr);
@@ -70,8 +82,8 @@ void CertificateManagementDialog::on_certificates_selected(QModelIndex const& in
this->ui->cert_host_filter->setText("");
this->ui->cert_auto_enable->setChecked(false);
- if(auto group_name = global_identities.group(index); not group_name.isEmpty()) {
- this->ui->delete_cert_button->setEnabled(global_identities.canDeleteGroup(group_name));
+ if(auto group_name = identity_set.group(index); not group_name.isEmpty()) {
+ this->ui->delete_cert_button->setEnabled(identity_set.canDeleteGroup(group_name));
} else {
this->ui->delete_cert_button->setEnabled(false);
}
@@ -97,7 +109,7 @@ void CertificateManagementDialog::on_delete_cert_button_clicked()
{
auto index = this->ui->certificates->currentIndex();
- if(global_identities.getMutableIdentity(index) != nullptr)
+ if(identity_set.getMutableIdentity(index) != nullptr)
{
auto answer = QMessageBox::question(
this,
@@ -108,11 +120,11 @@ void CertificateManagementDialog::on_delete_cert_button_clicked()
);
if(answer != QMessageBox::Yes)
return;
- if(not global_identities.destroyIdentity(index)) {
+ if(not identity_set.destroyIdentity(index)) {
QMessageBox::warning(this, "Kristall", "Could not destroy identity!");
}
}
- else if(auto group_name = global_identities.group(index); not group_name.isEmpty()) {
+ else if(auto group_name = identity_set.group(index); not group_name.isEmpty()) {
auto answer = QMessageBox::question(
this,
@@ -122,7 +134,7 @@ void CertificateManagementDialog::on_delete_cert_button_clicked()
if(answer != QMessageBox::Yes)
return;
- if(not global_identities.deleteGroup(group_name)) {
+ if(not identity_set.deleteGroup(group_name)) {
QMessageBox::warning(this, "Kristall", "Could not delete group!");
}
}
@@ -261,7 +273,7 @@ void CertificateManagementDialog::on_import_cert_button_clicked()
return;
}
- if(not global_identities.addCertificate(tr("Imported Certificates"), ident)) {
+ if(not identity_set.addCertificate(tr("Imported Certificates"), ident)) {
QMessageBox::warning(
this,
"Kristall",
@@ -274,7 +286,7 @@ void CertificateManagementDialog::on_create_cert_button_clicked()
{
NewIdentitiyDialog dialog { this };
- dialog.setGroupName(global_identities.group(this->ui->certificates->currentIndex()));
+ dialog.setGroupName(identity_set.group(this->ui->certificates->currentIndex()));
if(dialog.exec() != QDialog::Accepted)
return;
@@ -284,7 +296,7 @@ void CertificateManagementDialog::on_create_cert_button_clicked()
return;
id.is_persistent = true;
- global_identities.addCertificate(
+ identity_set.addCertificate(
dialog.groupName(),
id);
}
diff --git a/src/dialogs/certificatemanagementdialog.hpp b/src/dialogs/certificatemanagementdialog.hpp
index 0d7178a..23c07fa 100644
--- a/src/dialogs/certificatemanagementdialog.hpp
+++ b/src/dialogs/certificatemanagementdialog.hpp
@@ -4,6 +4,7 @@
#include <QDialog>
#include "cryptoidentity.hpp"
+#include "identitycollection.hpp"
namespace Ui {
class CertificateManagementDialog;
@@ -17,6 +18,9 @@ public:
explicit CertificateManagementDialog(QWidget *parent = nullptr);
~CertificateManagementDialog();
+ IdentityCollection identitySet() const;
+ void setIdentitySet(IdentityCollection const & src);
+
private slots:
void on_cert_notes_textChanged();
@@ -39,6 +43,8 @@ private:
private:
Ui::CertificateManagementDialog *ui;
+ IdentityCollection identity_set;
+
CryptoIdentity * selected_identity;
};
diff --git a/src/dialogs/certificatemanagementdialog.ui b/src/dialogs/certificatemanagementdialog.ui
index 8fe3f8b..596448f 100644
--- a/src/dialogs/certificatemanagementdialog.ui
+++ b/src/dialogs/certificatemanagementdialog.ui
@@ -255,7 +255,7 @@
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
- <set>QDialogButtonBox::Ok</set>
+ <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
diff --git a/src/dialogs/certificateselectiondialog.cpp b/src/dialogs/certificateselectiondialog.cpp
index f4dab38..4caf988 100644
--- a/src/dialogs/certificateselectiondialog.cpp
+++ b/src/dialogs/certificateselectiondialog.cpp
@@ -16,7 +16,7 @@ CertificateSelectionDialog::CertificateSelectionDialog(QWidget *parent) :
ui->setupUi(this);
this->ui->server_request->setVisible(false);
- this->ui->certificates->setModel(&global_identities);
+ this->ui->certificates->setModel(&kristall::identities);
this->ui->certificates->expandAll();
connect(this->ui->certificates->selectionModel(), &QItemSelectionModel::currentChanged, this, &CertificateSelectionDialog::on_currentChanged);
@@ -86,7 +86,7 @@ void CertificateSelectionDialog::on_currentChanged(const QModelIndex &current, c
{
Q_UNUSED(current)
Q_UNUSED(previous)
- auto id = global_identities.getIdentity(current);
+ auto id = kristall::identities.getIdentity(current);
this->ui->use_selected_cert->setEnabled(id.isValid());
}
@@ -103,7 +103,7 @@ void CertificateSelectionDialog::on_create_new_cert_clicked()
return;
id.is_persistent = true;
- global_identities.addCertificate(
+ kristall::identities.addCertificate(
dialog.groupName(),
id);
}
@@ -111,7 +111,7 @@ void CertificateSelectionDialog::on_create_new_cert_clicked()
void CertificateSelectionDialog::on_use_selected_cert_clicked()
{
auto sel = this->ui->certificates->selectionModel()->currentIndex();
- this->cryto_identity = global_identities.getIdentity(sel);
+ this->cryto_identity = kristall::identities.getIdentity(sel);
if(this->cryto_identity.isValid()) {
this->accept();
} else {
@@ -121,7 +121,7 @@ void CertificateSelectionDialog::on_use_selected_cert_clicked()
void CertificateSelectionDialog::on_certificates_doubleClicked(const QModelIndex &index)
{
- this->cryto_identity = global_identities.getIdentity(index);
+ this->cryto_identity = kristall::identities.getIdentity(index);
if(this->cryto_identity.isValid()) {
this->accept();
} else {
diff --git a/src/dialogs/newidentitiydialog.cpp b/src/dialogs/newidentitiydialog.cpp
index af2a97e..30e0cc6 100644
--- a/src/dialogs/newidentitiydialog.cpp
+++ b/src/dialogs/newidentitiydialog.cpp
@@ -19,7 +19,7 @@ NewIdentitiyDialog::NewIdentitiyDialog(QWidget *parent) :
ui->expiration_date->setTime(QTime(12, 00));
ui->group->clear();
- for(auto group_name : global_identities.groups())
+ for(auto group_name : kristall::identities.groups())
{
ui->group->addItem(group_name);
}
diff --git a/src/dialogs/settingsdialog.cpp b/src/dialogs/settingsdialog.cpp
index ebd1664..980957c 100644
--- a/src/dialogs/settingsdialog.cpp
+++ b/src/dialogs/settingsdialog.cpp
@@ -36,30 +36,29 @@ SettingsDialog::SettingsDialog(QWidget *parent) :
setGeminiStyle(DocumentStyle { });
- int items = global_settings.beginReadArray("Themes");
-
this->predefined_styles.clear();
- for(int i = 0; i < items; i++)
+ for(auto const & fileName : kristall::dirs::styles.entryList())
{
- global_settings.setArrayIndex(i);
+ QSettings style_sheet {
+ kristall::dirs::styles.absoluteFilePath(fileName),
+ QSettings::IniFormat
+ };
- QString name = global_settings.value("name").toString();
+ QString name = style_sheet.value("name").toString();
DocumentStyle style;
- style.load(global_settings);
+ style.load(style_sheet);
this->predefined_styles.insert(name, style);
}
- global_settings.endArray();
-
this->ui->presets->clear();
for(auto const & style_name : this->predefined_styles.keys())
{
this->ui->presets->addItem(style_name);
}
- if(items > 0) {
+ if(this->predefined_styles.size() > 0) {
on_presets_currentIndexChanged(0);
} else {
this->on_presets_currentIndexChanged(-1);
@@ -461,19 +460,28 @@ void SettingsDialog::on_preset_load_clicked()
void SettingsDialog::on_SettingsDialog_accepted()
{
- global_settings.beginWriteArray("Themes", this->predefined_styles.size());
+ QStringList files = kristall::dirs::styles.entryList();
- int index = 0;
for(auto const & style_name : this->predefined_styles.keys())
{
- global_settings.setArrayIndex(index);
+ QString fileName = DocumentStyle::createFileNameFromName(style_name, 0);
+ files.removeAll(fileName);
+
+ QSettings style_sheet {
+ kristall::dirs::styles.absoluteFilePath(fileName),
+ QSettings::IniFormat
+ };
- global_settings.setValue("name", style_name);
- this->predefined_styles.value(style_name).save(global_settings);
+ style_sheet.setValue("name", style_name);
+ this->predefined_styles.value(style_name).save(style_sheet);
- index += 1;
+ style_sheet.sync();
+ }
+
+ for(auto const & fileName : files)
+ {
+ kristall::dirs::styles.remove(fileName);
}
- global_settings.endArray();
}
void SettingsDialog::on_preset_import_clicked()
diff --git a/src/documentstyle.cpp b/src/documentstyle.cpp
index 6608d5b..7056cec 100644
--- a/src/documentstyle.cpp
+++ b/src/documentstyle.cpp
@@ -7,6 +7,7 @@
#include <QCryptographicHash>
#include <QDebug>
+#include <cctype>
#include <array>
#include <cmath>
@@ -115,24 +116,24 @@ static QString encodeCssFont (const QFont& refFont)
}
DocumentStyle::DocumentStyle() : theme(Fixed),
- standard_font(),
- h1_font(),
- h2_font(),
- h3_font(),
- preformatted_font(),
- background_color("#edefff"),
- standard_color(0x00, 0x00, 0x00),
- preformatted_color(0x00, 0x00, 0x00),
- h1_color("#022f90"),
- h2_color("#022f90"),
- h3_color("#022f90"),
- blockquote_color("#FFFFFF"),
- internal_link_color("#0e8fff"),
- external_link_color("#0e8fff"),
- cross_scheme_link_color("#0960a7"),
- internal_link_prefix("→ "),
- external_link_prefix("⇒ "),
- margin(55.0)
+ standard_font(),
+ h1_font(),
+ h2_font(),
+ h3_font(),
+ preformatted_font(),
+ background_color("#edefff"),
+ standard_color(0x00, 0x00, 0x00),
+ preformatted_color(0x00, 0x00, 0x00),
+ h1_color("#022f90"),
+ h2_color("#022f90"),
+ h3_color("#022f90"),
+ blockquote_color("#FFFFFF"),
+ internal_link_color("#0e8fff"),
+ external_link_color("#0e8fff"),
+ cross_scheme_link_color("#0960a7"),
+ internal_link_prefix("→ "),
+ external_link_prefix("⇒ "),
+ margin(55.0)
{
preformatted_font.setFamily("monospace");
preformatted_font.setPointSizeF(10.0);
@@ -153,61 +154,174 @@ DocumentStyle::DocumentStyle() : theme(Fixed),
h3_font.setPointSizeF(12.0);
}
+QString DocumentStyle::createFileNameFromName(const QString &src, int index)
+{
+ QString result;
+ result.reserve(src.size() + 5);
+ for(int i = 0; i < src.size(); i++)
+ {
+ QChar c = src.at(i);
+ if(c.isLetterOrNumber()) {
+ result.append(c.toLower());
+ }
+ else if(c.isSpace()) {
+ result.append('-');
+ }
+ else {
+ result.append(QString("").arg(c.unicode()));
+ }
+ }
+
+ if(index > 0) {
+ result.append(QString("-%1").arg(index));
+ }
+ result.append(".kthm");
+ return result;
+}
+
bool DocumentStyle::save(QSettings &settings) const
{
- settings.setValue("standard_font", standard_font.toString());
- settings.setValue("h1_font", h1_font.toString());
- settings.setValue("h2_font", h2_font.toString());
- settings.setValue("h3_font", h3_font.toString());
- settings.setValue("preformatted_font", preformatted_font.toString());
+ settings.setValue("version", 1);
+ settings.setValue("theme", int(theme));
settings.setValue("background_color", background_color.name());
- settings.setValue("standard_color", standard_color.name());
- settings.setValue("preformatted_color", preformatted_color.name());
settings.setValue("blockquote_color", blockquote_color.name());
- settings.setValue("h1_color", h1_color.name());
- settings.setValue("h2_color", h2_color.name());
- settings.setValue("h3_color", h3_color.name());
- settings.setValue("internal_link_color", internal_link_color.name());
- settings.setValue("external_link_color", external_link_color.name());
- settings.setValue("cross_scheme_link_color", cross_scheme_link_color.name());
-
- settings.setValue("internal_link_prefix", internal_link_prefix);
- settings.setValue("external_link_prefix", external_link_prefix);
settings.setValue("margins", margin);
- settings.setValue("theme", int(theme));
+
+ {
+ settings.beginGroup("Standard");
+ settings.setValue("font", standard_font.toString());
+ settings.setValue("color", standard_color.name());
+ settings.endGroup();
+ }
+ {
+ settings.beginGroup("Preformatted");
+ settings.setValue("font", preformatted_font.toString());
+ settings.setValue("color", preformatted_color.name());
+ settings.endGroup();
+ }
+ {
+ settings.beginGroup("H1");
+ settings.setValue("font", h1_font.toString());
+ settings.setValue("color", h1_color.name());
+ settings.endGroup();
+ }
+ {
+ settings.beginGroup("H2");
+ settings.setValue("font", h2_font.toString());
+ settings.setValue("color", h2_color.name());
+ settings.endGroup();
+ }
+ {
+ settings.beginGroup("H3");
+ settings.setValue("font", h3_font.toString());
+ settings.setValue("color", h3_color.name());
+ settings.endGroup();
+ }
+ {
+ settings.beginGroup("Link");
+
+ settings.setValue("color_internal", internal_link_color.name());
+ settings.setValue("color_external", external_link_color.name());
+ settings.setValue("color_cross_scheme", cross_scheme_link_color.name());
+
+ settings.setValue("internal_prefix", internal_link_prefix);
+ settings.setValue("external_prefix", external_link_prefix);
+
+ settings.endGroup();
+ }
+
return true;
}
bool DocumentStyle::load(QSettings &settings)
{
- if(settings.contains("standard_color"))
+ switch(settings.value("version", 0).toInt())
{
- standard_font.fromString(settings.value("standard_font").toString());
- h1_font.fromString(settings.value("h1_font").toString());
- h2_font.fromString(settings.value("h2_font").toString());
- h3_font.fromString(settings.value("h3_font").toString());
- preformatted_font.fromString(settings.value("preformatted_font").toString());
-
- background_color = QColor(settings.value("background_color").toString());
- standard_color = QColor(settings.value("standard_color").toString());
- preformatted_color = QColor(settings.value("preformatted_color").toString());
- blockquote_color = QColor(settings.value("blockquote_color").toString());
- h1_color = QColor(settings.value("h1_color").toString());
- h2_color = QColor(settings.value("h2_color").toString());
- h3_color = QColor(settings.value("h3_color").toString());
- internal_link_color = QColor(settings.value("internal_link_color").toString());
- external_link_color = QColor(settings.value("external_link_color").toString());
- cross_scheme_link_color = QColor(settings.value("cross_scheme_link_color").toString());
-
- internal_link_prefix = settings.value("internal_link_prefix").toString();
- external_link_prefix = settings.value("external_link_prefix").toString();
-
- margin = settings.value("margins").toDouble();
- theme = Theme(settings.value("theme").toInt());
+ case 0: {
+ if(settings.contains("standard_color"))
+ {
+ standard_font.fromString(settings.value("standard_font").toString());
+ h1_font.fromString(settings.value("h1_font").toString());
+ h2_font.fromString(settings.value("h2_font").toString());
+ h3_font.fromString(settings.value("h3_font").toString());
+ preformatted_font.fromString(settings.value("preformatted_font").toString());
+
+ background_color = QColor(settings.value("background_color").toString());
+ standard_color = QColor(settings.value("standard_color").toString());
+ preformatted_color = QColor(settings.value("preformatted_color").toString());
+ blockquote_color = QColor(settings.value("blockquote_color").toString());
+ h1_color = QColor(settings.value("h1_color").toString());
+ h2_color = QColor(settings.value("h2_color").toString());
+ h3_color = QColor(settings.value("h3_color").toString());
+ internal_link_color = QColor(settings.value("internal_link_color").toString());
+ external_link_color = QColor(settings.value("external_link_color").toString());
+ cross_scheme_link_color = QColor(settings.value("cross_scheme_link_color").toString());
+
+ internal_link_prefix = settings.value("internal_link_prefix").toString();
+ external_link_prefix = settings.value("external_link_prefix").toString();
+
+ margin = settings.value("margins").toDouble();
+ theme = Theme(settings.value("theme").toInt());
+ }
+ return true;
}
- return true;
+ case 1: {
+ theme = Theme(settings.value("theme", int(theme)).toInt());
+
+ background_color = QColor { settings.value("background_color", background_color.name()).toString() };
+ blockquote_color = QColor { settings.value("blockquote_color", blockquote_color.name()).toString() };
+
+ margin = settings.value("margins", 55).toInt();
+
+ {
+ settings.beginGroup("Standard");
+ standard_font.fromString(settings.value("font", standard_font.toString()).toString());
+ standard_color = QString { settings.value("color", standard_color.name()).toString() };
+ settings.endGroup();
+ }
+ {
+ settings.beginGroup("Preformatted");
+ preformatted_font.fromString(settings.value("font", preformatted_font.toString()).toString());
+ preformatted_color = QString { settings.value("color", preformatted_color.name()).toString() };
+ settings.endGroup();
+ }
+ {
+ settings.beginGroup("H1");
+ h1_font.fromString(settings.value("font", h1_font.toString()).toString());
+ h1_color = QString { settings.value("color", h1_color.name()).toString() };
+ settings.endGroup();
+ }
+ {
+ settings.beginGroup("H2");
+ h2_font.fromString(settings.value("font", h2_font.toString()).toString());
+ h2_color = QString { settings.value("color", h2_color.name()).toString() };
+ settings.endGroup();
+ }
+ {
+ settings.beginGroup("H3");
+ h3_font.fromString(settings.value("font", h3_font.toString()).toString());
+ h3_color = QString { settings.value("color", h3_color.name()).toString() };
+ settings.endGroup();
+ }
+ {
+ settings.beginGroup("Link");
+
+ internal_link_color = QString { settings.value("color_internal", internal_link_color.name()).toString() };
+ external_link_color = QString {settings.value("color_external", external_link_color.name()).toString() };
+ cross_scheme_link_color = QString {settings.value("color_cross_scheme", cross_scheme_link_color.name()).toString() };
+
+ internal_link_prefix = settings.value("internal_prefix", internal_link_prefix).toString();
+ external_link_prefix = settings.value("external_prefix", external_link_prefix).toString();
+
+ settings.endGroup();
+ }
+
+ return true;
+ }
+ }
+ return false;
}
DocumentStyle DocumentStyle::derive(const QUrl &url) const
diff --git a/src/documentstyle.hpp b/src/documentstyle.hpp
index 6692cfd..eb01912 100644
--- a/src/documentstyle.hpp
+++ b/src/documentstyle.hpp
@@ -16,6 +16,9 @@ struct DocumentStyle
DocumentStyle();
+ //! Calculates a filtered/legal file name with all non-allowed chars escaped
+ static QString createFileNameFromName(QString const & src, int index);
+
Theme theme;
QFont standard_font;
diff --git a/src/identitycollection.cpp b/src/identitycollection.cpp
index e839996..d68ab11 100644
--- a/src/identitycollection.cpp
+++ b/src/identitycollection.cpp
@@ -13,6 +13,69 @@ IdentityCollection::IdentityCollection(QObject *parent)
}
+IdentityCollection::IdentityCollection(const IdentityCollection &other)
+{
+ for(auto const & grp : other.root.children)
+ {
+ auto const & src_group = grp->as<GroupNode>();
+ auto dst_group = std::make_unique<GroupNode>();
+
+ dst_group->title = src_group.title;
+
+ for(auto const & id : src_group.children) {
+ auto const & src_id = id->as<IdentityNode>();
+ auto dst_id = std::make_unique<IdentityNode>();
+
+ dst_id->identity = src_id.identity;
+
+ dst_group->children.emplace_back(std::move(dst_id));
+ }
+
+ root.children.emplace_back(std::move(dst_group));
+ }
+
+
+ relayout();
+}
+
+IdentityCollection &IdentityCollection::operator=(const IdentityCollection & other)
+{
+ beginResetModel();
+
+ root.children.clear();
+ for(auto const & grp : other.root.children)
+ {
+ auto const & src_group = grp->as<GroupNode>();
+ auto dst_group = std::make_unique<GroupNode>();
+
+ dst_group->title = src_group.title;
+
+ for(auto const & id : src_group.children) {
+ auto const & src_id = id->as<IdentityNode>();
+ auto dst_id = std::make_unique<IdentityNode>();
+
+ dst_id->identity = src_id.identity;
+
+ dst_group->children.emplace_back(std::move(dst_id));
+ }
+
+ root.children.emplace_back(std::move(dst_group));
+ }
+
+ this->relayout();
+ endResetModel();
+ return *this;
+}
+
+IdentityCollection &IdentityCollection::operator=(IdentityCollection && other)
+{
+ beginResetModel();
+ this->root.children = std::move(other.root.children);
+ this->relayout();
+ endResetModel();
+ return *this;
+}
+
void IdentityCollection::load(QSettings &settings)
{
this->beginResetModel();
diff --git a/src/identitycollection.hpp b/src/identitycollection.hpp
index 82d48a6..0aaac09 100644
--- a/src/identitycollection.hpp
+++ b/src/identitycollection.hpp
@@ -46,6 +46,11 @@ class IdentityCollection : public QAbstractItemModel
public:
explicit IdentityCollection(QObject *parent = nullptr);
+ IdentityCollection(IdentityCollection const & other);
+
+ IdentityCollection & operator=(IdentityCollection const &);
+ IdentityCollection & operator=(IdentityCollection &&);
+
public:
void load(QSettings & settings);
diff --git a/src/kristall.hpp b/src/kristall.hpp
index cbe2510..ef9ab10 100644
--- a/src/kristall.hpp
+++ b/src/kristall.hpp
@@ -9,6 +9,8 @@
#include "identitycollection.hpp"
#include "ssltrust.hpp"
#include "favouritecollection.hpp"
+#include "protocolsetup.hpp"
+#include "documentstyle.hpp"
enum class Theme : int
{
@@ -52,14 +54,6 @@ struct GenericSettings
//! `:`-separated SHA256 hash
QString toFingerprintString(QSslCertificate const & certificate);
-extern QSettings global_settings;
-extern IdentityCollection global_identities;
-extern QClipboard * global_clipboard;
-extern SslTrust global_gemini_trust;
-extern SslTrust global_https_trust;
-extern FavouriteCollection global_favourites;
-extern GenericSettings global_options;
-
///
/// Kristall directory structure:
/// ~/.cache/kristall/
@@ -72,11 +66,36 @@ extern GenericSettings global_options;
///
namespace kristall
{
- extern QDir config_root;
- extern QDir cache_root;
- extern QDir offline_pages;
- extern QDir themes;
- extern QDir styles;
+ extern ProtocolSetup protocols;
+
+ extern QSettings * settings;
+ extern IdentityCollection identities;
+ extern QClipboard * clipboard;
+ extern FavouriteCollection favourites;
+ extern GenericSettings options;
+
+ extern DocumentStyle document_style;
+
+ namespace trust {
+ extern SslTrust gemini;
+ extern SslTrust https;
+ }
+
+ namespace dirs {
+ extern QDir config_root;
+ extern QDir cache_root;
+
+ //! Contains files per host
+ extern QDir offline_pages;
+
+ //! Contains custom UI themes for kristall
+ extern QDir themes;
+
+ //! Contains custom document styles / presets
+ extern QDir styles;
+ }
+
+ void saveSettings();
}
#endif // KRISTALL_HPP
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();
+}
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index 885b5b4..b0305df 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -33,13 +33,7 @@ MainWindow::MainWindow(QApplication * app, QWidget *parent) :
this->statusBar()->addPermanentWidget(this->file_size);
this->statusBar()->addPermanentWidget(this->load_time);
- this->protocols.load(global_settings);
-
- global_settings.beginGroup("Theme");
- this->current_style.load(global_settings);
- global_settings.endGroup();
-
- ui->favourites_view->setModel(&global_favourites);
+ ui->favourites_view->setModel(&kristall::favourites);
this->ui->outline_window->setVisible(false);
this->ui->history_window->setVisible(false);
@@ -58,7 +52,7 @@ MainWindow::MainWindow(QApplication * app, QWidget *parent) :
connect(this->ui->menuNavigation, &QMenu::aboutToShow, [this]() {
BrowserTab * tab = qobject_cast<BrowserTab*>(this->ui->browser_tabs->currentWidget());
if(tab != nullptr) {
- ui->actionAdd_to_favourites->setChecked(global_favourites.contains(tab->current_location));
+ ui->actionAdd_to_favourites->setChecked(kristall::favourites.contains(tab->current_location));
}
});
@@ -75,17 +69,6 @@ MainWindow::MainWindow(QApplication * app, QWidget *parent) :
connect(sc, &QShortcut::activated, this, &MainWindow::on_focus_inputbar);
}
- {
- global_settings.beginGroup("Window State");
- if(global_settings.contains("geometry")) {
- restoreGeometry(global_settings.value("geometry").toByteArray());
- }
- if(global_settings.contains("state")) {
- restoreState(global_settings.value("state").toByteArray());
- }
- global_settings.endGroup();
- }
-
this->ui->favourites_view->setContextMenuPolicy(Qt::CustomContextMenu);
this->ui->history_view->setContextMenuPolicy(Qt::CustomContextMenu);
@@ -94,7 +77,6 @@ MainWindow::MainWindow(QApplication * app, QWidget *parent) :
MainWindow::~MainWindow()
{
- this->saveSettings();
delete ui;
}
@@ -112,7 +94,7 @@ BrowserTab * MainWindow::addEmptyTab(bool focus_new, bool load_default)
}
if(load_default) {
- tab->navigateTo(QUrl(global_options.start_page), BrowserTab::PushImmediate);
+ tab->navigateTo(QUrl(kristall::options.start_page), BrowserTab::PushImmediate);
} else {
tab->navigateTo(QUrl("about:blank"), BrowserTab::DontPush);
}
@@ -141,41 +123,6 @@ void MainWindow::setUrlPreview(const QUrl &url)
}
}
-void MainWindow::saveSettings()
-{
- global_favourites.save(global_settings);
- this->protocols.save(global_settings);
-
- global_settings.beginGroup("Client Identities");
- global_identities.save(global_settings);
- global_settings.endGroup();
-
- global_settings.beginGroup("Trusted Servers");
- global_gemini_trust.save(global_settings);
- global_settings.endGroup();
-
- global_settings.beginGroup("Trusted HTTPS Servers");
- global_https_trust.save(global_settings);
- global_settings.endGroup();
-
- global_settings.beginGroup("Theme");
- this->current_style.save(global_settings);
- global_settings.endGroup();
-
- {
- global_settings.beginGroup("Window State");
-
- global_settings.setValue("geometry", saveGeometry());
- global_settings.setValue("state", saveState());
-
- global_settings.endGroup();
- }
-
- global_options.save(global_settings);
-
- global_settings.sync();
-}
-
void MainWindow::on_browser_tabs_currentChanged(int index)
{
if(index >= 0) {
@@ -202,7 +149,7 @@ void MainWindow::on_browser_tabs_currentChanged(int index)
void MainWindow::on_favourites_view_doubleClicked(const QModelIndex &index)
{
- if(auto url = global_favourites.get(index); url.isValid()) {
+ if(auto url = kristall::favourites.get(index); url.isValid()) {
this->addNewTab(true, url);
}
}
@@ -256,23 +203,23 @@ void MainWindow::on_actionSettings_triggered()
{
SettingsDialog dialog;
- dialog.setGeminiStyle(this->current_style);
- dialog.setProtocols(this->protocols);
- dialog.setOptions(global_options);
- dialog.setGeminiSslTrust(global_gemini_trust);
- dialog.setHttpsSslTrust(global_https_trust);
+ dialog.setGeminiStyle(kristall::document_style);
+ dialog.setProtocols(kristall::protocols);
+ dialog.setOptions(kristall::options);
+ dialog.setGeminiSslTrust(kristall::trust::gemini);
+ dialog.setHttpsSslTrust(kristall::trust::https);
if(dialog.exec() != QDialog::Accepted)
return;
- global_gemini_trust = dialog.geminiSslTrust();
- global_https_trust = dialog.httpsSslTrust();
- global_options = dialog.options();
+ kristall::trust::gemini = dialog.geminiSslTrust();
+ kristall::trust::https = dialog.httpsSslTrust();
+ kristall::options = dialog.options();
- this->protocols = dialog.protocols();
- this->current_style = dialog.geminiStyle();
+ kristall::protocols = dialog.protocols();
+ kristall::document_style = dialog.geminiStyle();
- this->saveSettings();
+ kristall::saveSettings();
this->reloadTheme();
}
@@ -338,12 +285,12 @@ void MainWindow::on_actionAbout_Qt_triggered()
void MainWindow::reloadTheme()
{
- if(global_options.theme == Theme::os_default)
+ if(kristall::options.theme == Theme::os_default)
{
application->setStyleSheet("");
QIcon::setThemeName("light");
}
- if(global_options.theme == Theme::light)
+ if(kristall::options.theme == Theme::light)
{
QFile file(":/light.qss");
file.open(QFile::ReadOnly | QFile::Text);
@@ -352,7 +299,7 @@ void MainWindow::reloadTheme()
QIcon::setThemeName("light");
}
- else if(global_options.theme == Theme::dark)
+ else if(kristall::options.theme == Theme::dark)
{
QFile file(":/dark.qss");
file.open(QFile::ReadOnly | QFile::Text);
@@ -406,7 +353,7 @@ void MainWindow::on_actionGo_to_home_triggered()
{
BrowserTab * tab = qobject_cast<BrowserTab*>(this->ui->browser_tabs->currentWidget());
if(tab != nullptr) {
- tab->navigateTo(QUrl(global_options.start_page), BrowserTab::PushImmediate);
+ tab->navigateTo(QUrl(kristall::options.start_page), BrowserTab::PushImmediate);
}
}
@@ -470,7 +417,7 @@ void MainWindow::on_history_view_customContextMenuRequested(const QPoint &pos)
void MainWindow::on_favourites_view_customContextMenuRequested(const QPoint &pos)
{
if(auto idx = this->ui->favourites_view->indexAt(pos); idx.isValid()) {
- if(QUrl url = global_favourites.get(idx); url.isValid()) {
+ if(QUrl url = kristall::favourites.get(idx); url.isValid()) {
QMenu menu;
BrowserTab * tab = qobject_cast<BrowserTab*>(this->ui->browser_tabs->currentWidget());
@@ -498,7 +445,11 @@ void MainWindow::on_actionManage_Certificates_triggered()
{
CertificateManagementDialog dialog { this };
- dialog.exec();
+ dialog.setIdentitySet(kristall::identities);
+ if(dialog.exec() != QDialog::Accepted)
+ return;
+
+ kristall::identities = dialog.identitySet();
- this->saveSettings();
+ kristall::saveSettings();
}
diff --git a/src/mainwindow.hpp b/src/mainwindow.hpp
index 85b9d59..daf50b8 100644
--- a/src/mainwindow.hpp
+++ b/src/mainwindow.hpp
@@ -8,7 +8,6 @@
#include "favouritecollection.hpp"
#include "renderers/geminirenderer.hpp"
-#include "protocolsetup.hpp"
#include "widgets/elidelabel.hpp"
@@ -33,8 +32,6 @@ public:
void setUrlPreview(QUrl const & url);
- void saveSettings();
-
private slots:
void on_browser_tabs_currentChanged(int index);
@@ -98,9 +95,6 @@ private:
public:
QApplication * application;
- DocumentStyle current_style;
- ProtocolSetup protocols;
-
private:
Ui::MainWindow *ui;
diff --git a/src/protocols/abouthandler.cpp b/src/protocols/abouthandler.cpp
index 01eefff..f87afb8 100644
--- a/src/protocols/abouthandler.cpp
+++ b/src/protocols/abouthandler.cpp
@@ -28,7 +28,7 @@ bool AboutHandler::startRequest(const QUrl &url, ProtocolHandler::RequestOptions
document.append("# Favourites\n");
document.append("\n");
- for (auto const &fav : global_favourites.getAll())
+ for (auto const &fav : kristall::favourites.getAll())
{
document.append("=> " + fav.toString().toUtf8() + "\n");
}
diff --git a/src/protocols/geminiclient.cpp b/src/protocols/geminiclient.cpp
index 6986250..13f795a 100644
--- a/src/protocols/geminiclient.cpp
+++ b/src/protocols/geminiclient.cpp
@@ -51,7 +51,7 @@ bool GeminiClient::startRequest(const QUrl &url, RequestOptions options)
QSslConfiguration ssl_config = socket.sslConfiguration();
ssl_config.setProtocol(QSsl::TlsV1_2);
- if(not global_gemini_trust.enable_ca)
+ if(not kristall::trust::gemini.enable_ca)
ssl_config.setCaCertificates(QList<QSslCertificate> { });
else
ssl_config.setCaCertificates(QSslConfiguration::systemCaCertificates());
@@ -316,7 +316,7 @@ void GeminiClient::sslErrors(QList<QSslError> const & errors)
bool ignore = false;
if(SslTrust::isTrustRelated(err.error()))
{
- switch(global_gemini_trust.getTrust(target_url, socket.peerCertificate()))
+ switch(kristall::trust::gemini.getTrust(target_url, socket.peerCertificate()))
{
case SslTrust::Trusted:
ignore = true;
diff --git a/src/protocols/webclient.cpp b/src/protocols/webclient.cpp
index ed87694..299b39b 100644
--- a/src/protocols/webclient.cpp
+++ b/src/protocols/webclient.cpp
@@ -36,7 +36,7 @@ bool WebClient::startRequest(const QUrl &url, RequestOptions options)
auto ssl_config = request.sslConfiguration();
// ssl_config.setProtocol(QSsl::TlsV1_2);
- if(global_https_trust.enable_ca)
+ if(kristall::trust::https.enable_ca)
ssl_config.setCaCertificates(QSslConfiguration::systemCaCertificates());
else
ssl_config.setCaCertificates(QList<QSslCertificate> { });
@@ -182,7 +182,7 @@ void WebClient::on_sslErrors(const QList<QSslError> &errors)
if(SslTrust::isTrustRelated(err.error()))
{
auto cert = this->current_reply->sslConfiguration().peerCertificate();
- switch(global_https_trust.getTrust(this->current_reply->url(), cert))
+ switch(kristall::trust::https.getTrust(this->current_reply->url(), cert))
{
case SslTrust::Trusted:
ignore = true;
diff --git a/src/protocolsetup.cpp b/src/protocolsetup.cpp
index 33b454e..e5a87fb 100644
--- a/src/protocolsetup.cpp
+++ b/src/protocolsetup.cpp
@@ -11,20 +11,16 @@ ProtocolSetup::ProtocolSetup()
void ProtocolSetup::save(QSettings &settings) const
{
- settings.beginGroup("Protocols");
#define MAC(X) settings.setValue(#X, this->X);
PROTOCOLS(MAC)
#undef MAC
- settings.endGroup();
}
void ProtocolSetup::load(QSettings &settings)
{
- settings.beginGroup("Protocols");
#define MAC(X) if(settings.contains(#X)) this->X = settings.value(#X).toBool();
PROTOCOLS(MAC)
#undef MAC
- settings.endGroup();
}
ProtocolSetup::ProtocolSupport ProtocolSetup::isSchemeSupported(QString const & _scheme) const
diff --git a/src/renderers/geminirenderer.cpp b/src/renderers/geminirenderer.cpp
index 1f94602..e1379b5 100644
--- a/src/renderers/geminirenderer.cpp
+++ b/src/renderers/geminirenderer.cpp
@@ -38,7 +38,7 @@ std::unique_ptr<GeminiDocument> GeminiRenderer::render(
result->background_color = themed_style.background_color;
result->setIndentWidth(20);
- bool emit_fancy_text = global_options.enable_text_decoration;
+ bool emit_fancy_text = kristall::options.enable_text_decoration;
QTextCursor cursor{result.get()};
diff --git a/src/renderers/gophermaprenderer.cpp b/src/renderers/gophermaprenderer.cpp
index 6779a9a..841e40b 100644
--- a/src/renderers/gophermaprenderer.cpp
+++ b/src/renderers/gophermaprenderer.cpp
@@ -26,7 +26,7 @@ std::unique_ptr<QTextDocument> GophermapRenderer::render(const QByteArray &input
external_link.setFont(themed_style.standard_font);
external_link.setForeground(QBrush(themed_style.external_link_color));
- bool emit_text_only = (global_options.gophermap_display == GenericSettings::PlainText);
+ bool emit_text_only = (kristall::options.gophermap_display == GenericSettings::PlainText);
std::unique_ptr<QTextDocument> result = std::make_unique<QTextDocument>();
result->setDocumentMargin(themed_style.margin);
diff --git a/src/widgets/searchbar.cpp b/src/widgets/searchbar.cpp
index a89b8d6..807a979 100644
--- a/src/widgets/searchbar.cpp
+++ b/src/widgets/searchbar.cpp
@@ -7,7 +7,7 @@
SearchBar::SearchBar(QWidget *parent) : QLineEdit(parent)
{
QCompleter *completer = new QCompleter(this);
- completer->setModel(&global_favourites);
+ completer->setModel(&kristall::favourites);
completer->setCaseSensitivity(Qt::CaseInsensitive);
completer->setCompletionRole(Qt::DisplayRole);
this->setCompleter(completer);