From aeaa90c126b7f56cbbcf6b4ffe2f53db58292a33 Mon Sep 17 00:00:00 2001 From: Mike Skec Date: Sat, 13 Feb 2021 14:27:46 +1100 Subject: Margins are now split into seperate horizontal/vertical options --- src/browsertab.cpp | 5 ++-- src/dialogs/settingsdialog.cpp | 13 ++++++--- src/dialogs/settingsdialog.hpp | 3 ++- src/dialogs/settingsdialog.ui | 54 ++++++++++++++++++++++++++----------- src/documentstyle.cpp | 11 +++++--- src/documentstyle.hpp | 2 +- src/renderers/geminirenderer.cpp | 3 ++- src/renderers/gophermaprenderer.cpp | 2 +- src/renderers/markdownrenderer.cpp | 4 ++- src/renderers/plaintextrenderer.cpp | 2 +- src/renderers/renderhelpers.cpp | 16 +++++++++-- src/renderers/renderhelpers.hpp | 6 +++++ 12 files changed, 89 insertions(+), 32 deletions(-) (limited to 'src') diff --git a/src/browsertab.cpp b/src/browsertab.cpp index dfcf517..f6684b5 100644 --- a/src/browsertab.cpp +++ b/src/browsertab.cpp @@ -6,6 +6,7 @@ #include "renderers/geminirenderer.hpp" #include "renderers/plaintextrenderer.hpp" #include "renderers/markdownrenderer.hpp" +#include "renderers/renderhelpers.hpp" #include "mimeparser.hpp" @@ -575,7 +576,7 @@ void BrowserTab::renderPage(const QByteArray &data, const MimeType &mime) document->setDefaultFont(doc_style.standard_font); document->setDefaultStyleSheet(doc_style.toStyleSheet()); - document->setDocumentMargin(doc_style.margin); + renderhelpers::setPageMargins(document.get(), doc_style.margin_h, doc_style.margin_v); // Strip inline styles from page, so they don't // conflict with user styles. @@ -1322,7 +1323,7 @@ void BrowserTab::updatePageMargins() QTextFrame *root = this->current_document->rootFrame(); QTextFrameFormat fmt = root->frameFormat(); int margin = std::max((this->width() - this->current_style.text_width) / 2, - this->current_style.margin); + this->current_style.margin_h); fmt.setLeftMargin(margin); fmt.setRightMargin(margin); root->setFrameFormat(fmt); diff --git a/src/dialogs/settingsdialog.cpp b/src/dialogs/settingsdialog.cpp index 1bbdcf3..252c7a6 100644 --- a/src/dialogs/settingsdialog.cpp +++ b/src/dialogs/settingsdialog.cpp @@ -110,7 +110,8 @@ void SettingsDialog::setGeminiStyle(DocumentStyle const &style) this->ui->link_local_prefix->setText(this->current_style.internal_link_prefix); this->ui->link_foreign_prefix->setText(this->current_style.external_link_prefix); - this->ui->page_margin->setValue(this->current_style.margin); + this->ui->page_margin_h->setValue(this->current_style.margin_h); + this->ui->page_margin_v->setValue(this->current_style.margin_v); this->ui->enable_justify_text->setChecked(this->current_style.justify_text); @@ -437,9 +438,15 @@ void SettingsDialog::on_preview_url_textChanged(const QString &) this->reloadStylePreview(); } -void SettingsDialog::on_page_margin_valueChanged(double value) +void SettingsDialog::on_page_margin_h_valueChanged(double value) { - this->current_style.margin = value; + this->current_style.margin_h = value; + this->reloadStylePreview(); +} + +void SettingsDialog::on_page_margin_v_valueChanged(double value) +{ + this->current_style.margin_v = value; this->reloadStylePreview(); } diff --git a/src/dialogs/settingsdialog.hpp b/src/dialogs/settingsdialog.hpp index 4032129..d515242 100644 --- a/src/dialogs/settingsdialog.hpp +++ b/src/dialogs/settingsdialog.hpp @@ -76,7 +76,8 @@ private slots: void on_preview_url_textChanged(const QString &arg1); - void on_page_margin_valueChanged(double arg1); + void on_page_margin_h_valueChanged(double arg1); + void on_page_margin_v_valueChanged(double arg1); void on_enable_justify_text_clicked(bool arg1); diff --git a/src/dialogs/settingsdialog.ui b/src/dialogs/settingsdialog.ui index b1c0684..a88285e 100644 --- a/src/dialogs/settingsdialog.ui +++ b/src/dialogs/settingsdialog.ui @@ -891,15 +891,16 @@ + - Page Margin + Left/right Page Margin - + px @@ -907,18 +908,40 @@ 0 - 350.000000000000000 + 350 + + + + Top/bottom Page Margin + + + + + + + px + + + 0 + + + 350 + + + + + Other options - + @@ -943,7 +966,7 @@ - + Text width limit @@ -953,7 +976,7 @@ - + 300 @@ -970,14 +993,14 @@ - + Line height (paragraph) - + px @@ -991,14 +1014,14 @@ - + Line height (header) - + px @@ -1012,14 +1035,14 @@ - + Indentation - + @@ -1109,14 +1132,14 @@ - + Presets - + @@ -1342,7 +1365,8 @@ link_foreign_prefix quote_change_color auto_theme - page_margin + page_margin_h + page_margin_v enable_justify_text enable_text_width text_width diff --git a/src/documentstyle.cpp b/src/documentstyle.cpp index 3bfd857..0a9f48d 100644 --- a/src/documentstyle.cpp +++ b/src/documentstyle.cpp @@ -134,7 +134,8 @@ DocumentStyle::DocumentStyle(bool do_init) : theme(Fixed), cross_scheme_link_color(0x09, 0x60, 0xa7), internal_link_prefix("→ "), external_link_prefix("⇒ "), - margin(55.0), + margin_h(30.0), + margin_v(55.0), text_width(900), ansi_colors({"black", "darkred", "darkgreen", "darkgoldenrod", "darkblue", "darkmagenta", "darkcyan", "lightgray", @@ -225,7 +226,8 @@ bool DocumentStyle::save(QSettings &settings) const settings.setValue("background_color", background_color.name()); settings.setValue("blockquote_color", blockquote_color.name()); - settings.setValue("margins", margin); + settings.setValue("margins_h", margin_h); + settings.setValue("margins_v", margin_v); settings.setValue("ansi_colors", ansi_colors); @@ -317,7 +319,7 @@ bool DocumentStyle::load(QSettings &settings) internal_link_prefix = settings.value("internal_link_prefix").toString(); external_link_prefix = settings.value("external_link_prefix").toString(); - margin = settings.value("margins").toDouble(); + margin_h = margin_v = settings.value("margins").toDouble(); theme = Theme(settings.value("theme").toInt()); } break; @@ -328,7 +330,8 @@ bool DocumentStyle::load(QSettings &settings) 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(); + margin_h = settings.value("margins_h", 30).toInt(); + margin_v = settings.value("margins_v", 55).toInt(); QStringList default_colors = {"black", "darkred", "darkgreen", "darkgoldenrod", "darkblue", "darkmagenta", "darkcyan", "lightgray", diff --git a/src/documentstyle.hpp b/src/documentstyle.hpp index a8d12fe..961a0ed 100644 --- a/src/documentstyle.hpp +++ b/src/documentstyle.hpp @@ -49,7 +49,7 @@ struct DocumentStyle QString internal_link_prefix; QString external_link_prefix; - double margin; + double margin_h, margin_v; double text_width; diff --git a/src/renderers/geminirenderer.cpp b/src/renderers/geminirenderer.cpp index 721a969..5f82bb8 100644 --- a/src/renderers/geminirenderer.cpp +++ b/src/renderers/geminirenderer.cpp @@ -1,4 +1,5 @@ #include "geminirenderer.hpp" +#include "renderhelpers.hpp" #include #include @@ -37,7 +38,7 @@ std::unique_ptr GeminiRenderer::render( TextStyleInstance text_style { themed_style }; std::unique_ptr result = std::make_unique(); - result->setDocumentMargin(themed_style.margin); + renderhelpers::setPageMargins(result.get(), themed_style.margin_h, themed_style.margin_v); result->setIndentWidth(20); bool emit_fancy_text = kristall::options.enable_text_decoration; diff --git a/src/renderers/gophermaprenderer.cpp b/src/renderers/gophermaprenderer.cpp index cffb2e1..6e6deb1 100644 --- a/src/renderers/gophermaprenderer.cpp +++ b/src/renderers/gophermaprenderer.cpp @@ -30,7 +30,7 @@ std::unique_ptr GophermapRenderer::render(const QByteArray &input bool emit_text_only = (kristall::options.gophermap_display == GenericSettings::PlainText); std::unique_ptr result = std::make_unique(); - result->setDocumentMargin(themed_style.margin); + renderhelpers::setPageMargins(result.get(), themed_style.margin_h, themed_style.margin_v); if(not emit_text_only) { diff --git a/src/renderers/markdownrenderer.cpp b/src/renderers/markdownrenderer.cpp index 308f8a2..2b8657d 100644 --- a/src/renderers/markdownrenderer.cpp +++ b/src/renderers/markdownrenderer.cpp @@ -2,6 +2,8 @@ #include "textstyleinstance.hpp" +#include "renderhelpers.hpp" + #include #include @@ -316,7 +318,7 @@ std::unique_ptr MarkdownRenderer::render( return nullptr; auto doc = std::make_unique(); - doc->setDocumentMargin(style.margin); + renderhelpers::setPageMargins(doc.get(), style.margin_h, style.margin_v); doc->setIndentWidth(20); outline.beginBuild(); diff --git a/src/renderers/plaintextrenderer.cpp b/src/renderers/plaintextrenderer.cpp index 73a7abf..b183818 100644 --- a/src/renderers/plaintextrenderer.cpp +++ b/src/renderers/plaintextrenderer.cpp @@ -14,7 +14,7 @@ std::unique_ptr PlainTextRenderer::render(const QByteArray &input standard.setForeground(style.preformatted_color); std::unique_ptr result = std::make_unique(); - result->setDocumentMargin(style.margin); + renderhelpers::setPageMargins(result.get(), style.margin_h, style.margin_v); QTextCursor cursor { result.get() }; RenderEscapeCodes(input, standard, cursor); diff --git a/src/renderers/renderhelpers.cpp b/src/renderers/renderhelpers.cpp index 298dc9d..6c5f2ef 100644 --- a/src/renderers/renderhelpers.cpp +++ b/src/renderers/renderhelpers.cpp @@ -2,7 +2,7 @@ * @TODO I'm hardcoding this to ANSI for now, as it's the most common. * Ideally we should have configurable control characters for various * types of terminals that could be emulated via a standard termcap file. - * @NOTE ANSI escape sequence reference: + * @NOTE ANSI escape sequence reference: * https://en.wikipedia.org/wiki/ANSI_escape_code#Escape_sequences * Note that escape sequences for other terminal types are a thing, and * currently aren't implemented yet as mentioned in the TODO above, eg: @@ -14,6 +14,8 @@ #include #include #include +#include +#include #include #include @@ -79,7 +81,7 @@ void parseSGR( if (args.empty()) return; for (auto it = args.cbegin(); it != args.cend(); ++it) { - /// @TODO A whole bunch of unimplemented SGR codes are unimplemented + /// @TODO A whole bunch of unimplemented SGR codes are unimplemented /// yet (eg: blink or font switching) enum { Reset = 0, Bold, Light, Italic, Underline, @@ -347,3 +349,13 @@ void RenderEscapeCodes(const QByteArray &input, const QTextCharFormat& format, Q } } +void renderhelpers::setPageMargins(QTextDocument *doc, int mh, int mv) +{ + QTextFrame *root = doc->rootFrame(); + QTextFrameFormat fmt = root->frameFormat(); + fmt.setLeftMargin(mh); + fmt.setRightMargin(mh); + fmt.setTopMargin(mv); + fmt.setBottomMargin(mv); + root->setFrameFormat(fmt); +} diff --git a/src/renderers/renderhelpers.hpp b/src/renderers/renderhelpers.hpp index c2c81d8..c5273c2 100644 --- a/src/renderers/renderhelpers.hpp +++ b/src/renderers/renderhelpers.hpp @@ -3,7 +3,13 @@ #include #include +#include void RenderEscapeCodes(const QByteArray &input, const QTextCharFormat& format, QTextCursor& cursor); +namespace renderhelpers +{ + void setPageMargins(QTextDocument *doc, int mh, int mv); +} + #endif -- cgit v1.2.3