From 03977ba90362fc7458637dd3c0fa5a6ac1dc2765 Mon Sep 17 00:00:00 2001 From: WenTao Song Date: Mon, 26 Jul 2021 16:10:50 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E6=A0=8F-=E9=94=AE=E7=9B=98=E5=B8=83=E5=B1=80=E5=9B=BE?= =?UTF-8?q?=E6=A0=87=E6=8F=90=E4=BE=9B=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E6=88=96=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 社区版桌面系统支持任务栏显示键盘布局插件,用户可以gsetting指令控制插件的显示、隐藏、置灰功能,其他版本桌面系统不显示键盘布局插件插件. Log: 社区版任务栏支持键盘布局插件功能 Task: https://pms.uniontech.com/zentao/task-view-80977.html Change-Id: I7abc680b2ef425644d9d43ee1c1f777d9e853c53 --- debian/dde-dock.install | 1 + frame/util/pluginloader.cpp | 8 +++ .../com.deepin.dde.dock.module.gschema.xml | 16 ++++++ plugins/CMakeLists.txt | 2 +- plugins/keyboard-layout/dbusadaptors.cpp | 11 ++++ plugins/keyboard-layout/dbusadaptors.h | 5 +- plugins/keyboard-layout/keyboardplugin.cpp | 16 ++++++ plugins/keyboard-layout/keyboardplugin.h | 6 +++ plugins/tray/indicatortraywidget.cpp | 53 +++++++++++++++++-- plugins/tray/indicatortraywidget.h | 11 ++++ 10 files changed, 123 insertions(+), 6 deletions(-) diff --git a/debian/dde-dock.install b/debian/dde-dock.install index 50bf6feef..ed96db33d 100644 --- a/debian/dde-dock.install +++ b/debian/dde-dock.install @@ -8,4 +8,5 @@ usr/lib/dde-dock/plugins/liboverlay-warning.so usr/lib/dde-dock/plugins/system-trays usr/lib/dde-dock/plugins/libmultitasking.so usr/lib/dde-dock/plugins/libshow-desktop.so +usr/lib/dde-dock/plugins/libkeyboard-layout.so usr/share diff --git a/frame/util/pluginloader.cpp b/frame/util/pluginloader.cpp index dd68f5e89..93533b5b3 100644 --- a/frame/util/pluginloader.cpp +++ b/frame/util/pluginloader.cpp @@ -26,6 +26,10 @@ #include #include +#include + +DCORE_USE_NAMESPACE + PluginLoader::PluginLoader(const QString &pluginDirPath, QObject *parent) : QThread(parent) , m_pluginDirPath(pluginDirPath) @@ -56,6 +60,10 @@ void PluginLoader::run() if (!QLibrary::isLibrary(file)) continue; + // 社区版需要加载键盘布局,其他不需要 + if (file.contains("libkeyboard-layout") && !DSysInfo::isCommunityEdition()) + continue; + // TODO: old dock plugins is uncompatible if (file.startsWith("libdde-dock-")) continue; diff --git a/gschema/com.deepin.dde.dock.module.gschema.xml b/gschema/com.deepin.dde.dock.module.gschema.xml index 2fb89e0de..a769316aa 100644 --- a/gschema/com.deepin.dde.dock.module.gschema.xml +++ b/gschema/com.deepin.dde.dock.module.gschema.xml @@ -148,6 +148,22 @@ + + + true + Module Enable + + Control Module Enable + + + + true + Menu Enable + + disable item + + + false diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index ea6a804c5..33c46936a 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -6,7 +6,7 @@ add_subdirectory("power") add_subdirectory("sound") add_subdirectory("tray") add_subdirectory("trash") -#add_subdirectory("keyboard-layout") +add_subdirectory("keyboard-layout") add_subdirectory("onboard") add_subdirectory("overlay-warning") add_subdirectory("show-desktop") diff --git a/plugins/keyboard-layout/dbusadaptors.cpp b/plugins/keyboard-layout/dbusadaptors.cpp index e00ed6bbc..9bd427cc3 100644 --- a/plugins/keyboard-layout/dbusadaptors.cpp +++ b/plugins/keyboard-layout/dbusadaptors.cpp @@ -61,6 +61,17 @@ QString DBusAdaptors::layout() const return m_currentLayout; } +void DBusAdaptors::setLayout(const QString &str) +{ + m_currentLayout = str; + emit layoutChanged(str); +} + +Keyboard *DBusAdaptors::getCurrentKeyboard() +{ + return m_keyboard; +} + void DBusAdaptors::onClicked(int button, int x, int y) { // button value means(XCB_BUTTON_INDEX): diff --git a/plugins/keyboard-layout/dbusadaptors.h b/plugins/keyboard-layout/dbusadaptors.h index 21d0c6c4f..971280e8a 100644 --- a/plugins/keyboard-layout/dbusadaptors.h +++ b/plugins/keyboard-layout/dbusadaptors.h @@ -44,8 +44,11 @@ public: ~DBusAdaptors(); public: - Q_PROPERTY(QString layout READ layout NOTIFY layoutChanged) + Q_PROPERTY(QString layout READ layout WRITE setLayout NOTIFY layoutChanged) QString layout() const; + void setLayout(const QString &str); + + Keyboard *getCurrentKeyboard(); public slots: void onClicked(int button, int x, int y); diff --git a/plugins/keyboard-layout/keyboardplugin.cpp b/plugins/keyboard-layout/keyboardplugin.cpp index b60c6b5c6..642d4ec47 100644 --- a/plugins/keyboard-layout/keyboardplugin.cpp +++ b/plugins/keyboard-layout/keyboardplugin.cpp @@ -18,10 +18,14 @@ */ #include "keyboardplugin.h" +#include "utils.h" KeyboardPlugin::KeyboardPlugin(QObject *parent) : QObject(parent) + , m_gsettings(Utils::ModuleSettingsPtr(pluginName(), QByteArray(), this)) { + if (m_gsettings) + connect(m_gsettings, &QGSettings::changed, this, &KeyboardPlugin::onGSettingsChanged); } KeyboardPlugin::~KeyboardPlugin() @@ -91,3 +95,15 @@ void KeyboardPlugin::setSortKey(const QString &itemKey, const int order) m_proxyInter->saveValue(this, key, order); } + +void KeyboardPlugin::onGSettingsChanged(const QString &key) +{ + Q_UNUSED(key); + + // 键盘布局插件处显示的内容就是QLabel中的内容,有文字了就显示,没有文字就不显示了 + if (m_gsettings && m_gsettings->keys().contains("enable")) { + const bool enable = m_gsettings->get("enable").toBool(); + QString layoutStr = m_dbusAdaptors->getCurrentKeyboard()->currentLayout().split(';').first(); + m_dbusAdaptors->setLayout(enable ? layoutStr : ""); + } +} diff --git a/plugins/keyboard-layout/keyboardplugin.h b/plugins/keyboard-layout/keyboardplugin.h index 30cb754c9..fa1ceda45 100644 --- a/plugins/keyboard-layout/keyboardplugin.h +++ b/plugins/keyboard-layout/keyboardplugin.h @@ -23,6 +23,8 @@ #include "pluginsiteminterface.h" #include "dbusadaptors.h" +class QGSettings; + class KeyboardPlugin : public QObject, PluginsItemInterface { Q_OBJECT @@ -43,8 +45,12 @@ public: int itemSortKey(const QString &itemKey) override; void setSortKey(const QString &itemKey, const int order) override; +private slots: + void onGSettingsChanged(const QString &key); + private: DBusAdaptors *m_dbusAdaptors = nullptr; + const QGSettings *m_gsettings; }; #endif diff --git a/plugins/tray/indicatortraywidget.cpp b/plugins/tray/indicatortraywidget.cpp index 0f5f13d8b..e775d16a4 100644 --- a/plugins/tray/indicatortraywidget.cpp +++ b/plugins/tray/indicatortraywidget.cpp @@ -20,8 +20,8 @@ */ #include "indicatortraywidget.h" +#include "util/utils.h" -#include #include #include @@ -31,6 +31,8 @@ IndicatorTrayWidget::IndicatorTrayWidget(const QString &indicatorName, QWidget *parent, Qt::WindowFlags f) : AbstractTrayWidget(parent, f) , m_indicatorName(indicatorName) + , m_gsettings(Utils::ModuleSettingsPtr("keyboard", QByteArray(), this)) + , m_enableClick(true) { setAttribute(Qt::WA_TranslucentBackground); @@ -38,9 +40,9 @@ IndicatorTrayWidget::IndicatorTrayWidget(const QString &indicatorName, QWidget * layout->setContentsMargins(0, 0, 0, 0); m_label = new QLabel(this); - QPalette p = palette(); + QPalette p = m_label->palette(); p.setColor(QPalette::Foreground, Qt::white); - p.setColor(QPalette::Background, Qt::red); + p.setColor(QPalette::Background, Qt::transparent); m_label->setPalette(p); m_label->setAttribute(Qt::WA_TranslucentBackground); @@ -56,6 +58,14 @@ IndicatorTrayWidget::IndicatorTrayWidget(const QString &indicatorName, QWidget * interface, this, QDBusConnection::ExportScriptableSlots); + + if (m_gsettings) { + // 显示键盘布局时更新label的状态 + if (m_gsettings->keys().contains("itemEnable")) + enableLabel(m_gsettings->get("itemEnable").toBool()); + + connect(m_gsettings, &QGSettings::changed, this, &IndicatorTrayWidget::onGSettingsChanged); + } } IndicatorTrayWidget::~IndicatorTrayWidget() @@ -74,7 +84,32 @@ void IndicatorTrayWidget::updateIcon() void IndicatorTrayWidget::sendClick(uint8_t buttonIndex, int x, int y) { - Q_EMIT clicked(buttonIndex, x, y); + if (m_enableClick) + Q_EMIT clicked(buttonIndex, x, y); +} + +void IndicatorTrayWidget::enableLabel(bool enable) +{ + QPalette p = m_label->palette(); + if (!enable) { + m_enableClick = false; + p.setColor(QPalette::Disabled, QPalette::Foreground, Qt::lightGray); + p.setColor(QPalette::Disabled, QPalette::Background, Qt::transparent); + m_label->setEnabled(enable); + } else { + m_enableClick = true; + p.setColor(QPalette::Normal, QPalette::BrightText, Qt::white); + p.setColor(QPalette::Normal, QPalette::Background, Qt::transparent); + m_label->setEnabled(enable); + } + + m_label->setPalette(p); + m_label->update(); +} + +void IndicatorTrayWidget::resizeEvent(QResizeEvent *event) +{ + return QWidget::resizeEvent(event); } void IndicatorTrayWidget::setPixmapData(const QByteArray &data) @@ -89,3 +124,13 @@ void IndicatorTrayWidget::setText(const QString &text) m_label->setText(text); } +void IndicatorTrayWidget::onGSettingsChanged(const QString &key) +{ + Q_UNUSED(key); + + if (m_gsettings && m_gsettings->keys().contains("itemEnable")) { + const bool itemEnable = m_gsettings->get("itemEnable").toBool(); + enableLabel(itemEnable); + } +} + diff --git a/plugins/tray/indicatortraywidget.h b/plugins/tray/indicatortraywidget.h index 05c546573..977fb5ffa 100644 --- a/plugins/tray/indicatortraywidget.h +++ b/plugins/tray/indicatortraywidget.h @@ -26,6 +26,8 @@ #include "abstracttraywidget.h" +class QGSettings; + class IndicatorTrayWidget: public AbstractTrayWidget { Q_OBJECT @@ -36,13 +38,20 @@ public: QString itemKeyForConfig() override; void updateIcon() override; void sendClick(uint8_t, int, int) override; + void enableLabel(bool enable); static QString toIndicatorKey(const QString &indicatorName) { return QString("indicator:%1").arg(indicatorName); } static bool isIndicatorKey(const QString &itemKey) { return itemKey.startsWith("indicator:"); } +protected: + void resizeEvent(QResizeEvent *event) override; + public Q_SLOTS: Q_SCRIPTABLE void setPixmapData(const QByteArray &data); Q_SCRIPTABLE void setText(const QString &text); +private slots: + void onGSettingsChanged(const QString &key); + Q_SIGNALS: void clicked(uint8_t, int, int); @@ -50,5 +59,7 @@ private: QLabel *m_label; QString m_indicatorName; + const QGSettings *m_gsettings; + bool m_enableClick; // 置灰时设置为false,不触发click信号 };