diff options
| author | Felix (xq) Queißner <git@mq32.de> | 2020-06-06 19:21:38 +0200 |
|---|---|---|
| committer | Felix (xq) Queißner <git@mq32.de> | 2020-06-06 19:21:38 +0200 |
| commit | 0fd0f2d919d748280c48383840fe7c4d988bbd00 (patch) | |
| tree | b2fb1f93a9ed3f0ebc7fb81addc585f0722db599 | |
| parent | cb69dca1dbf19ae854276803442e724045c4be81 (diff) | |
| download | kristall-0fd0f2d919d748280c48383840fe7c4d988bbd00.tar.gz | |
Moves from favourites.db to QSettings, moves theming to MainWindow, save/load installed theme.
| -rw-r--r-- | browsertab.cpp | 6 | ||||
| -rw-r--r-- | browsertab.hpp | 2 | ||||
| -rw-r--r-- | favouritecollection.cpp | 25 | ||||
| -rw-r--r-- | favouritecollection.hpp | 3 | ||||
| -rw-r--r-- | geminirenderer.cpp | 211 | ||||
| -rw-r--r-- | geminirenderer.hpp | 4 | ||||
| -rw-r--r-- | main.cpp | 3 | ||||
| -rw-r--r-- | mainwindow.cpp | 15 | ||||
| -rw-r--r-- | mainwindow.hpp | 8 |
9 files changed, 202 insertions, 75 deletions
diff --git a/browsertab.cpp b/browsertab.cpp index e18350c..5c8c453 100644 --- a/browsertab.cpp +++ b/browsertab.cpp @@ -98,10 +98,10 @@ void BrowserTab::on_menu_button_clicked() connect(menu.addAction("Settings..."), &QAction::triggered, [this]() { SettingsDialog dialog; - dialog.setGeminiStyle(current_style); + dialog.setGeminiStyle(mainWindow->current_style); if(dialog.exec() == QDialog::Accepted) { - this->current_style = dialog.geminiStyle(); + mainWindow->current_style = dialog.geminiStyle(); } }); @@ -140,7 +140,7 @@ void BrowserTab::on_gemini_complete(const QByteArray &data, const QString &mime) if(mime.startsWith("text/gemini")) { - auto doc= GeminiRenderer{ current_style }.render(data, this->current_location, this->outline); + auto doc= GeminiRenderer{ mainWindow->current_style }.render(data, this->current_location, this->outline); this->ui->text_browser->setStyleSheet(QString("QTextBrowser { background-color: %1; }").arg(doc->background_color.name())); document = std::move(doc); diff --git a/browsertab.hpp b/browsertab.hpp index 29bed14..fa853e6 100644 --- a/browsertab.hpp +++ b/browsertab.hpp @@ -101,8 +101,6 @@ public: TabBrowsingHistory history; std::unique_ptr<QTextDocument> current_document; - - GeminiStyle current_style; }; #endif // BROWSERTAB_HPP diff --git a/favouritecollection.cpp b/favouritecollection.cpp index 79409bb..161eacf 100644 --- a/favouritecollection.cpp +++ b/favouritecollection.cpp @@ -75,6 +75,18 @@ bool FavouriteCollection::save(const QString &fileName) const return true; } +bool FavouriteCollection::save(QSettings &settings) const +{ + settings.beginWriteArray("favourites", items.size()); + for(int i = 0; i < items.size(); i++) + { + settings.setArrayIndex(i); + settings.setValue("url", items[i].toString()); + } + settings.endArray(); + return true; +} + bool FavouriteCollection::load(const QString &fileName) { QFile file(fileName); @@ -95,6 +107,19 @@ bool FavouriteCollection::load(const QString &fileName) return true; } +bool FavouriteCollection::load(QSettings & settings) +{ + int len = settings.beginReadArray("favourites"); + items.resize(len); + for(int i = 0; i < items.size(); i++) + { + settings.setArrayIndex(i); + items[i] = settings.value("url").toString(); + } + settings.endArray(); + return true; +} + int FavouriteCollection::rowCount(const QModelIndex &parent) const { return items.size(); diff --git a/favouritecollection.hpp b/favouritecollection.hpp index dd68b93..73afa1f 100644 --- a/favouritecollection.hpp +++ b/favouritecollection.hpp @@ -4,6 +4,7 @@ #include <QObject> #include <QAbstractListModel> #include <QUrl> +#include <QSettings> class FavouriteCollection : public QAbstractListModel @@ -21,8 +22,10 @@ public: QUrl get(QModelIndex const & index) const ; bool save(QString const & fileName) const; + bool save(QSettings & settings) const; bool load(QString const & fileName); + bool load(QSettings & settings); public: int rowCount(const QModelIndex &parent = QModelIndex()) const override; diff --git a/geminirenderer.cpp b/geminirenderer.cpp index 42dcd04..5adeedb 100644 --- a/geminirenderer.cpp +++ b/geminirenderer.cpp @@ -9,35 +9,36 @@ static QByteArray trim_whitespace(QByteArray items) { int start = 0; - while(start < items.size() and isspace(items.at(start))) { + while (start < items.size() and isspace(items.at(start))) + { start += 1; } int end = items.size() - 1; - while(end > 0 and isspace(items.at(end))) { + while (end > 0 and isspace(items.at(end))) + { end -= 1; } return items.mid(start, end - start + 1); } -GeminiStyle::GeminiStyle() : - theme(Fixed), - standard_font(), - h1_font(), - h2_font(), - h3_font(), - preformatted_font(), - background_color(0xFF, 0xFF, 0xFF), - standard_color(0x00, 0x00, 0x00), - preformatted_color(0x00, 0x00, 0x00), - h1_color(0xFF, 0x00, 0x00), - h2_color(0x00, 0x80, 0x00), - h3_color(0x80, 0xFF, 0x00), - internal_link_color(0x00, 0x80, 0x0FF), - external_link_color(0x00, 0x00, 0xFF), - cross_scheme_link_color(0x80, 0x00, 0xFF), - internal_link_prefix("→ "), - external_link_prefix("⇒ "), - margin(55.0) +GeminiStyle::GeminiStyle() : theme(Fixed), + standard_font(), + h1_font(), + h2_font(), + h3_font(), + preformatted_font(), + background_color(0xFF, 0xFF, 0xFF), + standard_color(0x00, 0x00, 0x00), + preformatted_color(0x00, 0x00, 0x00), + h1_color(0xFF, 0x00, 0x00), + h2_color(0x00, 0x80, 0x00), + h3_color(0x80, 0xFF, 0x00), + internal_link_color(0x00, 0x80, 0x0FF), + external_link_color(0x00, 0x00, 0xFF), + cross_scheme_link_color(0x80, 0x00, 0xFF), + internal_link_prefix("→ "), + external_link_prefix("⇒ "), + margin(55.0) { preformatted_font.setFamily("monospace"); preformatted_font.setPointSizeF(10.0); @@ -58,9 +59,69 @@ GeminiStyle::GeminiStyle() : h3_font.setPointSizeF(12.0); } +bool GeminiStyle::save(QSettings &settings) const +{ + settings.beginGroup("Theme"); + + 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("background_color", background_color.name()); + settings.setValue("standard_color", standard_color.name()); + settings.setValue("preformatted_color", preformatted_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.endGroup(); + return true; +} + +bool GeminiStyle::load(QSettings &settings) +{ + settings.beginGroup("Theme"); + + 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()); + 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()); + + settings.endGroup(); + return true; +} + GeminiStyle GeminiStyle::derive(const QUrl &url) const { - if(this->theme == Fixed) + if (this->theme == Fixed) return *this; QByteArray hash = QCryptographicHash::hash(url.host().toUtf8(), QCryptographicHash::Md5); @@ -74,11 +135,12 @@ GeminiStyle GeminiStyle::derive(const QUrl &url) const double tmp; GeminiStyle themed = *this; - switch(this->theme) + switch (this->theme) + { + case AutoDarkTheme: { - case AutoDarkTheme: { themed.background_color = QColor::fromHslF(hue, saturation, 0.25f); - themed.standard_color = QColor { 0xFF, 0xFF, 0xFF }; + themed.standard_color = QColor{0xFF, 0xFF, 0xFF}; themed.h1_color = QColor::fromHslF(std::modf(hue + 0.5, &tmp), 1.0 - saturation, 0.75); themed.h2_color = QColor::fromHslF(std::modf(hue + 0.5, &tmp), 1.0 - saturation, 0.75); @@ -91,9 +153,10 @@ GeminiStyle GeminiStyle::derive(const QUrl &url) const break; } - case AutoLightTheme: { + case AutoLightTheme: + { themed.background_color = QColor::fromHslF(hue, items[2] / 255.0, 0.85); - themed.standard_color = QColor { 0x00, 0x00, 0x00 }; + themed.standard_color = QColor{0x00, 0x00, 0x00}; themed.h1_color = QColor::fromHslF(std::modf(hue + 0.5, &tmp), 1.0 - saturation, 0.25); themed.h2_color = QColor::fromHslF(std::modf(hue + 0.5, &tmp), 1.0 - saturation, 0.25); @@ -116,13 +179,11 @@ GeminiStyle GeminiStyle::derive(const QUrl &url) const return themed; } -GeminiRenderer::GeminiRenderer(GeminiStyle const & _style) : - style(_style) +GeminiRenderer::GeminiRenderer(GeminiStyle const &_style) : style(_style) { - } -std::unique_ptr<GeminiDocument> GeminiRenderer::render(const QByteArray &input, QUrl const & root_url, DocumentOutlineModel &outline) +std::unique_ptr<GeminiDocument> GeminiRenderer::render(const QByteArray &input, QUrl const &root_url, DocumentOutlineModel &outline) { auto themed_style = style.derive(root_url); @@ -162,32 +223,41 @@ std::unique_ptr<GeminiDocument> GeminiRenderer::render(const QByteArray &input, result->setDocumentMargin(themed_style.margin); result->background_color = themed_style.background_color; - QTextCursor cursor { result.get() }; + QTextCursor cursor{result.get()}; QTextBlockFormat non_list_format = cursor.blockFormat(); bool verbatim = false; - QTextList * current_list = nullptr; + QTextList *current_list = nullptr; outline.beginBuild(); QList<QByteArray> lines = input.split('\n'); - for(auto const & line : lines) + for (auto const &line : lines) { - if(verbatim) { - if(line.startsWith("```")) { + if (verbatim) + { + if (line.startsWith("```")) + { verbatim = false; } - else { + else + { cursor.setCharFormat(preformatted); cursor.insertText(line + "\n"); } - } else { - if(line.startsWith("*")) { - if(current_list == nullptr) { + } + else + { + if (line.startsWith("*")) + { + if (current_list == nullptr) + { cursor.deletePreviousChar(); current_list = cursor.insertList(QTextListFormat::ListDisc); - } else { + } + else + { cursor.insertBlock(); } @@ -195,50 +265,62 @@ std::unique_ptr<GeminiDocument> GeminiRenderer::render(const QByteArray &input, cursor.insertText(item, standard); continue; - } else { - if(current_list != nullptr) { + } + else + { + if (current_list != nullptr) + { cursor.insertBlock(); cursor.setBlockFormat(non_list_format); } current_list = nullptr; } - if(line.startsWith("###")) { + if (line.startsWith("###")) + { auto heading = trim_whitespace(line.mid(3)); cursor.insertText(heading + "\n", standard_h3); outline.appendH3(heading); } - else if(line.startsWith("##")) { + else if (line.startsWith("##")) + { auto heading = trim_whitespace(line.mid(2)); cursor.insertText(heading + "\n", standard_h2); outline.appendH2(heading); } - else if(line.startsWith("#")) { + else if (line.startsWith("#")) + { auto heading = trim_whitespace(line.mid(1)); cursor.insertText(heading + "\n", standard_h1); outline.appendH1(heading); } - else if(line.startsWith("=>")) { + else if (line.startsWith("=>")) + { auto const part = line.mid(2).trimmed(); QByteArray link, title; int index = -1; - for(int i = 0; i < part.size(); i++) { - if(isspace(part[i])) { + for (int i = 0; i < part.size(); i++) + { + if (isspace(part[i])) + { index = i; break; } } - if(index > 0) { - link = trim_whitespace(part.mid(0, index)); + if (index > 0) + { + link = trim_whitespace(part.mid(0, index)); title = trim_whitespace(part.mid(index + 1)); - } else { - link = trim_whitespace(part); + } + else + { + link = trim_whitespace(part); title = trim_whitespace(part); } @@ -251,16 +333,20 @@ std::unique_ptr<GeminiDocument> GeminiRenderer::render(const QByteArray &input, auto fmt = standard_link; QString prefix; - if(absolute_url.host() == root_url.host()) { + if (absolute_url.host() == root_url.host()) + { prefix = themed_style.internal_link_prefix; fmt = standard_link; - } else { + } + else + { prefix = themed_style.external_link_prefix; fmt = external_link; } QString suffix = ""; - if(absolute_url.scheme() != root_url.scheme()) { + if (absolute_url.scheme() != root_url.scheme()) + { suffix = " [" + absolute_url.scheme().toUpper() + "]"; fmt = cross_protocol_link; } @@ -269,10 +355,12 @@ std::unique_ptr<GeminiDocument> GeminiRenderer::render(const QByteArray &input, fmt.setAnchorHref(absolute_url.toString()); cursor.insertText(prefix + title + suffix + "\n", fmt); } - else if(line.startsWith("```")) { + else if (line.startsWith("```")) + { verbatim = true; } - else { + else + { cursor.insertText(line + "\n", standard); } } @@ -282,14 +370,11 @@ std::unique_ptr<GeminiDocument> GeminiRenderer::render(const QByteArray &input, return result; } -GeminiDocument::GeminiDocument(QObject * parent) : - QTextDocument(parent), - background_color(0x00, 0x00, 0x00) +GeminiDocument::GeminiDocument(QObject *parent) : QTextDocument(parent), + background_color(0x00, 0x00, 0x00) { - } GeminiDocument::~GeminiDocument() { - } diff --git a/geminirenderer.hpp b/geminirenderer.hpp index b9dd57c..2ec1651 100644 --- a/geminirenderer.hpp +++ b/geminirenderer.hpp @@ -3,6 +3,7 @@ #include <QTextDocument> #include <QColor> +#include <QSettings> #include "documentoutlinemodel.hpp" @@ -40,6 +41,9 @@ struct GeminiStyle double margin; + bool save(QSettings & settings) const; + bool load(QSettings & settings); + //! Create a new style with auto-generated colors for the given //! url. The colors are based on the host name GeminiStyle derive(QUrl const & url) const; @@ -2,12 +2,15 @@ #include <QApplication> #include <QUrl> +#include <QSettings> int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; + + w.addNewTab(true, QUrl("gemini://gemini.circumlunar.space/")); w.show(); diff --git a/mainwindow.cpp b/mainwindow.cpp index aba06f0..998a7d8 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -4,16 +4,18 @@ #include <memory> -MainWindow::MainWindow(QWidget *parent) - : QMainWindow(parent) - , ui(new Ui::MainWindow), - url_status(new QLabel()) +MainWindow::MainWindow(QWidget *parent) : + QMainWindow(parent), + settings("xqTechnologies", "Kristall"), + ui(new Ui::MainWindow), + url_status(new QLabel()) { ui->setupUi(this); this->statusBar()->addWidget(this->url_status); - this->favourites.load("./favourites.db"); + this->favourites.load(settings); + this->current_style.load(settings); ui->favourites_view->setModel(&favourites); @@ -24,7 +26,8 @@ MainWindow::MainWindow(QWidget *parent) MainWindow::~MainWindow() { - this->favourites.save("./favourites.db"); + this->favourites.save(settings); + this->current_style.save(settings); delete ui; } diff --git a/mainwindow.hpp b/mainwindow.hpp index ea2af3e..eb8918b 100644 --- a/mainwindow.hpp +++ b/mainwindow.hpp @@ -3,8 +3,11 @@ #include <QMainWindow> #include <QLabel> +#include <QSettings> + #include "favouritecollection.hpp" +#include "geminirenderer.hpp" QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } @@ -41,10 +44,13 @@ private slots: void on_tab_locationChanged(QUrl const & url); +public: + QSettings settings; + GeminiStyle current_style; + private: Ui::MainWindow *ui; QLabel * url_status; - }; #endif // MAINWINDOW_HPP |
