From 2c731111d73e1e4bf26f2edcbe0df8db6d07137c Mon Sep 17 00:00:00 2001 From: David Rosca Date: Sat, 3 Feb 2018 19:24:09 +0100 Subject: [PATCH] VerticalTabs: Add support for changing themes --- .../VerticalTabs/data/themes/default.css | 16 +++++++ src/plugins/VerticalTabs/verticaltabs.qrc | 1 + .../VerticalTabs/verticaltabscontroller.cpp | 4 +- .../VerticalTabs/verticaltabsplugin.cpp | 40 ++++++++++++++++++ src/plugins/VerticalTabs/verticaltabsplugin.h | 9 ++++ .../VerticalTabs/verticaltabssettings.cpp | 42 +++++++++++++++++++ .../VerticalTabs/verticaltabssettings.h | 5 +++ .../VerticalTabs/verticaltabssettings.ui | 14 ++++++- 8 files changed, 128 insertions(+), 3 deletions(-) create mode 100644 src/plugins/VerticalTabs/data/themes/default.css diff --git a/src/plugins/VerticalTabs/data/themes/default.css b/src/plugins/VerticalTabs/data/themes/default.css new file mode 100644 index 000000000..aafa233e1 --- /dev/null +++ b/src/plugins/VerticalTabs/data/themes/default.css @@ -0,0 +1,16 @@ +/* Vertical Tabs Default theme */ + +TabTreeCloseButton +{ + qproperty-showOnNormal: 0; + qproperty-showOnHovered: 1; + qproperty-showOnSelected: 1; +} + +TabTreeView +{ + color: 0; + qproperty-hoverColor: 0; + qproperty-selectedColor: 0; + qproperty-backgroundIndentation: 0; +} diff --git a/src/plugins/VerticalTabs/verticaltabs.qrc b/src/plugins/VerticalTabs/verticaltabs.qrc index f67ad23c5..243f9d985 100644 --- a/src/plugins/VerticalTabs/verticaltabs.qrc +++ b/src/plugins/VerticalTabs/verticaltabs.qrc @@ -1,5 +1,6 @@ data/icon.svg + data/themes/default.css diff --git a/src/plugins/VerticalTabs/verticaltabscontroller.cpp b/src/plugins/VerticalTabs/verticaltabscontroller.cpp index da3b1e24b..627818a21 100644 --- a/src/plugins/VerticalTabs/verticaltabscontroller.cpp +++ b/src/plugins/VerticalTabs/verticaltabscontroller.cpp @@ -42,8 +42,10 @@ QAction *VerticalTabsController::createMenuAction() QWidget *VerticalTabsController::createSideBarWidget(BrowserWindow *window) { VerticalTabsWidget *widget = new VerticalTabsWidget(window); - connect(m_plugin, &VerticalTabsPlugin::viewTypeChanged, widget, &VerticalTabsWidget::setViewType); widget->setViewType(m_plugin->viewType()); + widget->setStyleSheet(m_plugin->styleSheet()); + connect(m_plugin, &VerticalTabsPlugin::viewTypeChanged, widget, &VerticalTabsWidget::setViewType); + connect(m_plugin, &VerticalTabsPlugin::styleSheetChanged, widget, &VerticalTabsWidget::setStyleSheet); return widget; } diff --git a/src/plugins/VerticalTabs/verticaltabsplugin.cpp b/src/plugins/VerticalTabs/verticaltabsplugin.cpp index 9bacfc9b0..74051ea37 100644 --- a/src/plugins/VerticalTabs/verticaltabsplugin.cpp +++ b/src/plugins/VerticalTabs/verticaltabsplugin.cpp @@ -57,12 +57,14 @@ void VerticalTabsPlugin::init(InitState state, const QString &settingsPath) m_viewType = static_cast(settings.value(QSL("ViewType"), TabListView).toInt()); m_replaceTabBar = settings.value(QSL("ReplaceTabBar"), false).toBool(); m_addChildBehavior = static_cast(settings.value(QSL("AddChildBehavior"), AppendChild).toInt()); + m_theme = settings.value(QSL("Theme"), QSL(":verticaltabs/data/themes/default.css")).toString(); settings.endGroup(); m_controller = new VerticalTabsController(this); SideBarManager::addSidebar(QSL("VerticalTabs"), m_controller); setWebTabBehavior(m_addChildBehavior); + loadStyleSheet(m_theme); connect(mApp->plugins(), &PluginProxy::mainWindowCreated, this, &VerticalTabsPlugin::mainWindowCreated); @@ -156,6 +158,31 @@ void VerticalTabsPlugin::setAddChildBehavior(AddChildBehavior behavior) settings.setValue(QSL("VerticalTabs/AddChildBehavior"), m_addChildBehavior); } +QString VerticalTabsPlugin::theme() const +{ + return m_theme; +} + +void VerticalTabsPlugin::setTheme(const QString &theme) +{ + if (theme.isEmpty()) { + return; + } + + // Don't check if same to allow live reloading stylesheet + + m_theme = theme; + loadStyleSheet(m_theme); + + QSettings settings(m_settingsPath, QSettings::IniFormat); + settings.setValue(QSL("VerticalTabs/Theme"), m_theme); +} + +QString VerticalTabsPlugin::styleSheet() const +{ + return m_styleSheet; +} + void VerticalTabsPlugin::mainWindowCreated(BrowserWindow *window) { if (window->sideBarManager()->activeSideBar().isEmpty()) { @@ -176,3 +203,16 @@ void VerticalTabsPlugin::setWebTabBehavior(AddChildBehavior behavior) { WebTab::setAddChildBehavior(behavior == AppendChild ? WebTab::AppendChild : WebTab::PrependChild); } + +void VerticalTabsPlugin::loadStyleSheet(const QString &theme) +{ + QFile file(theme); + if (!file.open(QFile::ReadOnly)) { + qWarning() << "Failed to open stylesheet file" << theme; + file.setFileName(QSL(":verticaltabs/data/themes/default.css")); + file.open(QFile::ReadOnly); + } + + m_styleSheet = QString::fromUtf8(file.readAll()); + emit styleSheetChanged(m_styleSheet); +} diff --git a/src/plugins/VerticalTabs/verticaltabsplugin.h b/src/plugins/VerticalTabs/verticaltabsplugin.h index e72504513..fda6d2590 100644 --- a/src/plugins/VerticalTabs/verticaltabsplugin.h +++ b/src/plugins/VerticalTabs/verticaltabsplugin.h @@ -58,17 +58,26 @@ public: AddChildBehavior addChildBehavior() const; void setAddChildBehavior(AddChildBehavior behavior); + QString theme() const; + void setTheme(const QString &theme); + + QString styleSheet() const; + signals: void viewTypeChanged(ViewType type); + void styleSheetChanged(const QString &styleSheet); private: void mainWindowCreated(BrowserWindow *window); void setTabBarVisible(bool visible); void setWebTabBehavior(AddChildBehavior behavior); + void loadStyleSheet(const QString &theme); QString m_settingsPath; VerticalTabsController *m_controller = nullptr; ViewType m_viewType = TabListView; bool m_replaceTabBar = false; AddChildBehavior m_addChildBehavior = AppendChild; + QString m_theme; + QString m_styleSheet; }; diff --git a/src/plugins/VerticalTabs/verticaltabssettings.cpp b/src/plugins/VerticalTabs/verticaltabssettings.cpp index 653d0ce82..7dacb6ac2 100644 --- a/src/plugins/VerticalTabs/verticaltabssettings.cpp +++ b/src/plugins/VerticalTabs/verticaltabssettings.cpp @@ -19,6 +19,9 @@ #include "ui_verticaltabssettings.h" #include "verticaltabsplugin.h" +#include +#include + VerticalTabsSettings::VerticalTabsSettings(VerticalTabsPlugin *plugin, QWidget *parent) : QDialog(parent) , ui(new Ui::VerticalTabsSettings) @@ -33,11 +36,15 @@ VerticalTabsSettings::VerticalTabsSettings(VerticalTabsPlugin *plugin, QWidget * ui->prependChild->setChecked(m_plugin->addChildBehavior() == VerticalTabsPlugin::PrependChild); ui->replaceTabBar->setChecked(m_plugin->replaceTabBar()); + loadThemes(); + + connect(ui->theme, SIGNAL(activated(int)), this, SLOT(themeValueChanged(int))); connect(ui->buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); connect(ui->buttonBox, &QDialogButtonBox::accepted, this, [this]() { m_plugin->setViewType(ui->tabListView->isChecked() ? VerticalTabsPlugin::TabListView : VerticalTabsPlugin::TabTreeView); m_plugin->setAddChildBehavior(ui->appendChild->isChecked() ? VerticalTabsPlugin::AppendChild : VerticalTabsPlugin::PrependChild); m_plugin->setReplaceTabBar(ui->replaceTabBar->isChecked()); + m_plugin->setTheme(ui->theme->currentData().toString()); accept(); }); } @@ -46,3 +53,38 @@ VerticalTabsSettings::~VerticalTabsSettings() { delete ui; } + +void VerticalTabsSettings::themeValueChanged(int index) +{ + const int customIndex = ui->theme->count() - 1; + if (index == customIndex) { + const QString path = QFileDialog::getOpenFileName(this, tr("Theme file"), QDir::homePath(), {QSL("*.css")}); + if (path.isEmpty()) { + loadThemes(); + } else { + ui->theme->setToolTip(path); + ui->theme->setItemData(customIndex, path); + } + } else { + ui->theme->setToolTip(QString()); + } +} + +void VerticalTabsSettings::loadThemes() +{ + ui->theme->clear(); + bool found = false; + const auto files = QDir(QSL(":verticaltabs/data/themes")).entryInfoList({QSL("*.css")}); + for (const QFileInfo &file : files) { + ui->theme->addItem(file.baseName(), file.absoluteFilePath()); + if (file.absoluteFilePath() == m_plugin->theme()) { + ui->theme->setCurrentIndex(ui->theme->count() - 1); + found = true; + } + } + ui->theme->setToolTip(m_plugin->theme()); + ui->theme->addItem(tr("Custom..."), found ? QString() : m_plugin->theme()); + if (!found) { + ui->theme->setCurrentIndex(ui->theme->count() - 1); + } +} diff --git a/src/plugins/VerticalTabs/verticaltabssettings.h b/src/plugins/VerticalTabs/verticaltabssettings.h index f7d01411c..88a844847 100644 --- a/src/plugins/VerticalTabs/verticaltabssettings.h +++ b/src/plugins/VerticalTabs/verticaltabssettings.h @@ -32,7 +32,12 @@ public: explicit VerticalTabsSettings(VerticalTabsPlugin *plugin, QWidget *parent = nullptr); ~VerticalTabsSettings(); +private slots: + void themeValueChanged(int index); + private: + void loadThemes(); + Ui::VerticalTabsSettings *ui; VerticalTabsPlugin *m_plugin; }; diff --git a/src/plugins/VerticalTabs/verticaltabssettings.ui b/src/plugins/VerticalTabs/verticaltabssettings.ui index e31076c62..cddb167a6 100644 --- a/src/plugins/VerticalTabs/verticaltabssettings.ui +++ b/src/plugins/VerticalTabs/verticaltabssettings.ui @@ -7,7 +7,7 @@ 0 0 460 - 317 + 344 @@ -57,13 +57,23 @@ + + + + Theme: + + + + + + - Use as replacement for main TabBar. + Use as replacement for main tab bar