diff --git a/debian/changelog b/debian/changelog index 13a22b1..7be6153 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +lxqt-panel (0.13.0-0ubuntu5) cosmic; urgency=medium + + * Add optional overriding of icon theme. + * Run wrap-and-sort. + + -- Walter Lapchynski Tue, 21 Aug 2018 23:37:22 -0700 + lxqt-panel (0.13.0-0ubuntu4) cosmic; urgency=medium * Change the Uploaders to Ubuntu uploaders. diff --git a/debian/patches/override-icon-theme.patch b/debian/patches/override-icon-theme.patch new file mode 100644 index 0000000..4982280 --- /dev/null +++ b/debian/patches/override-icon-theme.patch @@ -0,0 +1,322 @@ +Description: Add optional overriding of icon theme. +Author: Walter Lapchynski +Last-Updated: 2018-08-22 +Applied-Upstream: https://github.com/lxqt/lxqt-panel/pull/674/commits/1a70479ed931e07a67a182223426328ab3fcbeff +--- a/panel/config/configpaneldialog.cpp ++++ b/panel/config/configpaneldialog.cpp +@@ -56,3 +56,8 @@ void ConfigPanelDialog::showConfigPlugin + { + showPage(mPluginsPage); + } ++ ++void ConfigPanelDialog::updateIconThemeSettings() ++{ ++ mPanelPage->updateIconThemeSettings(); ++} +--- a/panel/config/configpaneldialog.h ++++ b/panel/config/configpaneldialog.h +@@ -43,6 +43,7 @@ public: + + void showConfigPanelPage(); + void showConfigPluginsPage(); ++ void updateIconThemeSettings(); + + private: + ConfigPanelWidget *mPanelPage; +--- a/panel/config/configpanelwidget.cpp ++++ b/panel/config/configpanelwidget.cpp +@@ -57,6 +57,7 @@ ConfigPanelWidget::ConfigPanelWidget(LXQ + + fillComboBox_position(); + fillComboBox_alignment(); ++ fillComboBox_icon(); + + mOldPanelSize = mPanel->panelSize(); + mOldIconSize = mPanel->iconSize(); +@@ -115,6 +116,9 @@ ConfigPanelWidget::ConfigPanelWidget(LXQ + connect(ui->slider_opacity, &QSlider::valueChanged, this, &ConfigPanelWidget::editChanged); + + connect(ui->checkBox_reserveSpace, &QAbstractButton::toggled, [this](bool checked) { mPanel->setReserveSpace(checked, true); }); ++ ++ connect(ui->groupBox_icon, &QGroupBox::clicked, this, &ConfigPanelWidget::editChanged); ++ connect(ui->comboBox_icon, QOverload::of(&QComboBox::activated), this, &ConfigPanelWidget::editChanged); + } + + +@@ -211,6 +215,59 @@ void ConfigPanelWidget::fillComboBox_ali + }; + } + ++/************************************************ ++ * ++ ************************************************/ ++void ConfigPanelWidget::fillComboBox_icon() ++{ ++ ui->groupBox_icon->setChecked(!mPanel->iconTheme().isEmpty()); ++ ++ QStringList themeList; ++ QStringList processed; ++ const QStringList baseDirs = QIcon::themeSearchPaths(); ++ for (const QString &baseDirName : baseDirs) ++ { ++ QDir baseDir(baseDirName); ++ if (!baseDir.exists()) ++ continue; ++ const QFileInfoList dirs = baseDir.entryInfoList(QDir::AllDirs | QDir::NoDotAndDotDot, QDir::Name); ++ for (const QFileInfo &dir : dirs) ++ { ++ if (!processed.contains(dir.canonicalFilePath())) ++ { ++ processed << dir.canonicalFilePath(); ++ QDir Dir(dir.canonicalFilePath()); ++ QSettings file(Dir.absoluteFilePath(QStringLiteral("index.theme")), QSettings::IniFormat); ++ if (file.status() == QSettings::NoError ++ && !file.value(QStringLiteral("Icon Theme/Directories")).toStringList().join(QLatin1Char(' ')).isEmpty() ++ && !file.value(QStringLiteral("Icon Theme/Hidden"), false).toBool()) ++ { ++ themeList << Dir.dirName(); ++ } ++ } ++ } ++ } ++ if (!themeList.isEmpty()) ++ { ++ themeList.sort(); ++ ui->comboBox_icon->insertItems(0, themeList); ++ QString curTheme = QIcon::themeName(); ++ if (!curTheme.isEmpty()) ++ ui->comboBox_icon->setCurrentText(curTheme); ++ } ++} ++ ++ ++/************************************************ ++ * ++ ************************************************/ ++void ConfigPanelWidget::updateIconThemeSettings() ++{ ++ ui->groupBox_icon->setChecked(!mPanel->iconTheme().isEmpty()); ++ QString curTheme = QIcon::themeName(); ++ if (!curTheme.isEmpty()) ++ ui->comboBox_icon->setCurrentText(curTheme); ++} + + /************************************************ + * +@@ -284,6 +341,11 @@ void ConfigPanelWidget::editChanged() + + QString image = ui->checkBox_customBgImage->isChecked() ? ui->lineEdit_customBgImage->text() : QString(); + mPanel->setBackgroundImage(image, true); ++ ++ if (!ui->groupBox_icon->isChecked()) ++ mPanel->setIconTheme(QString()); ++ else if (!ui->comboBox_icon->currentText().isEmpty()) ++ mPanel->setIconTheme(ui->comboBox_icon->currentText()); + } + + +--- a/panel/config/configpanelwidget.h ++++ b/panel/config/configpanelwidget.h +@@ -49,6 +49,7 @@ public: + + int screenNum() const { return mScreenNum; } + ILXQtPanel::Position position() const { return mPosition; } ++ void updateIconThemeSettings(); + + signals: + void changed(); +@@ -73,6 +74,7 @@ private: + void addPosition(const QString& name, int screen, LXQtPanel::Position position); + void fillComboBox_position(); + void fillComboBox_alignment(); ++ void fillComboBox_icon(); + int indexForPosition(int screen, ILXQtPanel::Position position); + int getMaxLength(); + +--- a/panel/config/configpanelwidget.ui ++++ b/panel/config/configpanelwidget.ui +@@ -555,6 +555,44 @@ + + + ++ ++ ++ ++ A partial workaround for widget styles that ++cannot give a separate theme to the panel. ++ ++You might also want to disable: ++ ++LXQt Appearance Configuration → ++Icons Theme → ++Colorize icons based on widget style (palette) ++ ++ ++ Override icon &theme ++ ++ ++ true ++ ++ ++ false ++ ++ ++ ++ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter ++ ++ ++ ++ ++ Icon theme for panels: ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + +--- a/panel/lxqtpanel.cpp ++++ b/panel/lxqtpanel.cpp +@@ -1354,6 +1354,28 @@ void LXQtPanel::setShowDelay(int showDel + saveSettings(true); + } + ++QString LXQtPanel::iconTheme() const ++{ ++ return mSettings->value("iconTheme").toString(); ++} ++ ++void LXQtPanel::setIconTheme(const QString& iconTheme) ++{ ++ LXQtPanelApplication *a = reinterpret_cast(qApp); ++ a->setIconTheme(iconTheme); ++} ++ ++void LXQtPanel::updateConfigDialog() const ++{ ++ if (!mConfigDialog.isNull() && mConfigDialog->isVisible()) ++ { ++ mConfigDialog->updateIconThemeSettings(); ++ const QList widgets = mConfigDialog->findChildren(); ++ for (QWidget *widget : widgets) ++ widget->update(); ++ } ++} ++ + bool LXQtPanel::isPluginSingletonAndRunnig(QString const & pluginId) const + { + Plugin const * plugin = mPlugins->pluginByID(pluginId); +--- a/panel/lxqtpanel.h ++++ b/panel/lxqtpanel.h +@@ -222,6 +222,7 @@ public: + bool hidable() const { return mHidable; } + int animationTime() const { return mAnimationTime; } + int showDelay() const { return mShowDelayTimer.interval(); } ++ QString iconTheme() const; + + /*! + * \brief Checks if a given Plugin is running and has the +@@ -232,6 +233,11 @@ public: + * ILXQtPanelPlugin::SingleInstance flag set, false otherwise. + */ + bool isPluginSingletonAndRunnig(QString const & pluginId) const; ++ /*! ++ * \brief Updates the config dialog. Used for updating its icons ++ * when the panel-specific icon theme changes. ++ */ ++ void updateConfigDialog() const; + + public slots: + /** +@@ -299,6 +305,7 @@ public slots: + void setHidable(bool hidable, bool save); //!< \sa setPanelSize() + void setAnimationTime(int animationTime, bool save); //!< \sa setPanelSize() + void setShowDelay(int showDelay, bool save); //!< \sa setPanelSize() ++ void setIconTheme(const QString& iconTheme); + + /** + * @brief Saves the current configuration, i.e. writes the current +@@ -549,7 +556,7 @@ private: + * @brief Stores if mLength is stored in pixels or relative to the + * screen size in percents. If true, the length is stored in percents, + * otherwise in pixels. +- * ++ * + * \sa mLength + */ + bool mLengthInPercents; +--- a/panel/lxqtpanelapplication.cpp ++++ b/panel/lxqtpanelapplication.cpp +@@ -117,6 +117,15 @@ LXQtPanelApplication::LXQtPanelApplicati + + QStringList panels = d->mSettings->value("panels").toStringList(); + ++ // WARNING: Giving a separate icon theme to the panel is wrong and has side effects. ++ // However, it is optional and can be used as the last resort for avoiding a low ++ // contrast in the case of symbolic SVG icons. (The correct way of doing that is ++ // using a Qt widget style that can assign a separate theme/QPalette to the panel.) ++ mGlobalIconTheme = QIcon::themeName(); ++ const QString iconTheme = d->mSettings->value("iconTheme").toString(); ++ if (!iconTheme.isEmpty()) ++ QIcon::setThemeName(iconTheme); ++ + if (panels.isEmpty()) + { + panels << "panel1"; +@@ -280,3 +289,21 @@ bool LXQtPanelApplication::isPluginSingl + + return false; + } ++ ++// See LXQtPanelApplication::LXQtPanelApplication for why this isn't good. ++void LXQtPanelApplication::setIconTheme(const QString &iconTheme) ++{ ++ Q_D(LXQtPanelApplication); ++ ++ d->mSettings->setValue("iconTheme", iconTheme == mGlobalIconTheme ? QString() : iconTheme); ++ QString newTheme = iconTheme.isEmpty() ? mGlobalIconTheme : iconTheme; ++ if (newTheme != QIcon::themeName()) ++ { ++ QIcon::setThemeName(newTheme); ++ for(LXQtPanel* panel : qAsConst(mPanels)) ++ { ++ panel->update(); ++ panel->updateConfigDialog(); ++ } ++ } ++} +--- a/panel/lxqtpanelapplication.h ++++ b/panel/lxqtpanelapplication.h +@@ -69,12 +69,14 @@ public: + explicit LXQtPanelApplication(int& argc, char** argv); + ~LXQtPanelApplication(); + ++ void setIconTheme(const QString &iconTheme); ++ + /*! + * \brief Determines the number of LXQtPanel objects + * \return the current number of LXQtPanel objects + */ +- int count() { return mPanels.count(); } +- ++ int count() const { return mPanels.count(); } ++ + /*! + * \brief Checks if a given Plugin is running and has the + * ILXQtPanelPlugin::SingleInstance flag set. As Plugins are added to +@@ -123,6 +125,10 @@ private: + */ + QList mPanels; + /*! ++ * \brief The global icon theme used by all apps (except for panels perhaps). ++ */ ++ QString mGlobalIconTheme; ++ /*! + * \brief Creates a new LXQtPanel with the given name and connects the + * appropriate signals and slots. + * This method can be used at application startup. diff --git a/debian/patches/series b/debian/patches/series index 43121d9..ff10b2e 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -4,3 +4,4 @@ add-autoexpansion-1.patch add-autoexpansion-2.patch add-autoexpansion-3.patch add-autoexpansion-4.patch +override-icon-theme.patch