From 19c8bf98885074617f9cc0a0b2f60ebf47ddf714 Mon Sep 17 00:00:00 2001 From: Mike Skec Date: Fri, 1 Jan 2021 19:26:15 +1100 Subject: Added UI density option. 'Compact' is the default - saves screen space a bit. The old layout is available in the 'Classic' option --- src/browsertab.cpp | 20 ++++++++++++++ src/browsertab.hpp | 4 +++ src/browsertab.ui | 4 +-- src/dialogs/settingsdialog.cpp | 19 ++++++++++++++ src/dialogs/settingsdialog.hpp | 2 ++ src/dialogs/settingsdialog.ui | 59 ++++++++++++++++++++++++++---------------- src/kristall.hpp | 9 +++++++ src/main.cpp | 24 ++++++++++++++++- src/mainwindow.cpp | 20 ++++++++++++++ src/mainwindow.hpp | 4 +++ 10 files changed, 139 insertions(+), 26 deletions(-) (limited to 'src') diff --git a/src/browsertab.cpp b/src/browsertab.cpp index 18ec5cc..daf2fd2 100644 --- a/src/browsertab.cpp +++ b/src/browsertab.cpp @@ -59,6 +59,8 @@ BrowserTab::BrowserTab(MainWindow *mainWindow) : QWidget(nullptr), { ui->setupUi(this); + this->setUiDensity(kristall::options.ui_density); + addProtocolHandler(); addProtocolHandler(); addProtocolHandler(); @@ -1199,6 +1201,24 @@ void BrowserTab::updateUrlBarStyle() setLineEditTextFormat(this->ui->url_bar, formats); } +void BrowserTab::setUiDensity(UIDensity density) +{ + switch (density) + { + case UIDensity::compact: + { + this->ui->layout_main->setContentsMargins(0, 0, 0, 0); + this->ui->layout_toolbar->setContentsMargins(8, 0, 8, 0); + } break; + + case UIDensity::classic: + { + this->ui->layout_main->setContentsMargins(0, 9, 0, 9); + this->ui->layout_toolbar->setContentsMargins(18, 9, 18, 9); + } break; + } +} + bool BrowserTab::trySetClientCertificate(const QString &query) { CertificateSelectionDialog dialog{this}; diff --git a/src/browsertab.hpp b/src/browsertab.hpp index 50902c9..cbb21c4 100644 --- a/src/browsertab.hpp +++ b/src/browsertab.hpp @@ -27,6 +27,8 @@ class BrowserTab; class MainWindow; +enum class UIDensity : int; + struct DocumentStats { int loading_time = 0; // in ms @@ -83,6 +85,8 @@ public: void updateUrlBarStyle(); + void setUiDensity(UIDensity density); + signals: void titleChanged(QString const & title); void locationChanged(QUrl const & url); diff --git a/src/browsertab.ui b/src/browsertab.ui index faa2666..495ee1f 100644 --- a/src/browsertab.ui +++ b/src/browsertab.ui @@ -13,9 +13,9 @@ Form - + - + QLayout::SetDefaultConstraint diff --git a/src/dialogs/settingsdialog.cpp b/src/dialogs/settingsdialog.cpp index 95fc0e9..f18065f 100644 --- a/src/dialogs/settingsdialog.cpp +++ b/src/dialogs/settingsdialog.cpp @@ -34,6 +34,10 @@ SettingsDialog::SettingsDialog(QWidget *parent) : this->ui->ui_theme->addItem(tr("Light"), QVariant::fromValue(int(Theme::light))); this->ui->ui_theme->addItem(tr("Dark"), QVariant::fromValue(int(Theme::dark))); + this->ui->ui_density->clear(); + this->ui->ui_density->addItem(tr("Compact"), QVariant::fromValue(int(UIDensity::compact))); + this->ui->ui_density->addItem(tr("Classic"), QVariant::fromValue(int(UIDensity::classic))); + setGeminiStyle(DocumentStyle { }); this->predefined_styles.clear(); @@ -186,6 +190,14 @@ void SettingsDialog::setOptions(const GenericSettings &options) } } + this->ui->ui_density->setCurrentIndex(0); + for(int i = 0; i < this->ui->ui_density->count(); ++i) { + if (this->ui->ui_density->itemData(i).toInt() == int(options.ui_density)) { + this->ui->ui_density->setCurrentIndex(i); + break; + } + } + this->ui->start_page->setText(this->current_options.start_page); if(this->current_options.gophermap_display == GenericSettings::PlainText) { @@ -576,6 +588,13 @@ void SettingsDialog::on_ui_theme_currentIndexChanged(int index) kristall::setTheme(this->current_options.theme); } +void SettingsDialog::on_ui_density_currentIndexChanged(int index) +{ + this->current_options.ui_density = UIDensity(this->ui->ui_density->itemData(index).toInt()); + + kristall::setUiDensity(this->current_options.ui_density, true); +} + void SettingsDialog::on_fancypants_on_clicked() { this->current_options.text_display = GenericSettings::FormattedText; diff --git a/src/dialogs/settingsdialog.hpp b/src/dialogs/settingsdialog.hpp index 004cfd0..fd1d7cb 100644 --- a/src/dialogs/settingsdialog.hpp +++ b/src/dialogs/settingsdialog.hpp @@ -98,6 +98,8 @@ private slots: void on_ui_theme_currentIndexChanged(int index); + void on_ui_density_currentIndexChanged(int index); + void on_fancypants_on_clicked(); void on_fancypants_off_clicked(); diff --git a/src/dialogs/settingsdialog.ui b/src/dialogs/settingsdialog.ui index b733960..c61b62a 100644 --- a/src/dialogs/settingsdialog.ui +++ b/src/dialogs/settingsdialog.ui @@ -43,27 +43,37 @@ + + + UI Density + + + + + + + Start Page: - + about://blank - + Enabled Protocols - + @@ -108,14 +118,14 @@ - + Text Rendering - + @@ -142,14 +152,14 @@ - + Enable text highlights - + @@ -176,14 +186,14 @@ - + Gopher Map - + @@ -210,14 +220,14 @@ - + Unknown Scheme - + @@ -241,14 +251,14 @@ - + Hidden files in file:// directories - + @@ -272,14 +282,14 @@ - + URL bar highlights - + @@ -303,38 +313,38 @@ - + Max. Number of Redirections - + 5 - + Redirection Handling - + - + Network Timeout - + ms @@ -347,14 +357,14 @@ - + Additional toolbar buttons - + Home @@ -969,6 +979,7 @@ tabWidget ui_theme + ui_density start_page enable_gemini enable_gopher @@ -1059,5 +1070,7 @@ + + diff --git a/src/kristall.hpp b/src/kristall.hpp index 118a31c..b191aec 100644 --- a/src/kristall.hpp +++ b/src/kristall.hpp @@ -19,6 +19,12 @@ enum class Theme : int dark = 1, }; +enum class UIDensity : int +{ + compact = 0, + classic = 1 +}; + struct GenericSettings { enum TextDisplay { @@ -35,6 +41,7 @@ struct GenericSettings QString start_page = "about:favourites"; Theme theme = Theme::light; + UIDensity ui_density = UIDensity::compact; TextDisplay text_display = FormattedText; bool enable_text_decoration = false; bool use_os_scheme_handler = false; @@ -103,6 +110,8 @@ namespace kristall void saveSettings(); void setTheme(Theme theme); + + void setUiDensity(UIDensity density, bool previewing); } #endif // KRISTALL_HPP diff --git a/src/main.cpp b/src/main.cpp index 780933f..2b5e635 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -33,6 +33,7 @@ QString toFingerprintString(QSslCertificate const & certificate) static QSettings * app_settings_ptr; static QApplication * app; +static MainWindow * main_window = nullptr; #define SSTR(X) STR(X) #define STR(X) #X @@ -269,6 +270,7 @@ int main(int argc, char *argv[]) kristall::setTheme(kristall::options.theme); MainWindow w(&app); + main_window = &w; auto urls = cli_parser.positionalArguments(); if(urls.size() > 0) { @@ -335,6 +337,12 @@ void GenericSettings::load(QSettings &settings) else theme = Theme::os_default; + QString density = settings.value("ui_density", "compact").toString(); + if(density == "compact") + ui_density = UIDensity::compact; + else if (density == "classic") + ui_density = UIDensity::classic; + if(settings.value("gophermap_display", "rendered").toString() == "rendered") gophermap_display = FormattedText; else @@ -363,8 +371,15 @@ void GenericSettings::save(QSettings &settings) const case Theme::light: theme_name = "light"; break; case Theme::os_default: theme_name = "os_default"; break; } - settings.setValue("theme", theme_name); + + QString density = "compact"; + switch(ui_density) { + case UIDensity::compact: density = "compact"; break; + case UIDensity::classic: density = "classic"; break; + } + settings.setValue("ui_density", density); + settings.setValue("gophermap_display", (gophermap_display == FormattedText) ? "rendered" : "text"); settings.setValue("use_os_scheme_handler", use_os_scheme_handler); settings.setValue("show_hidden_files_in_dirs", show_hidden_files_in_dirs); @@ -437,3 +452,10 @@ void kristall::setTheme(Theme theme) QIcon::setThemeName("dark"); } } + +void kristall::setUiDensity(UIDensity density, bool previewing) +{ + assert(app != nullptr); + assert(main_window != nullptr); + main_window->setUiDensity(density, previewing); +} diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index f9266bc..b30d98a 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -173,6 +173,24 @@ void MainWindow::updateWindowTitle() this->setWindowTitle(QString("%0 - %1").arg(tab->page_title, "Kristall")); } +void MainWindow::setUiDensity(UIDensity density, bool previewing) +{ + // If we are previewing, we only update the current tab. + // If not, we update all tabs as it means user accepted the settings + // dialog. + + if (previewing) + { + if (!this->curTab()) return; + this->curTab()->setUiDensity(density); + } + else + { + for (int i = 0; i < this->ui->browser_tabs->count(); ++i) + this->tabAt(i)->setUiDensity(density); + } +} + void MainWindow::mousePressEvent(QMouseEvent *event) { QMainWindow::mousePressEvent(event); @@ -301,6 +319,7 @@ void MainWindow::on_actionSettings_triggered() if(dialog.exec() != QDialog::Accepted) { kristall::setTheme(kristall::options.theme); + this->setUiDensity(kristall::options.ui_density, false); update_url_style(false); return; } @@ -317,6 +336,7 @@ void MainWindow::on_actionSettings_triggered() kristall::saveSettings(); kristall::setTheme(kristall::options.theme); + this->setUiDensity(kristall::options.ui_density, false); // Flag open tabs for re-render so theme // changes are instantly applied. diff --git a/src/mainwindow.hpp b/src/mainwindow.hpp index f816281..1ac550b 100644 --- a/src/mainwindow.hpp +++ b/src/mainwindow.hpp @@ -19,6 +19,8 @@ QT_END_NAMESPACE class BrowserTab; +enum class UIDensity : int; + class MainWindow : public QMainWindow { Q_OBJECT @@ -38,6 +40,8 @@ public: void updateWindowTitle(); + void setUiDensity(UIDensity density, bool previewing); + void mousePressEvent(QMouseEvent *event) override; private slots: -- cgit v1.2.3