From bd524c337a59d070da621c5dbcd749d2b8354db7 Mon Sep 17 00:00:00 2001 From: liuxinhao Date: Mon, 22 Apr 2024 13:45:35 +0800 Subject: [PATCH] feat(greeter plugin): Adjusting the Greeter Control Center plugin to use a new version of the interface for keyword search MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 调整Greeter控制中心插件使用新版本接口并支持关键字搜索 Closes #35280 --- data/kiran-cpanel-greeter.desktop.in | 33 -------- .../kiran-cpanel-greeter/CMakeLists.txt | 8 +- ...cp-interface.cpp => greeter-interface.cpp} | 58 ++++++------- .../kiran-cpanel-greeter/greeter-interface.h | 46 ++++++++++ .../kiran-cpanel-greeter/greeter-subitem.cpp | 84 +++++++++++++++++++ .../kiran-cpanel-greeter/greeter-subitem.h | 57 +++++++++++++ .../kiran-cpanel-greeter/kcp-interface.h | 50 ----------- .../kiran-cpanel-greeter/setting-window.cpp | 28 ++++++- .../kiran-cpanel-greeter/setting-window.h | 3 + translations/kiran-cpanel-greeter.zh_CN.ts | 68 +++++++-------- 10 files changed, 277 insertions(+), 158 deletions(-) delete mode 100644 data/kiran-cpanel-greeter.desktop.in rename src/lightdm-greeter/kiran-cpanel-greeter/{kcp-interface.cpp => greeter-interface.cpp} (59%) create mode 100644 src/lightdm-greeter/kiran-cpanel-greeter/greeter-interface.h create mode 100644 src/lightdm-greeter/kiran-cpanel-greeter/greeter-subitem.cpp create mode 100644 src/lightdm-greeter/kiran-cpanel-greeter/greeter-subitem.h delete mode 100644 src/lightdm-greeter/kiran-cpanel-greeter/kcp-interface.h diff --git a/data/kiran-cpanel-greeter.desktop.in b/data/kiran-cpanel-greeter.desktop.in deleted file mode 100644 index db1065d..0000000 --- a/data/kiran-cpanel-greeter.desktop.in +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env xdg-open -[Desktop Entry] -Encoding=UTF-8 -Name=Greeter Settings -Name[zh_CN]=登录选项 -Comment=kiran greeter settings -Comment=Kiran登录界面选项 -#通过启动器单独执行 -Exec=kiran-cpanel-launcher --cpanel-plugin=kiran-cpanel-greeter -Icon=kcp-greeter -Terminal=false -Type=Application -Categories=Lightdm;Greeter;Core;Settings;System;X-Common-Features;X-Common-Features; -X-KIRAN-NoDisplay=true - -[Kiran Control Panel Plugin] -#插件排序 -Weight=99 -#插件分类 -Category=login-settings -#插件共享库位置,若以'/'开头则为绝对路径,也可支持通过共享库名去插件安装目录去查找 -Library=libkiran-cpanel-greeter.so -SubItems=Greeter - -[Greeter] -#插件子项名 该值提供给控制中心形成子项列表 -Name=Greeter Settings -Name[zh_CN] = 登录选项 -#插件Icon -Icon=kcp-greeter -#插件关键字 该值提供给控制中心形成搜索列表 -Keywords[zh_CN]=登录选项 -Keywords = Greeter \ No newline at end of file diff --git a/src/lightdm-greeter/kiran-cpanel-greeter/CMakeLists.txt b/src/lightdm-greeter/kiran-cpanel-greeter/CMakeLists.txt index e556b36..16cde77 100644 --- a/src/lightdm-greeter/kiran-cpanel-greeter/CMakeLists.txt +++ b/src/lightdm-greeter/kiran-cpanel-greeter/CMakeLists.txt @@ -10,8 +10,8 @@ pkg_get_variable(CPANEL_DESKTOP_DIR kiran-control-panel plugin_desktop_location) file(GLOB CPANEL_GREETER_SRC "../common/*.cpp" "../common/*.h" "./*.cpp" "./*.h" "./*.ui") set(CPANEL_GREETER_RESOURCE ${CMAKE_SOURCE_DIR}/resources/kcp-greeter-resources.qrc) file(GLOB CPANEL_GREETER_TRANSLATION ${CMAKE_SOURCE_DIR}/translations/kiran-cpanel-greeter.*.ts) -qt5_create_translation(GREETER_SETTINS_QM_FILES - ${CMAKE_CURRENT_SOURCE_DIR} +qt5_create_translation(GREETER_SETTINS_QM_FILES + ${CMAKE_CURRENT_SOURCE_DIR} ${CPANEL_GREETER_TRANSLATION} OPTIONS -I ${CMAKE_CURRENT_SOURCE_DIR} -I ${CMAKE_CURRENT_BINARY_DIR} ) @@ -45,10 +45,6 @@ target_link_libraries(${TARGET_NAME} ${KIRAN_STYLE_HELPER_LIBRARIES}) # 安装 -#安装插件desktop文件 -configure_file(${CMAKE_SOURCE_DIR}/data/kiran-cpanel-greeter.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/kiran-cpanel-greeter.desktop @ONLY) -install(FILES ${CMAKE_CURRENT_BINARY_DIR}/kiran-cpanel-greeter.desktop DESTINATION ${CPANEL_DESKTOP_DIR}/) - #安装插件 install(TARGETS ${TARGET_NAME} DESTINATION ${CPANEL_PLUGIN_DIR}/) #翻译文件 diff --git a/src/lightdm-greeter/kiran-cpanel-greeter/kcp-interface.cpp b/src/lightdm-greeter/kiran-cpanel-greeter/greeter-interface.cpp similarity index 59% rename from src/lightdm-greeter/kiran-cpanel-greeter/kcp-interface.cpp rename to src/lightdm-greeter/kiran-cpanel-greeter/greeter-interface.cpp index 3d5691c..0b346bc 100644 --- a/src/lightdm-greeter/kiran-cpanel-greeter/kcp-interface.cpp +++ b/src/lightdm-greeter/kiran-cpanel-greeter/greeter-interface.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2020 ~ 2021 KylinSec Co., Ltd. + * Copyright (c) 2020 ~ 2024 KylinSec Co., Ltd. * kiran-session-guard is licensed under Mulan PSL v2. * You can use this software according to the terms and conditions of the Mulan PSL v2. * You may obtain a copy of Mulan PSL v2 at: @@ -9,34 +9,35 @@ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. * See the Mulan PSL v2 for more details. * - * Author: liuxinhao + * Author: liuxinhao */ +#include "greeter-interface.h" +#include "greeter-subitem.h" -#include "kcp-interface.h" -#include "setting-window.h" - -#include -#include +#include #include - -#define KCP_SUBITEM_GREETER_ID "Greeter" +#include +#include namespace Kiran { namespace SessionGuard { -namespace Greeter -{ -KcpInterface::KcpInterface() +GreeterInterface::GreeterInterface(QObject* parent) + :QObject() { + } -KcpInterface::~KcpInterface() +GreeterInterface::~GreeterInterface() { + } -int KcpInterface::init() +int GreeterInterface::init(KiranControlPanel::PanelInterface* interface) { + m_panelInterface = interface; + if (m_translator != nullptr) { QCoreApplication::removeTranslator(m_translator); @@ -51,7 +52,7 @@ int KcpInterface::init() "/usr/share/lightdm-kiran-greeter/translations", ".qm")) { - KLOG_ERROR() << "load translator failed!"; + KLOG_ERROR() << "greeter plugin load translator failed!"; m_translator->deleteLater(); m_translator = nullptr; } @@ -60,32 +61,23 @@ int KcpInterface::init() QCoreApplication::installTranslator(m_translator); } + m_subitem.reset(new GreeterSubItem(interface, this)); return 0; } -void KcpInterface::uninit() +void GreeterInterface::uninit() { -} -QWidget* KcpInterface::getSubItemWidget(QString subItemName) -{ - QWidget* widget = nullptr; - if (subItemName == KCP_SUBITEM_GREETER_ID) + if (m_translator != nullptr) { - widget = new SettingWindow; + qApp->removeTranslator(m_translator); + m_translator->deleteLater(); + m_translator = nullptr; } - m_currentWidget = widget; - return m_currentWidget; } -bool KcpInterface::haveUnsavedOptions() +QVector GreeterInterface::getSubItems() { - return false; + return {m_subitem}; +} } - -QStringList KcpInterface::visibleSubItems() -{ - return QStringList() << KCP_SUBITEM_GREETER_ID; } -} // namespace Greeter -} // namespace SessionGuard -} // namespace Kiran \ No newline at end of file diff --git a/src/lightdm-greeter/kiran-cpanel-greeter/greeter-interface.h b/src/lightdm-greeter/kiran-cpanel-greeter/greeter-interface.h new file mode 100644 index 0000000..6cea16a --- /dev/null +++ b/src/lightdm-greeter/kiran-cpanel-greeter/greeter-interface.h @@ -0,0 +1,46 @@ +/** + * Copyright (c) 2020 ~ 2024 KylinSec Co., Ltd. + * kiran-session-guard is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + * Author: liuxinhao + */ +#pragma once +#include +#include +#include + +class QTranslator; +namespace Kiran +{ +namespace SessionGuard +{ +class GreeterInterface: public QObject,public KiranControlPanel::PluginInterfaceV2 +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID KiranControlPanel_PluginInterfaceV2_iid) + Q_INTERFACES(KiranControlPanel::PluginInterfaceV2) +public: + GreeterInterface(QObject* parent = nullptr); + ~GreeterInterface(); + + virtual int init(KiranControlPanel::PanelInterface* interface) override; + virtual void uninit() override; + + // 功能项数组,生存周期由插件维护 + // 功能项发生变更时,应调用init时传入KcpInterface接口,通知主面板相关信息变更,及时加载新的功能项信息 + virtual QVector getSubItems() override; + +private: + KiranControlPanel::PanelInterface* m_panelInterface = nullptr; + QTranslator* m_translator = nullptr; + KiranControlPanel::SubItemPtr m_subitem; +}; +} +} \ No newline at end of file diff --git a/src/lightdm-greeter/kiran-cpanel-greeter/greeter-subitem.cpp b/src/lightdm-greeter/kiran-cpanel-greeter/greeter-subitem.cpp new file mode 100644 index 0000000..8b323e2 --- /dev/null +++ b/src/lightdm-greeter/kiran-cpanel-greeter/greeter-subitem.cpp @@ -0,0 +1,84 @@ +/** + * Copyright (c) 2020 ~ 2024 KylinSec Co., Ltd. + * kiran-session-guard is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + * Author: liuxinhao + */ +#include "greeter-subitem.h" +#include "setting-window.h" + +using namespace Kiran::SessionGuard::Greeter; + +GreeterSubItem::GreeterSubItem(KiranControlPanel::PanelInterface* interface, QObject* parent) + : QObject(parent), + m_interface(interface) +{ +} + +GreeterSubItem ::~GreeterSubItem() +{ +} + +QString GreeterSubItem::getID() +{ + return "Greeter"; +} + +QString GreeterSubItem::getName() +{ + return tr("Greeter Settings"); +} + +QString GreeterSubItem::getCategory() +{ + return "login-settings"; +} + +QString GreeterSubItem::getDesc() +{ + return ""; +} + +QString GreeterSubItem::getIcon() +{ + return "kcp-greeter"; +} + +int GreeterSubItem::getWeight() +{ + return 999; +} + +QVector> GreeterSubItem::getSearchKeys() +{ + auto res = SettingWindow::getSearchKeys(); + return res; +} + +QWidget* GreeterSubItem::createWidget() +{ + m_subitemWidget = new SettingWindow(); + m_subitemWidget->installEventFilter(this); + return m_subitemWidget; +} + +bool GreeterSubItem::jumpToSearchEntry(const QString& key) +{ + if (!m_subitemWidget) + return false; + + m_subitemWidget->jumpToSearchKey(key); + return true; +} + +bool GreeterSubItem::haveUnSavedOptions() +{ + return false; +} \ No newline at end of file diff --git a/src/lightdm-greeter/kiran-cpanel-greeter/greeter-subitem.h b/src/lightdm-greeter/kiran-cpanel-greeter/greeter-subitem.h new file mode 100644 index 0000000..474392c --- /dev/null +++ b/src/lightdm-greeter/kiran-cpanel-greeter/greeter-subitem.h @@ -0,0 +1,57 @@ +/** + * Copyright (c) 2020 ~ 2024 KylinSec Co., Ltd. + * kiran-session-guard is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + * Author: liuxinhao + */ +#pragma once +#include +#include +#include +#include + +namespace Kiran +{ +namespace SessionGuard +{ +namespace Greeter +{ +class SettingWindow; +} +} // namespace SessionGuard +} // namespace Kiran + +class GreeterSubItem : public QObject, + public KiranControlPanel::PluginSubitemInterface +{ + Q_OBJECT +public: + GreeterSubItem(KiranControlPanel::PanelInterface* interface, QObject* parent = nullptr); + ~GreeterSubItem(); + + QString getID() override; + QString getName() override; + QString getCategory() override; + QString getDesc() override; + QString getIcon() override; + int getWeight() override; + + // 获取自定义搜索关键词 + // QVector< 显示文本(已翻译),搜索跳转标识ID > + QVector> getSearchKeys() override; + + QWidget* createWidget() override; + bool jumpToSearchEntry(const QString& key) override; + bool haveUnSavedOptions() override; + +private: + KiranControlPanel::PanelInterface* m_interface = nullptr; + Kiran::SessionGuard::Greeter::SettingWindow* m_subitemWidget = nullptr; +}; diff --git a/src/lightdm-greeter/kiran-cpanel-greeter/kcp-interface.h b/src/lightdm-greeter/kiran-cpanel-greeter/kcp-interface.h deleted file mode 100644 index 4759f99..0000000 --- a/src/lightdm-greeter/kiran-cpanel-greeter/kcp-interface.h +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Copyright (c) 2020 ~ 2021 KylinSec Co., Ltd. - * kiran-session-guard is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * http://license.coscl.org.cn/MulanPSL2 - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, - * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, - * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - * - * Author: liuxinhao - */ -#pragma once -#include - - -QT_BEGIN_NAMESPACE -class QTranslator; -QT_END_NAMESPACE - -namespace Kiran -{ -namespace SessionGuard -{ -namespace Greeter -{ -class KcpInterface : public QObject, public KcpPluginInterface -{ - Q_OBJECT - Q_PLUGIN_METADATA(IID KcpPluginInterface_iid) - Q_INTERFACES(KcpPluginInterface) -public: - KcpInterface(); - ~KcpInterface() override; - - int init() override; - void uninit() override; - - QWidget* getSubItemWidget(QString subItemName) override; - bool haveUnsavedOptions() override; - QStringList visibleSubItems() override; - -private: - QWidget* m_currentWidget = nullptr; - QTranslator* m_translator = nullptr; -}; -} // namespace Greeter -} // namespace SessionGuard -} // namespace Kiran \ No newline at end of file diff --git a/src/lightdm-greeter/kiran-cpanel-greeter/setting-window.cpp b/src/lightdm-greeter/kiran-cpanel-greeter/setting-window.cpp index 45c9fb9..3712051 100644 --- a/src/lightdm-greeter/kiran-cpanel-greeter/setting-window.cpp +++ b/src/lightdm-greeter/kiran-cpanel-greeter/setting-window.cpp @@ -39,6 +39,9 @@ #define BACKGROUND_SAVE_LOCATION "/usr/share/lightdm-kiran-greeter/background" +#define ITEM_GENERAL_SETTINGS QT_TRANSLATE_NOOP("Kiran::SessionGuard::Greeter::SettingWindow","general settings") +#define ITEM_AUTO_LOGIN_SETTINGS QT_TRANSLATE_NOOP("Kiran::SessionGuard::Greeter::SettingWindow","autologin") + enum GreeterSettingsPageEnum { GreeterSettings_Appearance, @@ -91,11 +94,11 @@ void SettingWindow::initUI() layoutSideWidget->addWidget(m_sidebarWidget); QListWidgetItem *item; - item = new QListWidgetItem(tr("general settings"), m_sidebarWidget); + item = new QListWidgetItem(tr(ITEM_GENERAL_SETTINGS), m_sidebarWidget); item->setIcon(QIcon(":/kcp-greeter/images/appearance_setting.png")); m_sidebarWidget->addItem(item); - item = new QListWidgetItem(tr("autologin"), m_sidebarWidget); + item = new QListWidgetItem(tr(ITEM_AUTO_LOGIN_SETTINGS), m_sidebarWidget); item->setIcon(QIcon(":/kcp-greeter/images/user_login_setting.png")); m_sidebarWidget->addItem(item); @@ -703,6 +706,27 @@ QSize SettingWindow::sizeHint() const return {940, 653}; } +QVector> SettingWindow::getSearchKeys() +{ + QVector> searchEntries = { + {tr(ITEM_GENERAL_SETTINGS),tr(ITEM_GENERAL_SETTINGS)}, + {tr(ITEM_AUTO_LOGIN_SETTINGS),tr(ITEM_AUTO_LOGIN_SETTINGS)} + }; + + return searchEntries; +} + +void SettingWindow::jumpToSearchKey(const QString& subItem) +{ + auto resList = m_sidebarWidget->findItems(subItem,Qt::MatchFixedString); + if( resList.isEmpty() ) + { + KLOG_ERROR() << "greeter plugin can't find SubItem:" << subItem; + return; + } + m_sidebarWidget->setCurrentItem(resList.at(0)); +} + void SettingWindow::onLoginOptionsChanged() { auto changedSwitch = qobject_cast(sender()); diff --git a/src/lightdm-greeter/kiran-cpanel-greeter/setting-window.h b/src/lightdm-greeter/kiran-cpanel-greeter/setting-window.h index 1c95a1c..4975275 100644 --- a/src/lightdm-greeter/kiran-cpanel-greeter/setting-window.h +++ b/src/lightdm-greeter/kiran-cpanel-greeter/setting-window.h @@ -99,6 +99,9 @@ public: QSize sizeHint() const override; + static QVector> getSearchKeys(); + void jumpToSearchKey(const QString& subItem); + private: void initUI(); diff --git a/translations/kiran-cpanel-greeter.zh_CN.ts b/translations/kiran-cpanel-greeter.zh_CN.ts index 5468e6f..d76b4b5 100644 --- a/translations/kiran-cpanel-greeter.zh_CN.ts +++ b/translations/kiran-cpanel-greeter.zh_CN.ts @@ -3,14 +3,6 @@ GreeterSettingWindow - - autologin - 自动登录 - - - general settings - 登录选项 - auto login user(take effect after restart) 自动登录用户(重启后生效) @@ -86,113 +78,121 @@ Select discard to discard the modification and reload the new configuration保存成功 + + GreeterSubItem + + + Greeter Settings + 登录选项 + + Kiran::SessionGuard::Greeter::SettingWindow - + general settings 登录选项 - + autologin 自动登录 - + auto login user(take effect after restart) 自动登录用户(重启后生效) - + auto login delay(seconds)(take effect after restart) 自动登录延时(秒)(重启后生效) - - + + Save 保存 - - + + Reset 重置 - + login background setting 登录背景设置 - + Scale Mode 缩放模式 - + auto 自动 - + manual 手动 - + disable 禁用 - + Scale Factor 缩放比例 - + Enable manual input user login 允许手动输入用户名登录 - + Show User List 显示用户列表 - - + + Configuration changed 配置已改变 - - + + The external configuration file has changed If you choose to save, all external changes will be overwritten Select discard to discard the modification and reload the new configuration 配置文件已被修改,如果继续保存所有额外的修改将会被覆盖,选择丢弃将丢弃所有的修改并重新加载新的配置文件 - - + + Save failed, reload 保存失败,已重新加载 - - + + Saved successfully 保存成功 - + Save failed: %1 保存失败: %1 - + Please ensure that one of the two options is turned on! 请确保两个选项之一被打开! -- 2.33.0