Summary: Backport of [upstream commit](1a70479ed9
)
Test Plan: I confirmed it built, but I guess someone with more intimacy of the problem should review it.
Reviewers: tsimonq2
Reviewed By: tsimonq2
Subscribers: redwolf
Differential Revision: https://phab.lubuntu.me/D11
ubuntu/cosmic
ubuntu/0.13.0-0ubuntu5
parent
d20ac88a1d
commit
cac77df978
@ -0,0 +1,322 @@
|
||||
Description: Add optional overriding of icon theme.
|
||||
Author: Walter Lapchynski <wxl@ubuntu.com>
|
||||
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<int>::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 @@
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
+ <item>
|
||||
+ <widget class="QGroupBox" name="groupBox_icon">
|
||||
+ <property name="toolTip">
|
||||
+ <string>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)</string>
|
||||
+ </property>
|
||||
+ <property name="title">
|
||||
+ <string>Override icon &theme</string>
|
||||
+ </property>
|
||||
+ <property name="checkable">
|
||||
+ <bool>true</bool>
|
||||
+ </property>
|
||||
+ <property name="checked">
|
||||
+ <bool>false</bool>
|
||||
+ </property>
|
||||
+ <layout class="QFormLayout" name="formLayout_2">
|
||||
+ <property name="formAlignment">
|
||||
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
|
||||
+ </property>
|
||||
+ <item row="0" column="0">
|
||||
+ <widget class="QLabel" name="label_3">
|
||||
+ <property name="text">
|
||||
+ <string>Icon theme for panels:</string>
|
||||
+ </property>
|
||||
+ </widget>
|
||||
+ </item>
|
||||
+ <item row="0" column="1">
|
||||
+ <widget class="QComboBox" name="comboBox_icon"/>
|
||||
+ </item>
|
||||
+ </layout>
|
||||
+ </widget>
|
||||
+ </item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
--- 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<LXQtPanelApplication*>(qApp);
|
||||
+ a->setIconTheme(iconTheme);
|
||||
+}
|
||||
+
|
||||
+void LXQtPanel::updateConfigDialog() const
|
||||
+{
|
||||
+ if (!mConfigDialog.isNull() && mConfigDialog->isVisible())
|
||||
+ {
|
||||
+ mConfigDialog->updateIconThemeSettings();
|
||||
+ const QList<QWidget*> widgets = mConfigDialog->findChildren<QWidget*>();
|
||||
+ 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<LXQtPanel*> 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.
|
Loading…
Reference in new issue