diff --git a/.reuse/dep5 b/.reuse/dep5
index 7d0f6d3..09e864b 100644
--- a/.reuse/dep5
+++ b/.reuse/dep5
@@ -14,12 +14,12 @@ Copyright: None
License: CC0-1.0
#config
-Files: *.service *.desktop *.conf
+Files: *.service *.desktop *.conf *.policy
Copyright: UnionTech Software Technology Co., Ltd.
License: CC0-1.0
# Project file
-Files: *.pro *.prf *.pri *.qrc
+Files: *.pro *.prf *.pri *.qrc *.txt
Copyright: None
License: CC0-1.0
@@ -29,11 +29,11 @@ Copyright: None
License: CC0-1.0
# translation
-Files: deepin-pc-manager/translations/* deepin-pc-manager-server/deepin-pc-manager-session-daemon/translations/*
+Files: *.ts *.qm
Copyright: UnionTech Software Technology Co., Ltd.
License: CC0-1.0
# svg
-Files: deepin-pc-manager/src/window/icons/*.svg deepin-pc-manager/src/window/icons/*.png
+Files: *.svg *.png
Copyright: None
License: CC0-1.0
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 5f557d6..99d769b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,7 +1,3 @@
-# SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
-#
-# SPDX-License-Identifier: GPL-3.0-or-later
-
cmake_minimum_required(VERSION 3.13)
# If do't define version number, specify the version number
@@ -46,6 +42,13 @@ endif()
# 版本号宏定义
add_compile_definitions(QMAKE_VERSION="${VERSION}")
-
add_subdirectory(deepin-pc-manager)
add_subdirectory(deepin-pc-manager-server)
+add_subdirectory(deepin-netcheck-plugin)
+add_subdirectory(deepin-autostart-plugin)
+add_subdirectory(deepin-apprepair-plugin)
+add_subdirectory(deepin-hostmodify-plugin)
+add_subdirectory(deepin-filename-plugin)
+add_subdirectory(deepin-keyclean-plugin)
+add_subdirectory(deepin-fcitxrepair-plugin)
+add_subdirectory(deepin-fileicon-plugin)
diff --git a/CMakeLists.txt.user b/CMakeLists.txt.user
deleted file mode 100644
index 884b08a..0000000
--- a/CMakeLists.txt.user
+++ /dev/null
@@ -1,239 +0,0 @@
-
-
-
-
-
- EnvironmentId
- {4cfd266a-9063-43e9-bb11-fdf9ab69277b}
-
-
- ProjectExplorer.Project.ActiveTarget
- 0
-
-
- ProjectExplorer.Project.EditorSettings
-
- true
- false
- true
-
- Cpp
-
- CppGlobal
-
-
-
- QmlJS
-
- QmlJSGlobal
-
-
- 2
- UTF-8
- false
- 4
- false
- 80
- true
- true
- 1
- 0
- false
- true
- false
- 0
- true
- true
- 0
- 8
- true
- false
- 1
- true
- true
- true
- *.md, *.MD, Makefile
- false
- true
- true
-
-
-
- ProjectExplorer.Project.PluginSettings
-
-
- true
- false
- true
- true
- true
- true
-
-
- 0
- true
-
- true
- true
- Builtin.DefaultTidyAndClazy
- 8
- true
-
-
-
- true
-
-
-
-
- ProjectExplorer.Project.Target.0
-
- Desktop
- 桌面
- 桌面
- {e8cee900-4de0-46cd-ae87-ad96a23347fb}
- 0
- 0
- 1
-
- Debug
- 2
- false
-
- -DCMAKE_GENERATOR:STRING=Unix Makefiles
--DCMAKE_BUILD_TYPE:STRING=Debug
--DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{BuildConfig:BuildDirectory:NativeFilePath}/.qtc/package-manager/auto-setup.cmake
--DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable}
--DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX}
--DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C}
--DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx}
--DCMAKE_CXX_FLAGS_INIT:STRING=%{Qt:QML_DEBUG_FLAG}
- /home/uos/Work/github/deepin-pc-manager
- 0
- /home/uos/Work/github/build-deepin-pc-manager-unknown-Debug
-
-
-
-
- all
-
- false
-
- true
- 构建
- CMakeProjectManager.MakeStep
-
- 1
- 构建
- 构建
- ProjectExplorer.BuildSteps.Build
-
-
-
-
-
- clean
-
- false
-
- true
- 构建
- CMakeProjectManager.MakeStep
-
- 1
- 清除
- 清除
- ProjectExplorer.BuildSteps.Clean
-
- 2
- false
-
- false
-
- Debug
- CMakeProjectManager.CMakeBuildConfiguration
-
- 1
-
-
- 0
- 部署
- 部署
- ProjectExplorer.BuildSteps.Deploy
-
- 1
-
- false
- ProjectExplorer.DefaultDeployConfiguration
-
- 1
-
- true
- true
- 0
- true
-
- 2
-
- false
- deepin-pc-manager
- CMakeProjectManager.CMakeRunConfiguration.deepin-pc-manager
- deepin-pc-manager
- false
- true
- true
- true
- /home/uos/Work/github/build-deepin-pc-manager-unknown-Debug/deepin-pc-manager
-
-
- true
- true
- 0
- true
-
- 2
-
- false
- deepin-pc-manager-session-daemon
- CMakeProjectManager.CMakeRunConfiguration.deepin-pc-manager-session-daemon
- deepin-pc-manager-session-daemon
- false
- true
- true
- true
- /home/uos/Work/github/build-deepin-pc-manager-unknown-Debug/deepin-pc-manager-server/deepin-pc-manager-session-daemon
-
-
- true
- true
- 0
- true
-
- 2
-
- false
- deepin-pc-manager-system-daemon
- CMakeProjectManager.CMakeRunConfiguration.deepin-pc-manager-system-daemon
- deepin-pc-manager-system-daemon
- false
- true
- true
- true
- /home/uos/Work/github/build-deepin-pc-manager-unknown-Debug/deepin-pc-manager-server/deepin-pc-manager-system-daemon
-
- 3
-
-
-
- ProjectExplorer.Project.TargetCount
- 1
-
-
- ProjectExplorer.Project.Updater.FileVersion
- 22
-
-
- Version
- 22
-
-
diff --git a/README.md b/README.md
index 88a78a2..75a5972 100644
--- a/README.md
+++ b/README.md
@@ -1,9 +1,3 @@
-
-
# Deepin PC Manager
Deepin PC Manager is an application tool designed to help users quickly manage, maintain, and optimize computer systems.
diff --git a/README.zh_CN.md b/README.zh_CN.md
index 5fea1de..8c69b90 100644
--- a/README.zh_CN.md
+++ b/README.zh_CN.md
@@ -1,9 +1,3 @@
-
-
# 电脑管家
电脑管家是一款帮助用户快速管理、维护和优化计算机系统的应用工具。
diff --git a/debian/changelog b/debian/changelog
index 0645066..42cf2eb 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,8 @@
+deepin-pc-manager (5.0.4) unstable; urgency=medium
+
+ * update
+
+ -- unknown Wed, 24 Apr 2024 09:02:46 +0800
deepin-pc-manager (5.0.3) unstable; urgency=medium
* update
diff --git a/debian/control b/debian/control
index ceda194..c3887cf 100644
--- a/debian/control
+++ b/debian/control
@@ -3,22 +3,42 @@ Section: utils
Priority: optional
Maintainer: Packages
Build-Depends: debhelper (>= 11),
- libdtkwidget-dev,
- libdtkgui-dev,
- qtbase5-dev,
- libgsettings-qt-dev,
- qttools5-dev-tools,
- cmake,
- libqt5x11extras5-dev,
- libxext-dev,
- libncurses-dev,
- libdtkcore5-bin,
- libqt5multimedia5,
- libqt5svg5,
- libudev-dev,
- libpolkit-qt5-1-dev,
- qtmultimedia5-dev,
- libparted-dev
+ pkg-config,
+ libx11-dev,
+ cmake,
+ qt5-qmake,
+ qttools5-dev,
+ qtbase5-dev,
+ qtdeclarative5-dev,
+ libqt5svg5-dev,
+ libdtkcore-dev,
+ libdtkwidget-dev,
+ libdtkgui-dev,
+ libdframeworkdbus-dev,
+ libgsettings-qt-dev,
+ qttools5-dev-tools,
+ libdtkcore5-bin,
+ qtbase5-private-dev,
+ libxrandr-dev,
+ libmtdev-dev,
+ libfontconfig1-dev,
+ libegl1-mesa-dev,
+ libxcb-ewmh-dev,
+ libudisks2-qt5-dev,
+ qtmultimedia5-dev,
+ deepin-desktop-base | deepin-desktop-server | deepin-desktop-device,
+ libgtest-dev,
+ libdeepin-pw-check-dev,
+ libpolkit-qt5-1-dev,
+ libdareader-dev,
+ libqt5waylandclient5-dev,
+ qtwayland5-private-dev,
+ libkf5wayland-dev,
+ libwayland-dev,
+ libxkbcommon-dev,
+ libdpkg-dev,
+ libudev-dev,
+ libparted-dev
Standards-Version: 4.1.3
Homepage: https://www.deepin.org
diff --git a/deepin-apprepair-plugin/CMakeLists.txt b/deepin-apprepair-plugin/CMakeLists.txt
new file mode 100644
index 0000000..60f857c
--- /dev/null
+++ b/deepin-apprepair-plugin/CMakeLists.txt
@@ -0,0 +1,45 @@
+cmake_minimum_required(VERSION 3.7)
+
+set(PLUGIN_NAME "deepin-apprepair")
+
+project(${PLUGIN_NAME})
+
+set(CMAKE_AUTOMOC ON)
+
+file(GLOB_RECURSE SRCS
+ "*.h"
+ "*.cpp")
+
+find_package(Qt5 COMPONENTS Core Widgets DBus Svg LinguistTools REQUIRED)
+find_package(PkgConfig REQUIRED)
+find_package(DtkWidget REQUIRED)
+
+pkg_check_modules(DFrameworkDBus REQUIRED dframeworkdbus)
+pkg_check_modules(QGSettings REQUIRED gsettings-qt)
+
+file(GLOB TS_FILES "translations/*.ts")
+qt5_add_translation(QM_FILES ${TS_FILES})
+add_custom_target(translationsapprepair ALL DEPENDS ${QM_FILES})
+install(FILES ${QM_FILES} DESTINATION share/${PLUGIN_NAME}/translations)
+
+add_library(${PLUGIN_NAME} SHARED ${SRCS} icons/apprepair_icons.qrc)
+set_target_properties(${PLUGIN_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ./)
+target_include_directories(${PLUGIN_NAME} PUBLIC
+ ${Qt5Widgets_INCLUDE_DIRS}
+ ${Qt5Svg_INCLUDE_DIRS}
+ ${DtkWidget_INCLUDE_DIRS}
+ ${QGSettings_INCLUDE_DIRS}
+ ${Qt5DBus_INCLUDE_DIRS}
+ ../deepin-pc-manager/include/
+ )
+target_link_libraries(${PLUGIN_NAME} PRIVATE
+ ${Qt5Widgets_LIBRARIES}
+ ${Qt5Svg_LIBRARIES}
+ ${DtkWidget_LIBRARIES}
+ ${DFrameworkDBus_LIBRARIES}
+ ${QGSettings_LIBRARIES}
+ ${Qt5DBus_LIBRARIES}
+ )
+
+install(TARGETS ${PLUGIN_NAME} LIBRARY DESTINATION /usr/lib/deepin-pc-manager/modules)
+install(FILES icons/icons/deepin-app-repair.svg DESTINATION /usr/share/icons/hicolor/scalable/apps)
diff --git a/deepin-apprepair-plugin/apprepair_settings.json b/deepin-apprepair-plugin/apprepair_settings.json
new file mode 100644
index 0000000..dbc6b7b
--- /dev/null
+++ b/deepin-apprepair-plugin/apprepair_settings.json
@@ -0,0 +1,3 @@
+{
+ "api" : "1.0.0"
+}
\ No newline at end of file
diff --git a/deepin-apprepair-plugin/apprepairmodel.cpp b/deepin-apprepair-plugin/apprepairmodel.cpp
new file mode 100644
index 0000000..69b217b
--- /dev/null
+++ b/deepin-apprepair-plugin/apprepairmodel.cpp
@@ -0,0 +1,20 @@
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "apprepairmodel.h"
+
+AppRepairModel::AppRepairModel(QObject *parent)
+ : QObject(parent)
+{
+ initData();
+}
+
+AppRepairModel::~AppRepairModel()
+{
+}
+
+// 初始化数据
+void AppRepairModel::initData()
+{
+}
diff --git a/deepin-apprepair-plugin/apprepairmodel.h b/deepin-apprepair-plugin/apprepairmodel.h
new file mode 100644
index 0000000..6439d25
--- /dev/null
+++ b/deepin-apprepair-plugin/apprepairmodel.h
@@ -0,0 +1,20 @@
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#pragma once
+
+#include
+
+class AppRepairModel : public QObject
+{
+ Q_OBJECT
+public:
+ explicit AppRepairModel(QObject *parent = nullptr);
+ ~AppRepairModel();
+
+private:
+ void initData();
+
+private:
+};
diff --git a/deepin-apprepair-plugin/apprepairmodule.cpp b/deepin-apprepair-plugin/apprepairmodule.cpp
new file mode 100644
index 0000000..1393e6d
--- /dev/null
+++ b/deepin-apprepair-plugin/apprepairmodule.cpp
@@ -0,0 +1,79 @@
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "apprepairmodule.h"
+#include "apprepairmodel.h"
+#include "apprepairwidget.h"
+
+#include
+
+#include
+#include
+
+DWIDGET_USE_NAMESPACE
+DCORE_USE_NAMESPACE
+
+AppRepairModule::AppRepairModule()
+ : QObject()
+ , ToolBoxInterface()
+ , m_appRepairModel(nullptr)
+ , m_appRepairWidget(nullptr)
+{
+ QTranslator *translator = new QTranslator(this);
+ translator->load(QString("/usr/share/deepin-apprepair/translations/deepin-apprepair_%1.qm").arg(QLocale::system().name()));
+ QCoreApplication::installTranslator(translator);
+}
+
+AppRepairModule::~AppRepairModule()
+{
+}
+
+void AppRepairModule::active()
+{
+ if (!m_appRepairModel) {
+ m_appRepairModel = new AppRepairModel;
+ }
+ if (!m_appRepairWidget) {
+ m_appRepairWidget = new AppRepairWidget(m_appRepairModel);
+ }
+
+ m_frameProxy->pushWidget(this, m_appRepairWidget);
+ m_appRepairWidget->setVisible(true);
+}
+
+const QString AppRepairModule::name() const
+{
+ return "DEEPINAPPREPAIR";
+}
+const QString AppRepairModule::apptitle() const
+{
+ return tr("Application Repair");
+}
+const QString AppRepairModule::apptip() const
+{
+ return tr("Apply anomaly quick fix, update continuously");
+}
+const QString AppRepairModule::appsupporter() const
+{
+ return tr("Supported by UOS");
+}
+const QString AppRepairModule::icon() const
+{
+ return "deepin-app-repair";
+}
+
+int AppRepairModule::apptype() const
+{
+ return ToolBoxProxyInterface::Repair;
+}
+
+bool AppRepairModule::enable() const
+{
+ return false;
+}
+
+bool AppRepairModule::checkauth() const
+{
+ return false;
+}
diff --git a/deepin-apprepair-plugin/apprepairmodule.h b/deepin-apprepair-plugin/apprepairmodule.h
new file mode 100644
index 0000000..cbde95a
--- /dev/null
+++ b/deepin-apprepair-plugin/apprepairmodule.h
@@ -0,0 +1,53 @@
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#pragma once
+
+#include
+#include
+
+#include "interface/toolboxinterface.h"
+#include "interface/toolboxproxyinterface.h"
+
+namespace PCC_NAMESPACE {
+class ToolBoxInterface;
+class ToolBoxProxyInterface;
+} // namespace PCC_NAMESPACE
+
+using namespace PCC_NAMESPACE;
+
+class AppRepairWidget;
+class AppRepairModel;
+class AppRepairModule : public QObject
+ , public ToolBoxInterface
+{
+ Q_OBJECT
+
+ Q_PLUGIN_METADATA(IID ToolBoxInterface_iid FILE "apprepair_settings.json")
+ Q_INTERFACES(PCC_NAMESPACE::ToolBoxInterface)
+
+public:
+ explicit AppRepairModule();
+
+ ~AppRepairModule() Q_DECL_OVERRIDE;
+
+ const QString name() const Q_DECL_OVERRIDE;
+ const QString apptitle() const Q_DECL_OVERRIDE;
+ const QString apptip() const Q_DECL_OVERRIDE;
+ const QString appsupporter() const Q_DECL_OVERRIDE;
+ const QString icon() const Q_DECL_OVERRIDE;
+ int apptype() const Q_DECL_OVERRIDE;
+ bool enable() const Q_DECL_OVERRIDE;
+ bool checkauth() const Q_DECL_OVERRIDE;
+
+private:
+ void onStatusChanged();
+
+public Q_SLOTS:
+ void active() Q_DECL_OVERRIDE;
+
+private:
+ AppRepairModel *m_appRepairModel;
+ AppRepairWidget *m_appRepairWidget;
+};
diff --git a/deepin-apprepair-plugin/apprepairwidget.cpp b/deepin-apprepair-plugin/apprepairwidget.cpp
new file mode 100644
index 0000000..e2ad7e7
--- /dev/null
+++ b/deepin-apprepair-plugin/apprepairwidget.cpp
@@ -0,0 +1,44 @@
+// Copyright (C) 2019 ~ 2019 Deepin Technology Co., Ltd.
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "apprepairwidget.h"
+
+#include
+
+#include
+
+AppRepairWidget::AppRepairWidget(AppRepairModel *model, QWidget *parent)
+ : DFrame(parent)
+ , m_model(model)
+{
+ initUI();
+}
+
+AppRepairWidget::~AppRepairWidget()
+{
+}
+
+void AppRepairWidget::initUI()
+{
+ QVBoxLayout *layout = new QVBoxLayout(this);
+ layout->setSpacing(10);
+ layout->setContentsMargins(0, 0, 0, 0);
+ this->setLayout(layout);
+
+ QLabel *title = new QLabel(tr("Application Repair"), this);
+ QFont font1 = title->font();
+ font1.setBold(true);
+ font1.setWeight(QFont::DemiBold);
+ DFontSizeManager::instance()->bind(title, DFontSizeManager::T5);
+ title->setContentsMargins(20, 0, 0, 0);
+
+ QLabel *detailInfo = new QLabel(tr("Apply anomaly quick fix, update continuously"), this);
+ DFontSizeManager::instance()->bind(detailInfo, DFontSizeManager::T8);
+ detailInfo->setContentsMargins(20, 0, 0, 0);
+
+ layout->addWidget(title);
+ layout->addWidget(detailInfo);
+ layout->addStretch();
+}
diff --git a/deepin-pc-manager-server/deepin-pc-manager-session-daemon/window/modules/hoverballs/hoverballsdlg.h b/deepin-apprepair-plugin/apprepairwidget.h
similarity index 52%
rename from deepin-pc-manager-server/deepin-pc-manager-session-daemon/window/modules/hoverballs/hoverballsdlg.h
rename to deepin-apprepair-plugin/apprepairwidget.h
index 2b9a6eb..1efd526 100644
--- a/deepin-pc-manager-server/deepin-pc-manager-session-daemon/window/modules/hoverballs/hoverballsdlg.h
+++ b/deepin-apprepair-plugin/apprepairwidget.h
@@ -2,26 +2,29 @@
// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
//
// SPDX-License-Identifier: GPL-3.0-or-later
-#pragma once
-#include "hoverballsprogress.h"
+#pragma once
-#include
-#include
#include
-#include
+#include
+
+#include
+#include
+#include
DWIDGET_USE_NAMESPACE
-class HoverBallsDlg : public DAbstractDialog
+class AppRepairModel;
+class AppRepairWidget : public DFrame
{
Q_OBJECT
public:
- explicit HoverBallsDlg(QWidget *parent = nullptr);
+ explicit AppRepairWidget(AppRepairModel *model, QWidget *parent = nullptr);
+ ~AppRepairWidget();
private:
// 初始化界面
void initUI();
private:
- HoverBallsProgress *m_waterProgress;
+ AppRepairModel *m_model;
};
diff --git a/deepin-apprepair-plugin/icons/apprepair_icons.qrc b/deepin-apprepair-plugin/icons/apprepair_icons.qrc
new file mode 100644
index 0000000..0b0e5f4
--- /dev/null
+++ b/deepin-apprepair-plugin/icons/apprepair_icons.qrc
@@ -0,0 +1,5 @@
+
+
+ icons/deepin-app-repair.svg
+
+
diff --git a/deepin-apprepair-plugin/icons/icons/deepin-app-repair.svg b/deepin-apprepair-plugin/icons/icons/deepin-app-repair.svg
new file mode 100644
index 0000000..fe0f4f2
--- /dev/null
+++ b/deepin-apprepair-plugin/icons/icons/deepin-app-repair.svg
@@ -0,0 +1,100 @@
+
+
\ No newline at end of file
diff --git a/deepin-pc-manager-server/deepin-pc-manager-session-daemon/translate_generation.sh b/deepin-apprepair-plugin/translate_generation.sh
similarity index 100%
rename from deepin-pc-manager-server/deepin-pc-manager-session-daemon/translate_generation.sh
rename to deepin-apprepair-plugin/translate_generation.sh
diff --git a/deepin-apprepair-plugin/translations/deepin-apprepair_en_US.ts b/deepin-apprepair-plugin/translations/deepin-apprepair_en_US.ts
new file mode 100644
index 0000000..352c449
--- /dev/null
+++ b/deepin-apprepair-plugin/translations/deepin-apprepair_en_US.ts
@@ -0,0 +1,35 @@
+
+
+
+
+ AppRepairModule
+
+
+ Application Repair
+
+
+
+
+ Apply anomaly quick fix, update continuously
+
+
+
+
+ Supported by UOS
+
+
+
+
+ AppRepairWidget
+
+
+ Application Repair
+
+
+
+
+ Apply anomaly quick fix, update continuously
+
+
+
+
diff --git a/deepin-apprepair-plugin/translations/deepin-apprepair_zh_CN.ts b/deepin-apprepair-plugin/translations/deepin-apprepair_zh_CN.ts
new file mode 100644
index 0000000..703d1a0
--- /dev/null
+++ b/deepin-apprepair-plugin/translations/deepin-apprepair_zh_CN.ts
@@ -0,0 +1,35 @@
+
+
+
+
+ AppRepairModule
+
+
+ Application Repair
+ 应用修复
+
+
+
+ Apply anomaly quick fix, update continuously
+ 应用异常快速修复,持续更新中
+
+
+
+ Supported by UOS
+ 由UOS提供服务
+
+
+
+ AppRepairWidget
+
+
+ Application Repair
+ 应用修复
+
+
+
+ Apply anomaly quick fix, update continuously
+ 应用异常快速修复,持续更新中
+
+
+
diff --git a/deepin-autostart-plugin/CMakeLists.txt b/deepin-autostart-plugin/CMakeLists.txt
new file mode 100644
index 0000000..11fa153
--- /dev/null
+++ b/deepin-autostart-plugin/CMakeLists.txt
@@ -0,0 +1,45 @@
+cmake_minimum_required(VERSION 3.7)
+
+set(PLUGIN_NAME "deepin-autostart")
+
+project(${PLUGIN_NAME})
+
+set(CMAKE_AUTOMOC ON)
+
+file(GLOB_RECURSE SRCS
+ "*.h"
+ "*.cpp")
+
+find_package(Qt5 COMPONENTS Core Widgets DBus Svg LinguistTools REQUIRED)
+find_package(PkgConfig REQUIRED)
+find_package(DtkWidget REQUIRED)
+
+pkg_check_modules(DFrameworkDBus REQUIRED dframeworkdbus)
+pkg_check_modules(QGSettings REQUIRED gsettings-qt)
+
+file(GLOB TS_FILES "translations/*.ts")
+qt5_add_translation(QM_FILES ${TS_FILES})
+add_custom_target(translationsautostart ALL DEPENDS ${QM_FILES})
+install(FILES ${QM_FILES} DESTINATION share/${PLUGIN_NAME}/translations)
+
+add_library(${PLUGIN_NAME} SHARED ${SRCS} icons/autostart_icons.qrc)
+set_target_properties(${PLUGIN_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ./)
+target_include_directories(${PLUGIN_NAME} PUBLIC
+ ${Qt5Widgets_INCLUDE_DIRS}
+ ${Qt5Svg_INCLUDE_DIRS}
+ ${DtkWidget_INCLUDE_DIRS}
+ ${QGSettings_INCLUDE_DIRS}
+ ${Qt5DBus_INCLUDE_DIRS}
+ ../deepin-pc-manager/include/
+ )
+target_link_libraries(${PLUGIN_NAME} PRIVATE
+ ${Qt5Widgets_LIBRARIES}
+ ${Qt5Svg_LIBRARIES}
+ ${DtkWidget_LIBRARIES}
+ ${DFrameworkDBus_LIBRARIES}
+ ${QGSettings_LIBRARIES}
+ ${Qt5DBus_LIBRARIES}
+ )
+
+install(TARGETS ${PLUGIN_NAME} LIBRARY DESTINATION /usr/lib/deepin-pc-manager/modules)
+install(FILES icons/icons/deepin-auto-start.svg DESTINATION /usr/share/icons/hicolor/scalable/apps)
diff --git a/deepin-autostart-plugin/autostart_settings.json b/deepin-autostart-plugin/autostart_settings.json
new file mode 100644
index 0000000..dbc6b7b
--- /dev/null
+++ b/deepin-autostart-plugin/autostart_settings.json
@@ -0,0 +1,3 @@
+{
+ "api" : "1.0.0"
+}
\ No newline at end of file
diff --git a/deepin-autostart-plugin/autostartmodel.cpp b/deepin-autostart-plugin/autostartmodel.cpp
new file mode 100644
index 0000000..9aa92aa
--- /dev/null
+++ b/deepin-autostart-plugin/autostartmodel.cpp
@@ -0,0 +1,96 @@
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "autostartmodel.h"
+#include "invokers/dbusinvoker.h"
+#include "invokers/invokerfactory.h"
+#include "dpinyin.h"
+
+AutoStartModel::AutoStartModel(QObject *parent)
+ : QObject(parent)
+ , m_launcherInter(nullptr)
+ , m_startManagerInterface(nullptr)
+{
+ initData();
+ initLauncherData();
+}
+
+AutoStartModel::~AutoStartModel()
+{
+}
+
+// 初始化数据
+void AutoStartModel::initData()
+{
+ registerLauncherItemInfoMetaType();
+
+ // 取应用数据接口
+ m_launcherInter = InvokerFactory::GetInstance().CreateInvoker("com.deepin.dde.daemon.Launcher",
+ "/com/deepin/dde/daemon/Launcher",
+ "com.deepin.dde.daemon.Launcher",
+ ConnectType::SESSION, this);
+
+ m_startManagerInterface = InvokerFactory::GetInstance().CreateInvoker("com.deepin.SessionManager",
+ "/com/deepin/StartManager",
+ "com.deepin.StartManager",
+ ConnectType::SESSION, this);
+
+ // 启动器与应用商店应用程序更新信号接收
+ m_launcherInter->Connect("ItemChanged", this, SLOT(doRefreshPackageTable()));
+}
+
+void AutoStartModel::initLauncherData()
+{
+ m_appInfoEnableList.clear();
+ m_appInfoDisableList.clear();
+
+ QDBusMessage msg = DBUS_BLOCK_INVOKE(m_launcherInter, "GetAllItemInfos");
+ QDBusArgument arg = msg.arguments().first().value();
+ QList datas;
+ arg >> datas;
+
+ for (const auto &it : datas) {
+ QString path = it.Path;
+ if (isAutostart(path)) {
+ m_appInfoEnableList.append(it);
+ } else {
+ m_appInfoDisableList.append(it);
+ }
+ }
+}
+
+// 判断是否是开机自启
+bool AutoStartModel::isAutostart(QString sPath)
+{
+ QDBusMessage msg = DBUS_BLOCK_INVOKE(m_startManagerInterface, "IsAutostart", sPath);
+ GET_MESSAGE_VALUE(bool, flag, msg);
+
+ return flag;
+}
+
+bool AutoStartModel::exeAutostart(int status, QString sPath)
+{
+ // 执行自启动关闭操作
+ if (Action_Flag_Disable == status) {
+ QDBusMessage msg = DBUS_BLOCK_INVOKE(m_startManagerInterface, "RemoveAutostart", sPath);
+ GET_MESSAGE_VALUE(bool, flag, msg);
+ return flag;
+ } else {
+ // 执行自启动开启操作
+ QDBusMessage msg = DBUS_BLOCK_INVOKE(m_startManagerInterface, "AddAutostart", sPath);
+ GET_MESSAGE_VALUE(bool, flag, msg);
+ return flag;
+ }
+}
+
+QString AutoStartModel::getRealName(QString name)
+{
+ return DTK_CORE_NAMESPACE::Chinese2Pinyin(name);
+}
+
+void AutoStartModel::doRefreshPackageTable()
+{
+ initLauncherData();
+ Q_EMIT sendRefreshTable();
+}
diff --git a/deepin-autostart-plugin/autostartmodel.h b/deepin-autostart-plugin/autostartmodel.h
new file mode 100644
index 0000000..634730d
--- /dev/null
+++ b/deepin-autostart-plugin/autostartmodel.h
@@ -0,0 +1,44 @@
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#pragma once
+
+#include "defenderlauncherinfo.h"
+
+#include
+
+#define Action_Flag_Disable 0 // 状态标志 - 不允许
+#define Action_Flag_Enable 1 // 状态标志 - 允许
+class DBusInvokerInterface;
+class AutoStartModel : public QObject
+{
+ Q_OBJECT
+public:
+ explicit AutoStartModel(QObject *parent = nullptr);
+ ~AutoStartModel();
+
+ LauncherItemInfoList getAppInfoEnableList() { return m_appInfoEnableList; }
+ LauncherItemInfoList getAppInfoDisableList() { return m_appInfoDisableList; }
+
+ bool isAutostart(QString sPath);
+ bool exeAutostart(int status, QString sPath);
+ QString getRealName(QString name);
+
+private:
+ void initData();
+ void initLauncherData();
+
+public Q_SLOTS:
+ void doRefreshPackageTable();
+
+Q_SIGNALS:
+ void sendRefreshTable();
+
+private:
+ DBusInvokerInterface *m_launcherInter; // 取应用数据接口
+ DBusInvokerInterface *m_startManagerInterface; // 自启动接口
+
+ LauncherItemInfoList m_appInfoEnableList;
+ LauncherItemInfoList m_appInfoDisableList;
+};
diff --git a/deepin-autostart-plugin/autostartmodule.cpp b/deepin-autostart-plugin/autostartmodule.cpp
new file mode 100644
index 0000000..e9d2662
--- /dev/null
+++ b/deepin-autostart-plugin/autostartmodule.cpp
@@ -0,0 +1,79 @@
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "autostartmodule.h"
+#include "autostartmodel.h"
+#include "autostartwidget.h"
+
+#include
+
+#include
+#include
+
+DWIDGET_USE_NAMESPACE
+DCORE_USE_NAMESPACE
+
+AutoStartModule::AutoStartModule()
+ : QObject()
+ , ToolBoxInterface()
+ , m_autoStartModel(nullptr)
+ , m_autoStartWidget(nullptr)
+{
+ QTranslator *translator = new QTranslator(this);
+ translator->load(QString("/usr/share/deepin-autostart/translations/deepin-autostart_%1.qm").arg(QLocale::system().name()));
+ QCoreApplication::installTranslator(translator);
+}
+
+AutoStartModule::~AutoStartModule()
+{
+}
+
+void AutoStartModule::active()
+{
+ if (!m_autoStartModel) {
+ m_autoStartModel = new AutoStartModel;
+ }
+ if (!m_autoStartWidget) {
+ m_autoStartWidget = new AutoStartWidget(m_autoStartModel);
+ }
+
+ m_frameProxy->pushWidget(this, m_autoStartWidget);
+ m_autoStartWidget->setVisible(true);
+}
+
+const QString AutoStartModule::name() const
+{
+ return "DEEPINAUTOSTART";
+}
+const QString AutoStartModule::apptitle() const
+{
+ return tr("Startup Programs");
+}
+const QString AutoStartModule::apptip() const
+{
+ return tr("Manage auto startup programs");
+}
+const QString AutoStartModule::appsupporter() const
+{
+ return tr("Supported by UOS");
+}
+const QString AutoStartModule::icon() const
+{
+ return "deepin-auto-start";
+}
+
+int AutoStartModule::apptype() const
+{
+ return ToolBoxProxyInterface::Apps;
+}
+
+bool AutoStartModule::enable() const
+{
+ return true;
+}
+
+bool AutoStartModule::checkauth() const
+{
+ return false;
+}
diff --git a/deepin-autostart-plugin/autostartmodule.h b/deepin-autostart-plugin/autostartmodule.h
new file mode 100644
index 0000000..ffe311a
--- /dev/null
+++ b/deepin-autostart-plugin/autostartmodule.h
@@ -0,0 +1,53 @@
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#pragma once
+
+#include
+#include
+
+#include "interface/toolboxinterface.h"
+#include "interface/toolboxproxyinterface.h"
+
+namespace PCC_NAMESPACE {
+class ToolBoxInterface;
+class ToolBoxProxyInterface;
+} // namespace PCC_NAMESPACE
+
+using namespace PCC_NAMESPACE;
+
+class AutoStartWidget;
+class AutoStartModel;
+class AutoStartModule : public QObject
+ , public ToolBoxInterface
+{
+ Q_OBJECT
+
+ Q_PLUGIN_METADATA(IID ToolBoxInterface_iid FILE "autostart_settings.json")
+ Q_INTERFACES(PCC_NAMESPACE::ToolBoxInterface)
+
+public:
+ explicit AutoStartModule();
+
+ ~AutoStartModule() Q_DECL_OVERRIDE;
+
+ const QString name() const Q_DECL_OVERRIDE;
+ const QString apptitle() const Q_DECL_OVERRIDE;
+ const QString apptip() const Q_DECL_OVERRIDE;
+ const QString appsupporter() const Q_DECL_OVERRIDE;
+ const QString icon() const Q_DECL_OVERRIDE;
+ int apptype() const Q_DECL_OVERRIDE;
+ bool enable() const Q_DECL_OVERRIDE;
+ bool checkauth() const Q_DECL_OVERRIDE;
+
+private:
+ void onStatusChanged();
+
+public Q_SLOTS:
+ void active() Q_DECL_OVERRIDE;
+
+private:
+ AutoStartModel *m_autoStartModel;
+ AutoStartWidget *m_autoStartWidget;
+};
diff --git a/deepin-pc-manager-server/deepin-pc-manager-session-daemon/window/modules/securitytooldialog/startupdialog/startupwidget.cpp b/deepin-autostart-plugin/autostartwidget.cpp
similarity index 56%
rename from deepin-pc-manager-server/deepin-pc-manager-session-daemon/window/modules/securitytooldialog/startupdialog/startupwidget.cpp
rename to deepin-autostart-plugin/autostartwidget.cpp
index fef033e..16ab6f9 100644
--- a/deepin-pc-manager-server/deepin-pc-manager-session-daemon/window/modules/securitytooldialog/startupdialog/startupwidget.cpp
+++ b/deepin-autostart-plugin/autostartwidget.cpp
@@ -3,78 +3,83 @@
//
// SPDX-License-Identifier: GPL-3.0-or-later
-#include "startupwidget.h"
+#include "autostartwidget.h"
+#include "qpaintdevice.h"
-#include "../../deepin-pc-manager/src/window/modules/common/common.h"
-#include "autostartmodel.h"
-
-#include
-
-#include
-#include
-#include
+#include
#include
+#include
#include
-#include
-#include
+#include
+#include
-#include
-#include
-#include
-#include
-#include
+#include
#include
+#include
+#include
#include
-#include
#include
+#include
+#include
+#include
+#include
+#include
+#include
#include
#include
-#include
#include
#include
-#include
-#include
-#include
-#include
-#include
-#include
+#include
+#include
+#include
+#include
#define ALL_INTEVAL 0
#define LEFT_INTEVAL 10
-#define PIX_INTEVAL 4 // 表格里图片距离表格边线 间隔
-#define ACTION_FLAG_DISABLE 0 // 状态标志 - 不允许
-#define ACTION_FLAG_ENABLE 1 // 状态标志 - 允许
+#define PIX_INTEVAL 8 // 表格里图片距离表格边线 间隔
+#define ACTION_FLAG_DISABLE 0 // 状态标志 - 不允许
+#define ACTION_FLAG_ENABLE 1 // 状态标志 - 允许
#define TABLE_HEADER_SORT_HIDE 2 // 第3列掩藏
-#define NAME_COL_NAME 697 // 第1列列宽
-#define NAME_COL_ACTION 214 // 第2列列宽
+#define NAME_COL_NAME 500 // 第1列列宽
+#define NAME_COL_ACTION 217 // 第2列列宽
-#define Startup_Disable \
- ":/icons/deepin/builtin/icons/dcc_startup_disable_29px.svg" // 状态资源图片 - 不允许
-#define Startup_Enable \
- ":/icons/deepin/builtin/icons/dcc_startup_enable_29px.svg" // 状态资源图片 - 允许
+#define Startup_Disable ":/icons/deepin/builtin/icons/dcc_startup_disable_29px.svg" // 状态资源图片 - 不允许
+#define Startup_Enable ":/icons/deepin/builtin/icons/dcc_startup_enable_29px.svg" // 状态资源图片 - 允许
-QString GetAppsSourceType(QString sPath)
+bool judgeIsSysAppByExecPath(const QString &execPath)
{
- QFile fileInfo(sPath);
- QString source;
- if (QFileInfo(sPath).isSymLink()) {
- source = "Third-party";
- } else if (fileInfo.open(QIODevice::ReadOnly | QIODevice::Text)) {
- QTextStream in(&fileInfo);
- in.setCodec("UTF-8");
- QString sAllInfo = in.readAll();
- int nIndex = sAllInfo.indexOf("Exec");
- QString sOptInfo = sAllInfo.mid(nIndex, 10);
- if (sOptInfo.contains("opt"))
- source = "Third-party";
- else
- source = "System";
+ // 判断是否是系统应用
+ bool isbSysApp = true;
+ if (execPath.contains("/opt/")) {
+ isbSysApp = false;
+ }
+ // android 也判定为第三方应用,非系统应用
+ if (execPath.contains("android")) {
+ isbSysApp = false;
}
+
+ return isbSysApp;
+}
+bool judgeIsSysAppFromDesktop(const QString &desktopPath)
+{
+ // 获取执行路径
+ QSettings readIniSettingMethod(desktopPath, QSettings::Format::IniFormat);
+ readIniSettingMethod.beginGroup("Desktop Entry");
+ QString execPath = readIniSettingMethod.value("Exec").toString();
+ readIniSettingMethod.endGroup();
+
+ // 判断是否是系统应用
+ return judgeIsSysAppByExecPath(execPath);
+}
+
+QString GetAppsSourceType(QString sPath)
+{
+ QString source = judgeIsSysAppFromDesktop(sPath) ? "System" : "Third-party";
return source;
}
-StartupWidget::StartupWidget(AutoStartModel *model, QWidget *parent)
- : QWidget(parent)
+AutoStartWidget::AutoStartWidget(AutoStartModel *model, QWidget *parent)
+ : DFrame(parent)
, m_model(model)
, m_detailInfo(nullptr)
, m_table_view(nullptr)
@@ -84,14 +89,13 @@ StartupWidget::StartupWidget(AutoStartModel *model, QWidget *parent)
, m_rowCount(0)
, m_nSaveSortColumn(1)
{
- this->setAccessibleName("rightWidget_startupWidget");
initUI();
+ setLineWidth(0);
- // 后台自启动数据刷新信号连接
- connect(m_model, &AutoStartModel::itemStatusChanged, this, &StartupWidget::refreshData);
+ connect(m_model, &AutoStartModel::sendRefreshTable, this, &AutoStartWidget::refreshData);
}
-StartupWidget::~StartupWidget()
+AutoStartWidget::~AutoStartWidget()
{
Q_EMIT requstCloseInfo();
@@ -100,7 +104,7 @@ StartupWidget::~StartupWidget()
m_item_model = nullptr;
}
-void StartupWidget::initUI()
+void AutoStartWidget::initUI()
{
setBackgroundRole(QPalette::Window);
QVBoxLayout *layout = new QVBoxLayout;
@@ -108,29 +112,29 @@ void StartupWidget::initUI()
layout->setContentsMargins(ALL_INTEVAL, ALL_INTEVAL, ALL_INTEVAL, ALL_INTEVAL);
QLabel *title = new QLabel(tr("Startup Programs"), this);
- title->setAccessibleName("startupWidget_titleLable");
QFont font1 = title->font();
font1.setBold(true);
- font1.setPixelSize(16);
- title->setFont(font1);
+ font1.setWeight(QFont::DemiBold);
+ DFontSizeManager::instance()->bind(title, DFontSizeManager::T5);
+ title->setContentsMargins(20, 0, 0, 0);
m_detailInfo = new QLabel(this);
- m_detailInfo->setAccessibleName("startupWidget_detalInfoLable");
- m_detailInfo->setFont(Utils::getFixFontSize(12));
+ DFontSizeManager::instance()->bind(m_detailInfo, DFontSizeManager::T8);
+ m_detailInfo->setContentsMargins(20, 0, 0, 0);
layout->addWidget(title);
layout->addWidget(m_detailInfo);
// table_view 属性
m_table_view = new DTableView(this);
- m_table_view->setFont(Utils::getFixFontSize(14));
- m_table_view->setAccessibleName("tableFrame_tableView");
m_table_view->setSelectionBehavior(QAbstractItemView::SelectRows);
m_table_view->setSelectionMode(QAbstractItemView::NoSelection);
m_table_view->setEditTriggers(QAbstractItemView::NoEditTriggers);
+ m_table_view->horizontalHeader()->setStretchLastSection(true);
m_table_view->verticalHeader()->setHidden(true);
m_table_view->setSortingEnabled(true);
m_table_view->verticalHeader()->setDefaultSectionSize(48);
+ m_table_view->horizontalHeader()->setVisible(true);
m_table_view->setShowGrid(false);
m_table_view->setFrameShape(QTableView::NoFrame);
@@ -162,7 +166,6 @@ void StartupWidget::initUI()
// 表格
m_tableWidget = new DefenderTable(this);
- m_tableWidget->setAccessibleName("startupWidget_tableFrame");
m_tableWidget->setHeadViewSortHide(TABLE_HEADER_SORT_HIDE);
m_tableWidget->setTableAndModel(m_table_view, m_item_model);
layout->addWidget(m_tableWidget);
@@ -172,73 +175,44 @@ void StartupWidget::initUI()
getAppsData();
m_table_view->horizontalHeader()->setHighlightSections(false);
m_table_view->horizontalHeader()->setSortIndicator(1, Qt::DescendingOrder);
- m_table_view->horizontalHeader()->setStretchLastSection(true);
- m_table_view->horizontalHeader()->setVisible(true);
}
// 取系统所有应用
-void StartupWidget::getAppsData()
+void AutoStartWidget::getAppsData()
{
- m_mapEnable.clear();
- m_mapDisable.clear();
-
- // 取所有应用数据信息
- bool succeed = m_model->updateAppsAutoStartStatus();
- if (succeed) {
- QString sEnableInfo = m_model->getAllAutoStartAppsInfoStr();
- QString sDisableInfo = m_model->getAllNonautoStartAppsInfoStr();
-
- auto formatData = [&](QString info, QMap &map) {
- QStringList sList = info.split("|");
- for (int i = 0; i < sList.count(); ++i) {
- QStringList sDetailInfoList = sList.at(i).split(",");
- if (sDetailInfoList.count() >= 5) {
- QList sListDetail;
- sListDetail.append(sDetailInfoList.at(0));
- sListDetail.append(sDetailInfoList.at(1));
- sListDetail.append(sDetailInfoList.at(2));
- sListDetail.append(sDetailInfoList.at(3));
- map[sDetailInfoList.at(4)] = sListDetail;
- }
- }
- };
-
- formatData(sEnableInfo, m_mapEnable);
- formatData(sDisableInfo, m_mapDisable);
+ // 清空列表内容
+ for (int i = m_item_model->rowCount() - 1; i >= 0; --i) {
+ m_item_model->removeRow(i);
+ }
- m_appNamefromId.clear();
- // 先按状态降序 再按名称升序
- m_rowCount = 0;
- if (m_mapEnable.count() > 0)
- loadMap(m_mapEnable);
+ m_appInfoEnableList = m_model->getAppInfoEnableList();
+ m_appInfoDisableList = m_model->getAppInfoDisableList();
+ m_nEnableCount = m_appInfoEnableList.count();
+ m_nDisableCount = m_appInfoDisableList.count();
+ m_rowCount = 0;
+ if (m_appInfoEnableList.count() > 0)
+ loadMap(m_appInfoEnableList);
- if (m_mapDisable.count() > 0)
- loadMap(m_mapDisable);
+ if (m_appInfoDisableList.count() > 0)
+ loadMap(m_appInfoDisableList);
- // 设置统计行数据
- showTotalInfo();
- }
+ // 设置统计行数据
+ showTotalInfo();
}
// QMap容器 数据加载
-void StartupWidget::loadMap(QMap map)
+void AutoStartWidget::loadMap(LauncherItemInfoList list)
{
- // 加载应用
- QMapIterator i(map);
- while (i.hasNext()) {
- i.next();
- QStringList list = i.value();
- if (list.count() < 4)
- break;
-
- QString sName = i.key();
- QString sPath = list.at(0);
- QString sIcon = list.at(1);
- QString sId = list.at(2);
- QString sRealName = list.at(3);
+ for (const auto &it : list) {
+ QString name = it.Name;
+ QString path = it.Path;
+ QString icon = it.Icon;
+ QString id = it.ID;
+
+ //QString sRealName = m_model->getRealName(name);
// 加载应用
- loadAppData(m_rowCount, sPath, sName, sIcon, sId, sRealName);
+ loadAppData(m_rowCount, path, name, icon, id, name);
m_rowCount++;
}
@@ -250,31 +224,25 @@ void StartupWidget::loadMap(QMap map)
m_table_view->setColumnHidden(6, true);
// 设置前三列的宽度
- m_table_view->setColumnWidth(0, NAME_COL_NAME);
- m_table_view->setColumnWidth(2, NAME_COL_ACTION);
+ m_table_view->setColumnWidth(0, 700);
+ m_table_view->setColumnWidth(2, 217);
}
// 加载每个应用的详细信息
-void StartupWidget::loadAppData(
- int nRow, QString sPath, QString sName, QString sIcon, QString sId, QString sRealName)
+void AutoStartWidget::loadAppData(int nRow, QString sPath, QString sName, QString sIcon, QString sId, QString sRealName)
{
// 判断该应用状态(是否是自启动)
- bool bStatus = m_model->isAppAutoStart(sPath);
+ bool bStatus = m_model->isAutostart(sPath);
// 设置每一行数据
m_item_model->setItem(nRow, 0, new QStandardItem(QString("%1").arg(sName)));
- m_item_model->setItem(
- nRow,
- 1,
- new QStandardItem(QString("%1").arg(bStatus ? ACTION_FLAG_ENABLE : ACTION_FLAG_DISABLE)));
+ m_item_model->setItem(nRow, 1, new QStandardItem(QString("%1").arg(bStatus ? ACTION_FLAG_ENABLE : ACTION_FLAG_DISABLE)));
m_item_model->setItem(nRow, 2, new QStandardItem("statusButton"));
m_item_model->setItem(nRow, 3, new QStandardItem(QString("%1").arg(sId)));
m_item_model->setItem(nRow, 4, new QStandardItem(QString("%1").arg(sIcon)));
m_item_model->setItem(nRow, 5, new QStandardItem(QString("%1").arg(sPath)));
m_item_model->setItem(nRow, 6, new QStandardItem(QString("%1").arg(sRealName)));
- m_appNamefromId[sId] = sRealName;
-
// 字体样式
QPalette pal;
if (bStatus)
@@ -288,7 +256,7 @@ void StartupWidget::loadAppData(
button->setProperty("status", bStatus ? ACTION_FLAG_DISABLE : ACTION_FLAG_ENABLE);
button->setProperty("path", sPath);
button->setProperty("id", sId);
- connect(button, &QPushButton::clicked, this, &StartupWidget::onTableBtnClicked);
+ connect(button, &QPushButton::clicked, this, &AutoStartWidget::onTableBtnClicked);
DFrame *buttonFrame = new DFrame(this);
QVBoxLayout *buttonLayout = new QVBoxLayout;
@@ -300,7 +268,7 @@ void StartupWidget::loadAppData(
}
// 表格按钮点击槽
-void StartupWidget::onTableBtnClicked()
+void AutoStartWidget::onTableBtnClicked()
{
QPushButton *button = qobject_cast(sender());
int nStatus = button->property("status").toInt();
@@ -308,32 +276,32 @@ void StartupWidget::onTableBtnClicked()
QString sID = button->property("id").toString();
// 执行自启动开启/关闭操作
- bool isExeAutoStart = m_model->setAppAutoStart(nStatus, sPath);
+ bool isExeAutoStart = m_model->exeAutostart(nStatus, sPath);
if (isExeAutoStart) {
- if (ACTION_FLAG_DISABLE == nStatus)
+ if (ACTION_FLAG_DISABLE == nStatus) {
changeItemStatus(false, sID);
- else
+ m_nEnableCount -= 1;
+ m_nDisableCount += 1;
+ } else {
changeItemStatus(true, sID);
+ m_nEnableCount += 1;
+ m_nDisableCount -= 1;
+ }
- // 添加安全日志
- QString log = nStatus ? tr("Enabled auto startup for %1").arg(m_appNamefromId[sID])
- : tr("Disabled auto startup for %1").arg(m_appNamefromId[sID]);
- m_model->addSecurityLog(SECURITY_LOG_TYPE_TOOL, log);
showTotalInfo();
}
}
// 按钮点击后改变相应行的显示数据和状态
-void StartupWidget::changeItemStatus(bool isStartup, QString sFlagData)
+void AutoStartWidget::changeItemStatus(bool isStartup, QString sFlagData)
{
QModelIndex index = m_table_view->currentIndex();
int rows = m_item_model->rowCount();
int column = m_item_model->columnCount();
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < column; ++j) {
- QString sData =
- m_item_model->data(m_item_model->index(i, j), Qt::DisplayRole).toString();
+ QString sData = m_item_model->data(m_item_model->index(i, j), Qt::DisplayRole).toString();
if (j == 3 && sData == sFlagData) {
QWidget *widget = m_table_view->indexWidget(m_item_model->index(i, 2));
QPushButton *button = widget->findChild(sFlagData);
@@ -352,64 +320,43 @@ void StartupWidget::changeItemStatus(bool isStartup, QString sFlagData)
}
// 设置前三列的宽度
- m_table_view->setColumnWidth(0, NAME_COL_NAME);
+ m_table_view->setColumnWidth(0, 700);
m_table_view->setColumnWidth(2, NAME_COL_ACTION);
m_table_view->selectRow(index.row());
}
// 外部调用刷新表格数据
-void StartupWidget::refreshData(bool bAdd, QString sID)
+void AutoStartWidget::refreshData()
{
- changeItemStatus(bAdd, sID);
- showTotalInfo();
+ getAppsData();
}
// 设置统计行信息
-void StartupWidget::showTotalInfo()
+void AutoStartWidget::showTotalInfo()
{
- int nAllCount = 0;
- int nEnableCount = 0;
- int nDisableCount = 0;
-
- bool isStarted = m_model->updateAppsAutoStartStatus();
- if (isStarted) {
- QString sEnableInfo = m_model->getAllAutoStartAppsInfoStr();
- QString sDisableInfo = m_model->getAllNonautoStartAppsInfoStr();
-
- if (!sEnableInfo.isEmpty())
- nEnableCount = sEnableInfo.split("|").count();
-
- if (!sDisableInfo.isEmpty())
- nDisableCount = sDisableInfo.split("|").count();
- }
- nAllCount = nEnableCount + nDisableCount;
+ int nAllCount = m_nEnableCount + m_nDisableCount;
// 设置统计行数据
- m_detailInfo->setText(tr("Startup apps") + QString(": %1 ").arg(nEnableCount)
- + tr("All apps") + QString(": %1").arg(nAllCount));
+ m_detailInfo->setText(tr("Startup apps") + QString(": %1 ").arg(m_nEnableCount) + tr("All apps") + QString(": %1").arg(nAllCount));
}
// 代理函数
-MyItemDelegate::MyItemDelegate(StartupWidget *widget, QObject *parent)
+MyItemDelegate::MyItemDelegate(AutoStartWidget *widget, QObject *parent)
: QItemDelegate(parent)
{
m_widget = widget;
}
// 重绘操作
-void MyItemDelegate::paint(QPainter *painter,
- const QStyleOptionViewItem &option,
- const QModelIndex &index) const
+void MyItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
// 第一列
if (index.column() == 0) {
// 图标路径
- QString sIconPath =
- index.model()->data(index.model()->index(index.row(), 4), Qt::DisplayRole).toString();
+ QString sIconPath = index.model()->data(index.model()->index(index.row(), 4), Qt::DisplayRole).toString();
// 读取该应用执行信息
- QString sPath =
- index.model()->data(index.model()->index(index.row(), 5), Qt::DisplayRole).toString();
+ QString sPath = index.model()->data(index.model()->index(index.row(), 5), Qt::DisplayRole).toString();
// 设置图片
QRect rect = option.rect;
@@ -418,19 +365,11 @@ void MyItemDelegate::paint(QPainter *painter,
int height = rect.height() - PIX_INTEVAL * 2;
QFont font2;
- font2.setFamily("SourceHanSansSC-Normal"); // 字体
- font2.setPixelSize(12); // 文字像素大小
+ font2.setFamily("SourceHanSansSC-Normal"); //字体
+ font2.setPixelSize(12); //文字像素大小
QPen pen2;
pen2.setColor(QColor("#52607f"));
- QString sStr = GetAppsSourceType(sPath).toStdString().c_str();
- QString sAppsSources;
- if (sStr == "Third-party") {
- sAppsSources = tr("Third-party");
- } else {
- sAppsSources = tr("System");
- }
-
QFile file(sIconPath);
if (file.open(QIODevice::ReadOnly) && sIconPath.contains("/")) {
file.close();
@@ -451,20 +390,14 @@ void MyItemDelegate::paint(QPainter *painter,
int textWidth = rect.width() - height - PIX_INTEVAL * 8;
int x = pix_x + height + PIX_INTEVAL * 2;
int y = pix_y + rect.height() / 4 + height / 8;
- int y1 = pix_y + rect.height() / 2 + height / 4 + PIX_INTEVAL;
- QString sName =
- index.model()->data(index.model()->index(index.row(), 6), Qt::DisplayRole).toString();
- QString sElidedName = painter->fontMetrics().elidedText(sName,
- Qt::ElideRight,
- textWidth,
- Qt::TextShowMnemonic);
+ int y1 = pix_y + rect.height() / 2 + height / 4;
+ QString sName = index.model()->data(index.model()->index(index.row(), 6), Qt::DisplayRole).toString();
+ QString sElidedName = painter->fontMetrics().elidedText(sName, Qt::ElideRight, textWidth, Qt::TextShowMnemonic);
painter->drawText(x + LEFT_INTEVAL, y, sElidedName);
// 绘画应用来源
- QString sElidedSource = painter->fontMetrics().elidedText(sAppsSources,
- Qt::ElideRight,
- textWidth,
- Qt::TextShowMnemonic);
+ QString sAppsSources = judgeIsSysAppFromDesktop(sPath) ? tr("System") : tr("Third-party");
+ QString sElidedSource = painter->fontMetrics().elidedText(sAppsSources, Qt::ElideRight, textWidth, Qt::TextShowMnemonic);
painter->setFont(font2);
painter->setPen(pen2);
painter->drawText(x + LEFT_INTEVAL, y1, sElidedSource);
@@ -474,7 +407,9 @@ void MyItemDelegate::paint(QPainter *painter,
else if (index.column() == 1) {
// 设置图片
int nStatus = index.model()->data(index, Qt::DisplayRole).toInt();
- QPixmap pixmap = (nStatus == 0) ? QPixmap(Startup_Disable) : QPixmap(Startup_Enable);
+ QPixmap pixmap = (nStatus == 0)
+ ? QPixmap(Startup_Disable)
+ : QPixmap(Startup_Enable);
pixmap = m_widget->getPixmap(pixmap);
const QPixmap &star = pixmap;
@@ -492,7 +427,7 @@ void MyItemDelegate::paint(QPainter *painter,
}
}
-QPixmap StartupWidget::getPixmap(QPixmap pixmap)
+QPixmap AutoStartWidget::getPixmap(QPixmap pixmap)
{
const qreal ratio = devicePixelRatioF();
pixmap.scaled(pixmap.size() * ratio, Qt::KeepAspectRatio, Qt::SmoothTransformation);
@@ -500,7 +435,9 @@ QPixmap StartupWidget::getPixmap(QPixmap pixmap)
return pixmap;
}
-StartupModel::StartupModel() { }
+StartupModel::StartupModel()
+{
+}
QVariant StartupModel::data(const QModelIndex &index, int role) const
{
@@ -511,7 +448,7 @@ QVariant StartupModel::data(const QModelIndex &index, int role) const
return int(Qt::AlignLeft | Qt::AlignVCenter);
} else if (role == Qt::DisplayRole) {
return QStandardItemModel::data(index, role);
- } else if (role == Qt::BackgroundRole) {
+ } else if (role == Qt::BackgroundColorRole) {
if (index.row() % 2 == 0) {
return QColor(0, 0, 0, 8);
} else if (index.row() % 5 == 1)
@@ -522,21 +459,3 @@ QVariant StartupModel::data(const QModelIndex &index, int role) const
return QVariant();
}
-
-StartupMainWindow::StartupMainWindow(QWidget *pParent)
- : DefSecurityToolsMnd(pParent)
- , m_pStartupWidget(nullptr)
-{
- AutoStartModel *pAutoStartModel = new AutoStartModel(this);
- m_pStartupWidget = new StartupWidget(pAutoStartModel);
- addContent(m_pStartupWidget);
- setFixedSize(960, 640);
-}
-
-StartupMainWindow::~StartupMainWindow() { }
-
-void StartupMainWindow::closeEvent(QCloseEvent *event)
-{
- Q_EMIT sendWindowClose();
- event->accept();
-}
diff --git a/deepin-pc-manager-server/deepin-pc-manager-session-daemon/window/modules/securitytooldialog/startupdialog/startupwidget.h b/deepin-autostart-plugin/autostartwidget.h
similarity index 68%
rename from deepin-pc-manager-server/deepin-pc-manager-session-daemon/window/modules/securitytooldialog/startupdialog/startupwidget.h
rename to deepin-autostart-plugin/autostartwidget.h
index 88fe137..be1cccd 100644
--- a/deepin-pc-manager-server/deepin-pc-manager-session-daemon/window/modules/securitytooldialog/startupdialog/startupwidget.h
+++ b/deepin-autostart-plugin/autostartwidget.h
@@ -4,24 +4,27 @@
// SPDX-License-Identifier: GPL-3.0-or-later
#pragma once
-#include "widgets/defendertable.h"
-#include "../defsecuritytoolsmnd.h"
+
+#include "defendertable.h"
+#include "autostartmodel.h"
+
+#include
+#include
#include
+#include
-class DBusInvokerInterface;
class AutoStartModel;
-
DWIDGET_USE_NAMESPACE
using namespace def::widgets;
/************************* StartupWidget实现类 表格代理 ***********************/
-class StartupWidget;
+class AutoStartWidget;
class MyItemDelegate : public QItemDelegate
{
Q_OBJECT
public:
- MyItemDelegate(StartupWidget *widget, QObject *parent = nullptr);
+ MyItemDelegate(AutoStartWidget *widget, QObject *parent = nullptr);
virtual ~MyItemDelegate() {}
void paint(QPainter *painter,
@@ -30,7 +33,7 @@ class MyItemDelegate : public QItemDelegate
private:
QPixmap m_pixmap;
- StartupWidget *m_widget;
+ AutoStartWidget *m_widget;
};
/************************* StartupWidget实现类 表格颜色重载 ***********************/
@@ -44,12 +47,12 @@ class StartupModel : public QStandardItemModel
/**************************** StartupWidget实现类 ********************************/
class QLabel;
-class StartupWidget : public QWidget
+class AutoStartWidget : public DFrame
{
Q_OBJECT
public:
- explicit StartupWidget(AutoStartModel *model, QWidget *parent = nullptr);
- ~StartupWidget();
+ explicit AutoStartWidget(AutoStartModel *model, QWidget *parent = nullptr);
+ ~AutoStartWidget();
QPixmap getPixmap(QPixmap);
Q_SIGNALS:
@@ -62,14 +65,14 @@ public Q_SLOTS:
void getAppsData();
// 外部调用刷新表格数据
- void refreshData(bool bAdd, QString sID);
+ void refreshData();
private:
// 初始化界面
void initUI();
// 加再数据到Map容器 进行数据处理
- void loadMap(QMap);
+ void loadMap(LauncherItemInfoList list);
// 将处理后的数据加载到QTableView表格
void loadAppData(int nRow, QString sPath, QString sName, QString sIcon, QString sId, QString sRealName);
@@ -88,27 +91,11 @@ public Q_SLOTS:
DefenderTable *m_tableWidget;
int m_rowCount; // 表格加载数据总行数
- QMap m_mapEnable; // 不允许自启动数据容器
- QMap m_mapDisable; // 允许自启动数据容器
- QMap m_appNamefromId;
+ LauncherItemInfoList m_appInfoEnableList;
+ LauncherItemInfoList m_appInfoDisableList;
+ int m_nEnableCount;
+ int m_nDisableCount;
int m_nSaveSortColumn;
Qt::SortOrder m_nSaveSortOrder = Qt::DescendingOrder;
};
-
-class StartupMainWindow : public DefSecurityToolsMnd
-{
- Q_OBJECT
-public:
- explicit StartupMainWindow(QWidget *pParent = nullptr);
- ~StartupMainWindow() override;
-
-protected:
- void closeEvent(QCloseEvent *event) override;
-
-Q_SIGNALS:
- void sendWindowClose();
-
-private:
- StartupWidget *m_pStartupWidget;
-};
diff --git a/deepin-pc-manager-server/deepin-pc-manager-session-daemon/window/modules/common/defenderlauncherinfo.cpp b/deepin-autostart-plugin/defenderlauncherinfo.cpp
similarity index 100%
rename from deepin-pc-manager-server/deepin-pc-manager-session-daemon/window/modules/common/defenderlauncherinfo.cpp
rename to deepin-autostart-plugin/defenderlauncherinfo.cpp
diff --git a/deepin-pc-manager-server/deepin-pc-manager-session-daemon/window/modules/common/defenderlauncherinfo.h b/deepin-autostart-plugin/defenderlauncherinfo.h
similarity index 100%
rename from deepin-pc-manager-server/deepin-pc-manager-session-daemon/window/modules/common/defenderlauncherinfo.h
rename to deepin-autostart-plugin/defenderlauncherinfo.h
diff --git a/deepin-pc-manager/src/widgets/defendertable.cpp b/deepin-autostart-plugin/defendertable.cpp
similarity index 95%
rename from deepin-pc-manager/src/widgets/defendertable.cpp
rename to deepin-autostart-plugin/defendertable.cpp
index 3a8934e..f1cbde5 100755
--- a/deepin-pc-manager/src/widgets/defendertable.cpp
+++ b/deepin-autostart-plugin/defendertable.cpp
@@ -4,17 +4,15 @@
// SPDX-License-Identifier: GPL-3.0-or-later
#include "defendertable.h"
-
#include "defendertableheaderview.h"
-#include
#include
#include
+#include
#include
DWIDGET_USE_NAMESPACE
-
namespace def {
namespace widgets {
@@ -38,7 +36,9 @@ DefenderTable::DefenderTable(QWidget *parent, int height)
initUI();
}
-DefenderTable::~DefenderTable() { }
+DefenderTable::~DefenderTable()
+{
+}
void DefenderTable::initUI()
{
@@ -47,7 +47,7 @@ void DefenderTable::initUI()
mainLayout->setContentsMargins(2, 2, 2, 2);
setLayout(mainLayout);
- // 创建主题风格背景
+ //创建主题风格背景
m_mainBackgroundWidgt = new DFrame(this);
m_mainBackgroundWidgt->setAccessibleName(accessibleName() + "_bgWidget");
m_mainBackgroundWidgt->lower();
@@ -232,11 +232,11 @@ void DefenderTable::setTableAndModel(DTableView *table, QStandardItemModel *mode
});
}
-// 废弃于2020.4.30
+//废弃于2020.4.30
void DefenderTable::setRowHeight(int height)
{
m_rowHeight = height;
- // 设置每一行的高度
+ //设置每一行的高度
for (int i = 0; i < m_rowCount; i++)
m_table->setRowHeight(i, m_rowHeight);
}
@@ -252,10 +252,9 @@ void DefenderTable::resizeEvent(QResizeEvent *event)
for (int i = 0; i < m_rowCount; i++) {
int rowHeight = m_table->rowHeight(i);
m_table->setRowHeight(i, rowHeight);
- m_backgroundLst[i]->setFixedWidth(m_table->width()
- + m_table->horizontalScrollBar()->maximum() - 1);
+ m_backgroundLst[i]->setFixedWidth(m_table->width() + m_table->horizontalScrollBar()->maximum() - 20);
m_backgroundLst[i]->setFixedHeight(rowHeight);
- m_backgroundLst[i]->move(-m_table->horizontalScrollBar()->value(),
+ m_backgroundLst[i]->move(-m_table->horizontalScrollBar()->value() + 10,
initY + i * rowHeight - m_table->verticalScrollBar()->value());
}
}
@@ -269,10 +268,9 @@ void DefenderTable::paintEvent(QPaintEvent *event)
for (int i = 0; i < m_rowCount; i++) {
int rowHeight = m_table->rowHeight(i);
m_table->setRowHeight(i, rowHeight);
- m_backgroundLst[i]->setFixedWidth(m_table->width()
- + m_table->horizontalScrollBar()->maximum() - 1);
+ m_backgroundLst[i]->setFixedWidth(m_table->width() + m_table->horizontalScrollBar()->maximum() - 20);
m_backgroundLst[i]->setFixedHeight(rowHeight);
- m_backgroundLst[i]->move(-m_table->horizontalScrollBar()->value(),
+ m_backgroundLst[i]->move(-m_table->horizontalScrollBar()->value() + 10,
initY + i * rowHeight - m_table->verticalScrollBar()->value());
}
}
diff --git a/deepin-pc-manager/src/widgets/defendertable.h b/deepin-autostart-plugin/defendertable.h
similarity index 85%
rename from deepin-pc-manager/src/widgets/defendertable.h
rename to deepin-autostart-plugin/defendertable.h
index 583c665..177c8de 100755
--- a/deepin-pc-manager/src/widgets/defendertable.h
+++ b/deepin-autostart-plugin/defendertable.h
@@ -8,18 +8,17 @@
#include
#include
-#include
-#include
+#include
#include
+#include
#include
-#include
+#include
DWIDGET_USE_NAMESPACE
#define ROW_HEIGHT 30 // 初始化高度
class DefenderTableHeaderView;
-
namespace def {
namespace widgets {
@@ -49,13 +48,13 @@ class DefenderTable : public DFrame
private:
DefenderTableHeaderView *m_headerDelegate; // 表头代理类
- DFrame *m_mainBackgroundWidgt; // 填充背景的frame控件
+ DFrame *m_mainBackgroundWidgt; // 填充背景的frame控件
QStandardItemModel *m_tableModel; // 数据模型
- DTableView *m_table; // 表格
- QList m_backgroundLst; // 背景列表
+ DTableView *m_table; // 表格
+ QList m_backgroundLst; // 背景列表
int m_rowHeight; // 行高
- int m_rowCount; // 总共的行数
+ int m_rowCount; // 总共的行数
};
} // namespace widgets
diff --git a/deepin-pc-manager/src/widgets/defendertableheaderview.cpp b/deepin-autostart-plugin/defendertableheaderview.cpp
similarity index 83%
rename from deepin-pc-manager/src/widgets/defendertableheaderview.cpp
rename to deepin-autostart-plugin/defendertableheaderview.cpp
index a64d932..12781eb 100644
--- a/deepin-pc-manager/src/widgets/defendertableheaderview.cpp
+++ b/deepin-autostart-plugin/defendertableheaderview.cpp
@@ -5,17 +5,17 @@
#include "defendertableheaderview.h"
-#include
-#include
-#include
-#include
-#include
-
#include
#include
#include
#include
+#include
+#include
+#include
+#include
+#include
+
static const int kSpacingMargin = 4;
DefenderTableHeaderView::DefenderTableHeaderView(Qt::Orientation orientation, QWidget *parent)
@@ -30,16 +30,10 @@ DefenderTableHeaderView::DefenderTableHeaderView(Qt::Orientation orientation, QW
setFixedHeight(37);
setFocusPolicy(Qt::StrongFocus);
setSortIndicatorShown(true);
-
- QFont f;
- f.setPixelSize(14);
- setFont(f);
}
// 绘制表头
-void DefenderTableHeaderView::paintSection(QPainter *painter,
- const QRect &rect,
- int logicalIndex) const
+void DefenderTableHeaderView::paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const
{
// 绘制设置
painter->save();
@@ -50,7 +44,8 @@ void DefenderTableHeaderView::paintSection(QPainter *painter,
cg = DPalette::Active;
// 获取系统样式
- DPalette palette = qApp->palette();
+ DApplicationHelper *dAppHelper = DApplicationHelper::instance();
+ DPalette palette = dAppHelper->applicationPalette();
// 设置风格
DStyle *style = dynamic_cast(DApplication::style());
@@ -62,9 +57,7 @@ void DefenderTableHeaderView::paintSection(QPainter *painter,
// 标题
QRect contentRect(rect.x(), rect.y(), rect.width(), rect.height() - m_spacing);
- QRect hSpacingRect(rect.x(),
- contentRect.height(),
- rect.width(),
+ QRect hSpacingRect(rect.x(), contentRect.height(), rect.width(),
rect.height() - contentRect.height());
QBrush contentBrush(palette.color(cg, DPalette::Base));
@@ -72,9 +65,7 @@ void DefenderTableHeaderView::paintSection(QPainter *painter,
QBrush hSpacingBrush(palette.color(cg, DPalette::FrameBorder));
// 纵向间隔
QBrush vSpacingBrush(palette.color(cg, DPalette::FrameBorder));
- QRectF vSpacingRect(rect.x(),
- rect.y() + kSpacingMargin,
- m_spacing,
+ QRectF vSpacingRect(rect.x(), rect.y() + kSpacingMargin, m_spacing,
rect.height() - kSpacingMargin * 2);
QBrush clearBrush(palette.color(cg, DPalette::Window));
@@ -92,15 +83,11 @@ void DefenderTableHeaderView::paintSection(QPainter *painter,
// 绘制文字
QRect textRect;
if (sortIndicatorSection() == logicalIndex) {
- textRect = { contentRect.x() + margin,
- contentRect.y(),
- contentRect.width() - margin * 3 - 8,
- contentRect.height() };
+ textRect = {contentRect.x() + margin, contentRect.y(), contentRect.width() - margin * 3 - 8,
+ contentRect.height()};
} else {
- textRect = { contentRect.x() + margin,
- contentRect.y(),
- contentRect.width() - margin,
- contentRect.height() };
+ textRect = {contentRect.x() + margin, contentRect.y(), contentRect.width() - margin,
+ contentRect.height()};
}
QString title = model()->headerData(logicalIndex, orientation(), Qt::DisplayRole).toString();
int align = Qt::AlignLeft | Qt::AlignVCenter;
@@ -123,9 +110,7 @@ void DefenderTableHeaderView::paintSection(QPainter *painter,
&& !m_indicatorHiddingColList.contains(logicalIndex)) {
// 绘制排序的箭头图标(8×5)
QRect sortIndicator(textRect.x() + textRect.width() + margin,
- textRect.y() + (textRect.height() - 5) / 2,
- 8,
- 5);
+ textRect.y() + (textRect.height() - 5) / 2, 8, 5);
option.rect = sortIndicator;
if (sortIndicatorOrder() == Qt::DescendingOrder) {
style->drawPrimitive(DStyle::PE_IndicatorArrowDown, &option, painter, this);
@@ -153,7 +138,8 @@ void DefenderTableHeaderView::paintEvent(QPaintEvent *event)
cg = DPalette::Active;
// 获取系统样式
- DPalette palette = qApp->palette();
+ DApplicationHelper *dAppHelper = DApplicationHelper::instance();
+ DPalette palette = dAppHelper->applicationPalette();
// 设置风格
DStyle *style = dynamic_cast(DApplication::style());
@@ -181,10 +167,7 @@ void DefenderTableHeaderView::paintEvent(QPaintEvent *event)
if (hasFocus() && (m_reson == Qt::TabFocusReason || m_reson == Qt::BacktabFocusReason)) {
QStyleOptionFocusRect o;
o.QStyleOption::operator=(option);
- QRect focusRect{ rect.x() - offset(),
- rect.y(),
- length() - sectionPosition(0),
- rect.height() };
+ QRect focusRect {rect.x() - offset(), rect.y(), length() - sectionPosition(0), rect.height()};
o.rect = style->visualRect(layoutDirection(), rect, focusRect);
style->drawPrimitive(DStyle::PE_FrameFocusRect, &o, &painter);
}
@@ -206,9 +189,9 @@ int DefenderTableHeaderView::sectionSizeHint(int logicalIndex) const
QFontMetrics fm(DApplication::font());
QString buf = model()->headerData(logicalIndex, Qt::Horizontal, Qt::DisplayRole).toString();
if (sortIndicatorSection() == logicalIndex) {
- return fm.horizontalAdvance(buf) + margin * 3 + 8;
+ return fm.width(buf) + margin * 3 + 8;
} else {
- return fm.horizontalAdvance(buf) + margin * 2;
+ return fm.width(buf) + margin * 2;
}
}
diff --git a/deepin-pc-manager/src/widgets/defendertableheaderview.h b/deepin-autostart-plugin/defendertableheaderview.h
similarity index 87%
rename from deepin-pc-manager/src/widgets/defendertableheaderview.h
rename to deepin-autostart-plugin/defendertableheaderview.h
index 40d7334..536f375 100644
--- a/deepin-pc-manager/src/widgets/defendertableheaderview.h
+++ b/deepin-autostart-plugin/defendertableheaderview.h
@@ -22,7 +22,6 @@ class DefenderTableHeaderView : public DHeaderView
// 表头间隔
inline int getSpacing() const { return m_spacing; }
-
inline void setSpacing(int spacing) { m_spacing = spacing; }
// 掩藏某列表头下标
@@ -33,9 +32,7 @@ class DefenderTableHeaderView : public DHeaderView
protected:
// 表头类绘制事件
void paintEvent(QPaintEvent *e) override;
- virtual void paintSection(QPainter *painter,
- const QRect &rect,
- int logicalIndex) const override;
+ virtual void paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const override;
// 焦点事件
void focusInEvent(QFocusEvent *event) override;
diff --git a/deepin-autostart-plugin/icons/autostart_icons.qrc b/deepin-autostart-plugin/icons/autostart_icons.qrc
new file mode 100644
index 0000000..16dda7c
--- /dev/null
+++ b/deepin-autostart-plugin/icons/autostart_icons.qrc
@@ -0,0 +1,5 @@
+
+
+ icons/deepin-auto-start.svg
+
+
diff --git a/deepin-pc-manager/src/window/icons/icons/Startup_Programs_48px.svg b/deepin-autostart-plugin/icons/icons/deepin-auto-start.svg
similarity index 100%
rename from deepin-pc-manager/src/window/icons/icons/Startup_Programs_48px.svg
rename to deepin-autostart-plugin/icons/icons/deepin-auto-start.svg
diff --git a/deepin-autostart-plugin/invokers/dbusinvoker.cpp b/deepin-autostart-plugin/invokers/dbusinvoker.cpp
new file mode 100644
index 0000000..58219a5
--- /dev/null
+++ b/deepin-autostart-plugin/invokers/dbusinvoker.cpp
@@ -0,0 +1,104 @@
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "dbusinvoker.h"
+
+#include
+#include
+
+DBusInvoker::DBusInvoker(const QString &service,
+ const QString &path,
+ const QString &interface,
+ ConnectType type,
+ QObject *parent)
+ : QObject(parent)
+ , m_service(service)
+ , m_path(path)
+ , m_interface(interface)
+ , m_type(type)
+ , m_connection(QDBusConnection::sessionBus())
+{
+ if (SYSTEM == m_type) {
+ m_connection = QDBusConnection::systemBus();
+ }
+}
+
+// signal-slot connection
+bool DBusInvoker::Connect(const QString &signal, QObject *reciver, const char *slot)
+{
+ bool connectRst = false;
+ connectRst = m_connection.connect(m_service, m_path, m_interface, signal, reciver, slot);
+ if (!connectRst) {
+ qCritical() << "signal connect failed : " << signal << "for reason ["
+ << m_connection.lastError().message() << "]";
+ }
+ Q_ASSERT(connectRst);
+ return connectRst;
+}
+
+// signal-slot disconnection
+bool DBusInvoker::Disconnect(const QString &signal, QObject *reciver, const char *slot)
+{
+ bool disconnectRst = false;
+ disconnectRst = m_connection.disconnect(m_service, m_path, m_interface, signal, reciver, slot);
+ if (!disconnectRst) {
+ qCritical() << "signal disconnect failed : " << signal << "for reason ["
+ << m_connection.lastError().message() << "]";
+ }
+ Q_ASSERT(disconnectRst);
+ return disconnectRst;
+}
+
+DBusInvoker::~DBusInvoker()
+{
+ // 确保在调用delete时,释放自身成员对象
+ deleteLater();
+}
+
+// create method call or signal emit
+// invoke like this :
+// invoker->Connect("signalFunc", this, SLOT(slotFunc(bool, QString)));
+// there would be param type validate when signal emitted
+QDBusMessage DBusInvoker::Invoke(const QString &name,
+ const QList &functionParams,
+ BlockMode mode)
+{
+ if (name.isEmpty()) {
+ return QDBusMessage::createError(QDBusError::InvalidArgs, QString("name.isEmpty"));
+ }
+
+ QDBusMessage msg;
+ if (DBUS_PROPERTY_INVOKER_NAME == name) {
+ if (functionParams.isEmpty()) {
+ return QDBusMessage::createError(QDBusError::InvalidArgs,
+ QString("property not exist"));
+ }
+
+ msg = QDBusMessage::createMethodCall(m_service,
+ m_path,
+ "org.freedesktop.DBus.Properties",
+ "Get");
+ msg.setArguments({m_interface, functionParams.first().toString()});
+
+ QDBusMessage retMsg = m_connection.call(msg, QDBus::CallMode(mode));
+ return retMsg;
+ }
+
+ msg = QDBusMessage::createMethodCall(m_service, m_path, m_interface, name);
+ msg.setArguments(functionParams);
+
+ return m_connection.call(msg, QDBus::CallMode(mode));
+}
+
+// emit signal
+bool DBusInvoker::EmitSignal(const QString &name, const QList &arguments)
+{
+ if (name.isEmpty()) {
+ return false;
+ }
+
+ QDBusMessage signal = QDBusMessage::createSignal(m_path, m_interface, name);
+ signal.setArguments(arguments);
+ return m_connection.send(signal);
+}
diff --git a/deepin-autostart-plugin/invokers/dbusinvoker.h b/deepin-autostart-plugin/invokers/dbusinvoker.h
new file mode 100644
index 0000000..d1a8ab9
--- /dev/null
+++ b/deepin-autostart-plugin/invokers/dbusinvoker.h
@@ -0,0 +1,48 @@
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#ifndef DBUS_INVOKER_H
+#define DBUS_INVOKER_H
+
+#include "invokerinterface.h"
+
+#include
+#include
+
+// 公共dbus接口类
+#define DBUS_PROPERTY_INVOKER_NAME "dbusPropertyInvoker" // 公共dbus接口属性获取识别
+// interface
+class DBusInvoker : public QObject
+ , public DBusInvokerInterface
+{
+ Q_OBJECT
+public:
+ DBusInvoker(const QString &service,
+ const QString &path,
+ const QString &interface,
+ ConnectType type = ConnectType::SESSION,
+ QObject *parent = nullptr);
+
+ virtual QDBusMessage Invoke(const QString &name,
+ const QList &functionParams = QList(),
+ BlockMode mode = BlockMode::BLOCKWITHGUI) override;
+ virtual bool EmitSignal(const QString &name,
+ const QList &arguments = QList()) override;
+ virtual bool Connect(const QString &signal, QObject *reciver, const char *slot) override;
+ virtual bool Disconnect(const QString &signal, QObject *reciver, const char *slot) override;
+ virtual ~DBusInvoker() override;
+
+private:
+ QString m_service;
+ QString m_path;
+ QString m_interface;
+ ConnectType m_type;
+ QDBusConnection m_connection;
+
+private:
+ DBusInvoker(const DBusInvoker &);
+ DBusInvoker &operator=(const DBusInvoker &);
+};
+
+#endif
diff --git a/deepin-autostart-plugin/invokers/invokerfactory.cpp b/deepin-autostart-plugin/invokers/invokerfactory.cpp
new file mode 100644
index 0000000..f0c0634
--- /dev/null
+++ b/deepin-autostart-plugin/invokers/invokerfactory.cpp
@@ -0,0 +1,38 @@
+// Copyright (C) 2021 ~ 2021 Deepin Technology Co., Ltd.
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "invokerfactory.h"
+
+#include "dbusinvoker.h"
+
+InvokerFactory::InvokerFactory()
+{
+}
+
+InvokerFactory::~InvokerFactory()
+{
+}
+
+DBusInvokerInterface *InvokerFactory::CreateInvoker(const QString &service,
+ const QString &path,
+ const QString &interface,
+ ConnectType type,
+ QObject *parent)
+{
+ return new DBusInvoker(service, path, interface, type, parent);
+}
+
+// 单元测试扩展处理
+void InvokerFactory::setInvokerInteface(const QString &interfaceName,
+ DBusInvokerInterface *interface)
+{
+#ifdef DEEPIN_DEFENDER_UNITTEST
+ // 不关心是否重复
+ m_intefaceMap.insert(interfaceName, interface);
+#else
+ Q_UNUSED(interfaceName);
+ Q_UNUSED(interface);
+#endif
+}
diff --git a/deepin-pc-manager/src/window/modules/common/invokers/invokerfactory.h b/deepin-autostart-plugin/invokers/invokerfactory.h
similarity index 68%
rename from deepin-pc-manager/src/window/modules/common/invokers/invokerfactory.h
rename to deepin-autostart-plugin/invokers/invokerfactory.h
index 330bb53..2f25e78 100644
--- a/deepin-pc-manager/src/window/modules/common/invokers/invokerfactory.h
+++ b/deepin-autostart-plugin/invokers/invokerfactory.h
@@ -12,15 +12,16 @@
// 简化DBUS调用方法的写法
#define DBUS_BLOCK_INVOKE(interface, funName, ...) \
- interface->Invoke(funName, { __VA_ARGS__ }, BlockMode::BLOCK)
+ interface->Invoke(funName, {__VA_ARGS__}, BlockMode::BLOCK)
#define DBUS_INVOKE(interface, funName, ...) \
- interface->Invoke(funName, { __VA_ARGS__ }, BlockMode::BLOCKWITHGUI)
+ interface->Invoke(funName, {__VA_ARGS__}, BlockMode::BLOCKWITHGUI)
#define DBUS_NOBLOCK_INVOKE(interface, funName, ...) \
- interface->Invoke(funName, { __VA_ARGS__ }, BlockMode::NOBLOCK)
+ interface->Invoke(funName, {__VA_ARGS__}, BlockMode::NOBLOCK)
#define GET_MESSAGE_VALUE(type, output, message) type output = QDBusReply(message).value()
// implement
-class InvokerFactory : public QObject, public InvokerFactoryInterface
+class InvokerFactory : public QObject
+ , public InvokerFactoryInterface
{
Q_OBJECT
public:
@@ -35,13 +36,9 @@ class InvokerFactory : public QObject, public InvokerFactoryInterface
const QString &interface,
ConnectType type = ConnectType::SESSION,
QObject *parent = nullptr) override;
- virtual SettingsInvokerInterface *CreateSettings(const QByteArray &schema_id,
- const QByteArray &path = QByteArray(),
- QObject *parent = nullptr) override;
public:
void setInvokerInteface(const QString &, DBusInvokerInterface *);
- void setSettinsInteface(const QString &, SettingsInvokerInterface *);
private:
InvokerFactory();
@@ -50,7 +47,6 @@ class InvokerFactory : public QObject, public InvokerFactoryInterface
~InvokerFactory() override;
QMap m_intefaceMap;
- QMap m_settingsMap;
};
#endif
diff --git a/deepin-pc-manager/src/window/modules/common/invokers/invokerinterface.h b/deepin-autostart-plugin/invokers/invokerinterface.h
similarity index 64%
rename from deepin-pc-manager/src/window/modules/common/invokers/invokerinterface.h
rename to deepin-autostart-plugin/invokers/invokerinterface.h
index f052de0..4702801 100644
--- a/deepin-pc-manager/src/window/modules/common/invokers/invokerinterface.h
+++ b/deepin-autostart-plugin/invokers/invokerinterface.h
@@ -10,11 +10,16 @@
#include
#include
-enum ConnectType { SYSTEM, SESSION };
+enum ConnectType { SYSTEM,
+ SESSION };
-enum InvokeType { CALL, SIGNAL };
+enum InvokeType { CALL,
+ SIGNAL };
-enum BlockMode { NOBLOCK, BLOCK, BLOCKWITHGUI, AUTODETECT };
+enum BlockMode { NOBLOCK,
+ BLOCK,
+ BLOCKWITHGUI,
+ AUTODETECT };
// interface
class DBusInvokerInterface
@@ -28,17 +33,7 @@ class DBusInvokerInterface
virtual bool Connect(const QString &signal, QObject *reciver, const char *slot) = 0;
virtual bool Disconnect(const QString &signal, QObject *reciver, const char *slot) = 0;
- virtual ~DBusInvokerInterface() { }
-};
-
-class SettingsInvokerInterface
-{
-public:
- virtual QVariant GetValue(const QString &key) const = 0;
- virtual void SetValue(const QString &key, const QVariant &value) = 0;
- virtual void Reset(const QString &key) = 0;
-
- virtual ~SettingsInvokerInterface() { }
+ virtual ~DBusInvokerInterface() {}
};
class InvokerFactoryInterface
@@ -49,11 +44,7 @@ class InvokerFactoryInterface
const QString &interface,
ConnectType type = ConnectType::SESSION,
QObject *parent = nullptr) = 0;
- virtual SettingsInvokerInterface *CreateSettings(const QByteArray &schema_id,
- const QByteArray &path = QByteArray(),
- QObject *parent = nullptr) = 0;
-
- virtual ~InvokerFactoryInterface() { }
+ virtual ~InvokerFactoryInterface() {}
};
#endif
diff --git a/deepin-autostart-plugin/translate_generation.sh b/deepin-autostart-plugin/translate_generation.sh
new file mode 100644
index 0000000..6b67c53
--- /dev/null
+++ b/deepin-autostart-plugin/translate_generation.sh
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+# SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+#
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+# this file is used to auto-generate .qm file from .ts file.
+# author: shibowen at linuxdeepin.com
+
+ts_list=($(ls translations/*.ts))
+
+for ts in "${ts_list[@]}"; do
+ printf "\nprocess ${ts}\n"
+ lrelease "${ts}"
+done
diff --git a/deepin-autostart-plugin/translations/deepin-autostart_en_US.ts b/deepin-autostart-plugin/translations/deepin-autostart_en_US.ts
new file mode 100644
index 0000000..d638c63
--- /dev/null
+++ b/deepin-autostart-plugin/translations/deepin-autostart_en_US.ts
@@ -0,0 +1,80 @@
+
+
+
+
+ AutoStartModule
+
+
+ Startup Programs
+
+
+
+
+ Manage auto startup programs
+
+
+
+
+ Supported by UOS
+
+
+
+
+ AutoStartWidget
+
+
+ Startup Programs
+
+
+
+
+ Name
+
+
+
+
+ Auto Startup
+
+
+
+
+ Action
+
+
+
+
+
+ Enabled
+
+
+
+
+
+ Disabled
+
+
+
+
+ Startup apps
+
+
+
+
+ All apps
+
+
+
+
+ MyItemDelegate
+
+
+ System
+
+
+
+
+ Third-party
+
+
+
+
diff --git a/deepin-autostart-plugin/translations/deepin-autostart_zh_CN.ts b/deepin-autostart-plugin/translations/deepin-autostart_zh_CN.ts
new file mode 100644
index 0000000..bb793b0
--- /dev/null
+++ b/deepin-autostart-plugin/translations/deepin-autostart_zh_CN.ts
@@ -0,0 +1,80 @@
+
+
+
+
+ AutoStartModule
+
+
+ Startup Programs
+ 自启动应用
+
+
+
+ Manage auto startup programs
+ 管理应用开机自启情况
+
+
+
+ Supported by UOS
+ 由UOS提供服务
+
+
+
+ AutoStartWidget
+
+
+ Startup Programs
+ 自启动应用
+
+
+
+ Name
+ 名称
+
+
+
+ Auto Startup
+ 自启动状态
+
+
+
+ Action
+ 操作
+
+
+
+
+ Enabled
+ 已启动
+
+
+
+
+ Disabled
+ 已禁止
+
+
+
+ Startup apps
+ 已允许应用
+
+
+
+ All apps
+ 全部应用
+
+
+
+ MyItemDelegate
+
+
+ System
+ 系统
+
+
+
+ Third-party
+ 第三方
+
+
+
diff --git a/deepin-fcitxrepair-plugin/CMakeLists.txt b/deepin-fcitxrepair-plugin/CMakeLists.txt
new file mode 100644
index 0000000..0392d9f
--- /dev/null
+++ b/deepin-fcitxrepair-plugin/CMakeLists.txt
@@ -0,0 +1,46 @@
+cmake_minimum_required(VERSION 3.7)
+
+set(PLUGIN_NAME "deepin-fcitxrepair")
+
+project(${PLUGIN_NAME})
+
+set(CMAKE_AUTOMOC ON)
+
+file(GLOB_RECURSE SRCS
+ "*.h"
+ "*.cpp")
+
+find_package(Qt5 COMPONENTS Core Widgets DBus Svg LinguistTools REQUIRED)
+find_package(PkgConfig REQUIRED)
+find_package(DtkWidget REQUIRED)
+
+pkg_check_modules(DFrameworkDBus REQUIRED dframeworkdbus)
+pkg_check_modules(QGSettings REQUIRED gsettings-qt)
+
+file(GLOB TS_FILES "translations/*.ts")
+qt5_add_translation(QM_FILES ${TS_FILES})
+add_custom_target(translationsfcitxrepair ALL DEPENDS ${QM_FILES})
+install(FILES ${QM_FILES} DESTINATION share/${PLUGIN_NAME}/translations)
+
+add_library(${PLUGIN_NAME} SHARED ${SRCS} icons/fcitxrepair_icons.qrc)
+set_target_properties(${PLUGIN_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ./)
+target_include_directories(${PLUGIN_NAME} PUBLIC
+ ${Qt5Widgets_INCLUDE_DIRS}
+ ${Qt5Svg_INCLUDE_DIRS}
+ ${DtkWidget_INCLUDE_DIRS}
+ ${QGSettings_INCLUDE_DIRS}
+ ${Qt5DBus_INCLUDE_DIRS}
+ ../deepin-pc-manager/include/
+ )
+target_link_libraries(${PLUGIN_NAME} PRIVATE
+ ${Qt5Widgets_LIBRARIES}
+ ${Qt5Svg_LIBRARIES}
+ ${DtkWidget_LIBRARIES}
+ ${DFrameworkDBus_LIBRARIES}
+ ${QGSettings_LIBRARIES}
+ ${Qt5DBus_LIBRARIES}
+ )
+
+install(TARGETS ${PLUGIN_NAME} LIBRARY DESTINATION /usr/lib/deepin-pc-manager/modules)
+install(FILES icons/icons/deepin-fcitx-repair.svg DESTINATION /usr/share/icons/hicolor/scalable/apps)
+install(FILES ./fcitxrepair.sh DESTINATION /usr/share/deepin-pc-manager)
diff --git a/deepin-fcitxrepair-plugin/fcitxrepair.sh b/deepin-fcitxrepair-plugin/fcitxrepair.sh
new file mode 100644
index 0000000..1754d5c
--- /dev/null
+++ b/deepin-fcitxrepair-plugin/fcitxrepair.sh
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+#
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+echo '操作开始'
+cd /home/${USER}/.config/
+echo '正在清理输入法缓存目录'
+rm -rf com.sogou.sogoupinyin-uos/ fcitx/ iflytek/ iflyime-qimpanel/ SogouPY/ sogoupinyin/ .com.sogou.sogoupinyin-uos-zyb/ /fcitx-huayupy
+echo '操作完成'
+echo '请重启系统后打开输入法配置进行配置'
\ No newline at end of file
diff --git a/deepin-fcitxrepair-plugin/fcitxrepair_settings.json b/deepin-fcitxrepair-plugin/fcitxrepair_settings.json
new file mode 100644
index 0000000..dbc6b7b
--- /dev/null
+++ b/deepin-fcitxrepair-plugin/fcitxrepair_settings.json
@@ -0,0 +1,3 @@
+{
+ "api" : "1.0.0"
+}
\ No newline at end of file
diff --git a/deepin-fcitxrepair-plugin/fcitxrepairmodel.cpp b/deepin-fcitxrepair-plugin/fcitxrepairmodel.cpp
new file mode 100644
index 0000000..6aa23cf
--- /dev/null
+++ b/deepin-fcitxrepair-plugin/fcitxrepairmodel.cpp
@@ -0,0 +1,36 @@
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "fcitxrepairmodel.h"
+
+#include
+#define LOOG_FCITX_REPAIR_DIR "/usr/share/deepin-pc-manager/"
+#define LOOG_FCITX_REPAIR_PATH "/usr/share/deepin-pc-manager/fcitxrepair.sh"
+FcitxRepairModel::FcitxRepairModel(QObject *parent)
+ : QObject(parent)
+{
+ initData();
+}
+
+FcitxRepairModel::~FcitxRepairModel()
+{
+}
+
+// 初始化数据
+void FcitxRepairModel::initData()
+{
+}
+
+QString FcitxRepairModel::repairFcitxIssue()
+{
+ QProcess builder;
+ builder.setWorkingDirectory(LOOG_FCITX_REPAIR_DIR);
+ builder.setProcessChannelMode(QProcess::MergedChannels);
+ builder.start(QString("/bin/bash %1 %2").arg(LOOG_FCITX_REPAIR_PATH));
+ if (!builder.waitForFinished()) {
+ builder.close();
+ return "修复输入法失败";
+ }
+ return QString::fromLocal8Bit(builder.readAllStandardOutput()).trimmed();
+}
diff --git a/deepin-fcitxrepair-plugin/fcitxrepairmodel.h b/deepin-fcitxrepair-plugin/fcitxrepairmodel.h
new file mode 100644
index 0000000..e92ea47
--- /dev/null
+++ b/deepin-fcitxrepair-plugin/fcitxrepairmodel.h
@@ -0,0 +1,22 @@
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#pragma once
+
+#include
+
+class FcitxRepairModel : public QObject
+{
+ Q_OBJECT
+public:
+ explicit FcitxRepairModel(QObject *parent = nullptr);
+ ~FcitxRepairModel();
+
+ QString repairFcitxIssue();
+
+private:
+ void initData();
+
+private:
+};
diff --git a/deepin-fcitxrepair-plugin/fcitxrepairmodule.cpp b/deepin-fcitxrepair-plugin/fcitxrepairmodule.cpp
new file mode 100644
index 0000000..4035b70
--- /dev/null
+++ b/deepin-fcitxrepair-plugin/fcitxrepairmodule.cpp
@@ -0,0 +1,79 @@
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "fcitxrepairmodule.h"
+#include "fcitxrepairmodel.h"
+#include "fcitxrepairwidget.h"
+
+#include
+
+#include
+#include
+
+DWIDGET_USE_NAMESPACE
+DCORE_USE_NAMESPACE
+
+FcitxRepairModule::FcitxRepairModule()
+ : QObject()
+ , ToolBoxInterface()
+ , m_fcitxRepairModel(nullptr)
+ , m_fcitxRepairWidget(nullptr)
+{
+ QTranslator *translator = new QTranslator(this);
+ translator->load(QString("/usr/share/deepin-fcitxrepair/translations/deepin-fcitxrepair_%1.qm").arg(QLocale::system().name()));
+ QCoreApplication::installTranslator(translator);
+}
+
+FcitxRepairModule::~FcitxRepairModule()
+{
+}
+
+void FcitxRepairModule::active()
+{
+ if (!m_fcitxRepairModel) {
+ m_fcitxRepairModel = new FcitxRepairModel;
+ }
+ if (!m_fcitxRepairWidget) {
+ m_fcitxRepairWidget = new FcitxRepairWidget(m_fcitxRepairModel);
+ }
+
+ m_frameProxy->pushWidget(this, m_fcitxRepairWidget);
+ m_fcitxRepairWidget->setVisible(true);
+}
+
+const QString FcitxRepairModule::name() const
+{
+ return "DEEPINFCITXREPAIR";
+}
+const QString FcitxRepairModule::apptitle() const
+{
+ return tr("Input method repair");
+}
+const QString FcitxRepairModule::apptip() const
+{
+ return tr("Fix input method anomalies");
+}
+const QString FcitxRepairModule::appsupporter() const
+{
+ return tr("Supported by UOS");
+}
+const QString FcitxRepairModule::icon() const
+{
+ return "deepin-fcitx-repair";
+}
+
+int FcitxRepairModule::apptype() const
+{
+ return ToolBoxProxyInterface::Repair;
+}
+
+bool FcitxRepairModule::enable() const
+{
+ return true;
+}
+
+bool FcitxRepairModule::checkauth() const
+{
+ return false;
+}
diff --git a/deepin-fcitxrepair-plugin/fcitxrepairmodule.h b/deepin-fcitxrepair-plugin/fcitxrepairmodule.h
new file mode 100644
index 0000000..6939af1
--- /dev/null
+++ b/deepin-fcitxrepair-plugin/fcitxrepairmodule.h
@@ -0,0 +1,53 @@
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#pragma once
+
+#include
+#include
+
+#include "interface/toolboxinterface.h"
+#include "interface/toolboxproxyinterface.h"
+
+namespace PCC_NAMESPACE {
+class ToolBoxInterface;
+class ToolBoxProxyInterface;
+} // namespace PCC_NAMESPACE
+
+using namespace PCC_NAMESPACE;
+
+class FcitxRepairWidget;
+class FcitxRepairModel;
+class FcitxRepairModule : public QObject
+ , public ToolBoxInterface
+{
+ Q_OBJECT
+
+ Q_PLUGIN_METADATA(IID ToolBoxInterface_iid FILE "fcitxrepair_settings.json")
+ Q_INTERFACES(PCC_NAMESPACE::ToolBoxInterface)
+
+public:
+ explicit FcitxRepairModule();
+
+ ~FcitxRepairModule() Q_DECL_OVERRIDE;
+
+ const QString name() const Q_DECL_OVERRIDE;
+ const QString apptitle() const Q_DECL_OVERRIDE;
+ const QString apptip() const Q_DECL_OVERRIDE;
+ const QString appsupporter() const Q_DECL_OVERRIDE;
+ const QString icon() const Q_DECL_OVERRIDE;
+ int apptype() const Q_DECL_OVERRIDE;
+ bool enable() const Q_DECL_OVERRIDE;
+ bool checkauth() const Q_DECL_OVERRIDE;
+
+private:
+ void onStatusChanged();
+
+public Q_SLOTS:
+ void active() Q_DECL_OVERRIDE;
+
+private:
+ FcitxRepairModel *m_fcitxRepairModel;
+ FcitxRepairWidget *m_fcitxRepairWidget;
+};
diff --git a/deepin-fcitxrepair-plugin/fcitxrepairwidget.cpp b/deepin-fcitxrepair-plugin/fcitxrepairwidget.cpp
new file mode 100644
index 0000000..bbf64bb
--- /dev/null
+++ b/deepin-fcitxrepair-plugin/fcitxrepairwidget.cpp
@@ -0,0 +1,105 @@
+// Copyright (C) 2019 ~ 2019 Deepin Technology Co., Ltd.
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "fcitxrepairwidget.h"
+#include "fcitxrepairmodel.h"
+
+#include
+#include
+#include
+#include
+#include
+
+#include
+
+FcitxRepairWidget::FcitxRepairWidget(FcitxRepairModel *model, QWidget *parent)
+ : DFrame(parent)
+ , m_model(model)
+{
+ initUI();
+ connect(m_execButton, &DSuggestButton::clicked, this, &FcitxRepairWidget::repairFcitxIssue);
+}
+
+FcitxRepairWidget::~FcitxRepairWidget()
+{
+}
+
+void FcitxRepairWidget::initUI()
+{
+ QVBoxLayout *layout = new QVBoxLayout(this);
+ layout->setSpacing(10);
+ layout->setContentsMargins(20, 20, 20, 20);
+ this->setLayout(layout);
+
+ QLabel *title = new QLabel(tr("Input method repair"), this);
+ QFont font1 = title->font();
+ font1.setBold(true);
+ font1.setWeight(QFont::DemiBold);
+ DFontSizeManager::instance()->bind(title, DFontSizeManager::T5);
+ title->setContentsMargins(10, 0, 0, 0);
+
+ QLabel *detailInfo = new QLabel(tr("Fix input method anomalies"), this);
+ DFontSizeManager::instance()->bind(detailInfo, DFontSizeManager::T8);
+ detailInfo->setContentsMargins(10, 0, 0, 0);
+
+ QLabel *descriptionInfo = new QLabel(tr("Tool Description"), this);
+ DFontSizeManager::instance()->bind(descriptionInfo, DFontSizeManager::T8);
+ descriptionInfo->setContentsMargins(10, 0, 0, 0);
+
+ DTipLabel *tipLabel = new DTipLabel(tr("Resolves issues with input method anomalies, such as inability to use or switch input methods"), this);
+ DFontSizeManager::instance()->bind(tipLabel, DFontSizeManager::T8);
+ tipLabel->setContentsMargins(10, 0, 0, 0);
+ tipLabel->setAlignment(Qt::AlignLeft);
+
+ DFrame *textFrame = new DFrame(this);
+ QVBoxLayout *textLayout = new QVBoxLayout(textFrame);
+ textLayout->setContentsMargins(2, 2, 2, 2);
+ textLayout->setSpacing(0);
+ textFrame->setLayout(textLayout);
+
+ m_textEdit = new QTextEdit(textFrame);
+ m_textEdit->setFixedSize(QSize(900, 400));
+ m_textEdit->setLineWidth(0);
+ textLayout->addWidget(m_textEdit, 0, Qt::AlignCenter);
+
+ m_execButton = new DSuggestButton(this);
+ m_execButton->setFixedWidth(180);
+ m_execButton->setText(tr("Execute immediately"));
+
+ layout->addWidget(title);
+ layout->addWidget(detailInfo);
+ layout->addSpacing(10);
+ layout->addWidget(descriptionInfo);
+ layout->addWidget(tipLabel);
+ layout->addWidget(textFrame, 0, Qt::AlignCenter);
+ layout->addWidget(m_execButton, 0, Qt::AlignRight);
+ layout->addStretch();
+}
+
+void FcitxRepairWidget::repairFcitxIssue()
+{
+ DDialog *dlg = new DDialog(this);
+ dlg->setOnButtonClickedClose(true);
+ // 设置属性当关闭时候删除自己
+ dlg->setAttribute(Qt::WA_DeleteOnClose);
+ dlg->setIcon(QIcon::fromTheme("deepin-fcitx-repair"));
+ dlg->setMessage(tr("The operation cannot be undone. Please confirm if you want to proceed?"));
+ dlg->addButton(tr("Cancel", "button"), false, DDialog::ButtonType::ButtonNormal);
+ dlg->addButton(tr("Continue"), false, DDialog::ButtonType::ButtonRecommend);
+
+ connect(dlg, &DDialog::buttonClicked, this, [&](int index, const QString &text) {
+ Q_UNUSED(text);
+ if (1 == index) {
+ m_textEdit->setText(m_model->repairFcitxIssue());
+ DFloatingMessage *floMsgSwitchOff = new DFloatingMessage(DFloatingMessage::TransientType);
+ floMsgSwitchOff->setDuration(2000);
+ floMsgSwitchOff->setIcon(QIcon::fromTheme("dcc_ok_tip"));
+ floMsgSwitchOff->setMessage(tr("Please restart the system and open the input method configuration to make adjustments"));
+ DMessageManager::instance()->sendMessage(this, floMsgSwitchOff);
+ DMessageManager::instance()->setContentMargens(this, QMargins(0, 0, 0, 20));
+ }
+ });
+ dlg->exec();
+}
diff --git a/deepin-fcitxrepair-plugin/fcitxrepairwidget.h b/deepin-fcitxrepair-plugin/fcitxrepairwidget.h
new file mode 100644
index 0000000..e0c1bb7
--- /dev/null
+++ b/deepin-fcitxrepair-plugin/fcitxrepairwidget.h
@@ -0,0 +1,37 @@
+// Copyright (C) 2019 ~ 2019 Deepin Technology Co., Ltd.
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#pragma once
+
+#include
+#include
+#include
+
+#include
+#include
+#include
+#include
+
+DWIDGET_USE_NAMESPACE
+class FcitxRepairModel;
+class FcitxRepairWidget : public DFrame
+{
+ Q_OBJECT
+public:
+ explicit FcitxRepairWidget(FcitxRepairModel *model, QWidget *parent = nullptr);
+ ~FcitxRepairWidget();
+
+private:
+ // 初始化界面
+ void initUI();
+
+public Q_SLOTS:
+ void repairFcitxIssue();
+
+private:
+ FcitxRepairModel *m_model;
+ QTextEdit *m_textEdit;
+ DSuggestButton *m_execButton;
+};
diff --git a/deepin-fcitxrepair-plugin/icons/fcitxrepair_icons.qrc b/deepin-fcitxrepair-plugin/icons/fcitxrepair_icons.qrc
new file mode 100644
index 0000000..a5e85b1
--- /dev/null
+++ b/deepin-fcitxrepair-plugin/icons/fcitxrepair_icons.qrc
@@ -0,0 +1,5 @@
+
+
+ icons/deepin-fcitx-repair.svg
+
+
diff --git a/deepin-fcitxrepair-plugin/icons/icons/deepin-fcitx-repair.svg b/deepin-fcitxrepair-plugin/icons/icons/deepin-fcitx-repair.svg
new file mode 100644
index 0000000..4ad17f2
--- /dev/null
+++ b/deepin-fcitxrepair-plugin/icons/icons/deepin-fcitx-repair.svg
@@ -0,0 +1,71 @@
+
+
\ No newline at end of file
diff --git a/deepin-fcitxrepair-plugin/translate_generation.sh b/deepin-fcitxrepair-plugin/translate_generation.sh
new file mode 100644
index 0000000..6b67c53
--- /dev/null
+++ b/deepin-fcitxrepair-plugin/translate_generation.sh
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+# SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+#
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+# this file is used to auto-generate .qm file from .ts file.
+# author: shibowen at linuxdeepin.com
+
+ts_list=($(ls translations/*.ts))
+
+for ts in "${ts_list[@]}"; do
+ printf "\nprocess ${ts}\n"
+ lrelease "${ts}"
+done
diff --git a/deepin-fcitxrepair-plugin/translations/deepin-fcitxrepair_en_US.ts b/deepin-fcitxrepair-plugin/translations/deepin-fcitxrepair_en_US.ts
new file mode 100644
index 0000000..338805d
--- /dev/null
+++ b/deepin-fcitxrepair-plugin/translations/deepin-fcitxrepair_en_US.ts
@@ -0,0 +1,71 @@
+
+
+
+
+ FcitxRepairModule
+
+
+ Input method repair
+
+
+
+
+ Fix input method anomalies
+
+
+
+
+ Supported by UOS
+
+
+
+
+ FcitxRepairWidget
+
+
+ Input method repair
+
+
+
+
+ Fix input method anomalies
+
+
+
+
+ Tool Description
+
+
+
+
+ Resolves issues with input method anomalies, such as inability to use or switch input methods
+
+
+
+
+ Execute immediately
+
+
+
+
+ The operation cannot be undone. Please confirm if you want to proceed?
+
+
+
+
+ Cancel
+ button
+
+
+
+
+ Continue
+
+
+
+
+ Please restart the system and open the input method configuration to make adjustments
+
+
+
+
diff --git a/deepin-fcitxrepair-plugin/translations/deepin-fcitxrepair_zh_CN.ts b/deepin-fcitxrepair-plugin/translations/deepin-fcitxrepair_zh_CN.ts
new file mode 100644
index 0000000..bfa7b4d
--- /dev/null
+++ b/deepin-fcitxrepair-plugin/translations/deepin-fcitxrepair_zh_CN.ts
@@ -0,0 +1,76 @@
+
+
+
+
+ FcitxRepairModule
+
+
+ Input method repair
+ 输入法修复
+
+
+
+ Fix input method anomalies
+ 修复输入法异常问题
+
+
+
+ Supported by UOS
+ 由UOS提供服务
+
+
+
+ FcitxRepairWidget
+
+
+ Input method repair
+ 输入法修复
+
+
+
+ Fix input method anomalies
+ 修复输入法异常问题
+
+
+
+ Tool Description
+ 工具描述
+
+
+
+ Resolves issues with input method anomalies, such as inability to use or switch input methods
+ 解决输入法异常的问题,如输入法无法使用、无法切换等
+
+
+
+ Execute immediately
+ 立即执行
+
+
+
+ The operation cannot be undone. Please confirm if you want to proceed?
+ 操作无法撤销,请确认是否继续执行?
+
+
+
+ Cancel
+ button
+ 取消
+
+
+
+ Continue
+ 继续执行
+
+
+
+ Execute successful
+ 执行成功
+
+
+
+ Please restart the system and open the input method configuration to make adjustments
+ 请重启系统后打开输入法配置进行配置
+
+
+
diff --git a/deepin-fileicon-plugin/CMakeLists.txt b/deepin-fileicon-plugin/CMakeLists.txt
new file mode 100644
index 0000000..567e134
--- /dev/null
+++ b/deepin-fileicon-plugin/CMakeLists.txt
@@ -0,0 +1,46 @@
+cmake_minimum_required(VERSION 3.7)
+
+set(PLUGIN_NAME "deepin-fileicon")
+
+project(${PLUGIN_NAME})
+
+set(CMAKE_AUTOMOC ON)
+
+file(GLOB_RECURSE SRCS
+ "*.h"
+ "*.cpp")
+
+find_package(Qt5 COMPONENTS Core Widgets DBus Svg LinguistTools REQUIRED)
+find_package(PkgConfig REQUIRED)
+find_package(DtkWidget REQUIRED)
+
+pkg_check_modules(DFrameworkDBus REQUIRED dframeworkdbus)
+pkg_check_modules(QGSettings REQUIRED gsettings-qt)
+
+file(GLOB TS_FILES "translations/*.ts")
+qt5_add_translation(QM_FILES ${TS_FILES})
+add_custom_target(translationsfileicon ALL DEPENDS ${QM_FILES})
+install(FILES ${QM_FILES} DESTINATION share/${PLUGIN_NAME}/translations)
+
+add_library(${PLUGIN_NAME} SHARED ${SRCS} icons/fileicon_icons.qrc)
+set_target_properties(${PLUGIN_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ./)
+target_include_directories(${PLUGIN_NAME} PUBLIC
+ ${Qt5Widgets_INCLUDE_DIRS}
+ ${Qt5Svg_INCLUDE_DIRS}
+ ${DtkWidget_INCLUDE_DIRS}
+ ${QGSettings_INCLUDE_DIRS}
+ ${Qt5DBus_INCLUDE_DIRS}
+ ../deepin-pc-manager/include/
+ )
+target_link_libraries(${PLUGIN_NAME} PRIVATE
+ ${Qt5Widgets_LIBRARIES}
+ ${Qt5Svg_LIBRARIES}
+ ${DtkWidget_LIBRARIES}
+ ${DFrameworkDBus_LIBRARIES}
+ ${QGSettings_LIBRARIES}
+ ${Qt5DBus_LIBRARIES}
+ )
+
+install(TARGETS ${PLUGIN_NAME} LIBRARY DESTINATION /usr/lib/deepin-pc-manager/modules)
+install(FILES icons/icons/deepin-file-icon.svg DESTINATION /usr/share/icons/hicolor/scalable/apps)
+install(FILES ./fileicon.sh DESTINATION /usr/share/deepin-pc-manager)
diff --git a/deepin-fileicon-plugin/fileicon.sh b/deepin-fileicon-plugin/fileicon.sh
new file mode 100644
index 0000000..8d12708
--- /dev/null
+++ b/deepin-fileicon-plugin/fileicon.sh
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+# SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+#
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+echo '操作开始'
+sed -i '/^inode/d' ~/.config/mimeapps.list
+echo 'mimeapps.list字符替换成功'
+echo '操作完成'
\ No newline at end of file
diff --git a/deepin-fileicon-plugin/fileicon_settings.json b/deepin-fileicon-plugin/fileicon_settings.json
new file mode 100644
index 0000000..dbc6b7b
--- /dev/null
+++ b/deepin-fileicon-plugin/fileicon_settings.json
@@ -0,0 +1,3 @@
+{
+ "api" : "1.0.0"
+}
\ No newline at end of file
diff --git a/deepin-fileicon-plugin/fileiconmodel.cpp b/deepin-fileicon-plugin/fileiconmodel.cpp
new file mode 100644
index 0000000..3edcbd0
--- /dev/null
+++ b/deepin-fileicon-plugin/fileiconmodel.cpp
@@ -0,0 +1,37 @@
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "fileiconmodel.h"
+
+#include
+
+#define LOOG_FILE_ICON_DIR "/usr/share/deepin-pc-manager/"
+#define LOOG_FILE_ICON_PATH "/usr/share/deepin-pc-manager/fileicon.sh"
+FileIconModel::FileIconModel(QObject *parent)
+ : QObject(parent)
+{
+ initData();
+}
+
+FileIconModel::~FileIconModel()
+{
+}
+
+// 初始化数据
+void FileIconModel::initData()
+{
+}
+
+QString FileIconModel::resolveIconIssue()
+{
+ QProcess builder;
+ builder.setWorkingDirectory(LOOG_FILE_ICON_DIR);
+ builder.setProcessChannelMode(QProcess::MergedChannels);
+ builder.start(QString("/bin/bash %1 %2").arg(LOOG_FILE_ICON_PATH));
+ if (!builder.waitForFinished()) {
+ builder.close();
+ return "修复图标异常失败";
+ }
+ return QString::fromLocal8Bit(builder.readAllStandardOutput()).trimmed();
+}
diff --git a/deepin-fileicon-plugin/fileiconmodel.h b/deepin-fileicon-plugin/fileiconmodel.h
new file mode 100644
index 0000000..f60b705
--- /dev/null
+++ b/deepin-fileicon-plugin/fileiconmodel.h
@@ -0,0 +1,21 @@
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#pragma once
+
+#include
+
+class FileIconModel : public QObject
+{
+ Q_OBJECT
+public:
+ explicit FileIconModel(QObject *parent = nullptr);
+ ~FileIconModel();
+ QString resolveIconIssue();
+
+private:
+ void initData();
+
+private:
+};
diff --git a/deepin-fileicon-plugin/fileiconmodule.cpp b/deepin-fileicon-plugin/fileiconmodule.cpp
new file mode 100644
index 0000000..4d8668a
--- /dev/null
+++ b/deepin-fileicon-plugin/fileiconmodule.cpp
@@ -0,0 +1,79 @@
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "fileiconmodule.h"
+#include "fileiconmodel.h"
+#include "fileiconwidget.h"
+
+#include
+
+#include
+#include
+
+DWIDGET_USE_NAMESPACE
+DCORE_USE_NAMESPACE
+
+FileIconModule::FileIconModule()
+ : QObject()
+ , ToolBoxInterface()
+ , m_fileIconModel(nullptr)
+ , m_fileIconWidget(nullptr)
+{
+ QTranslator *translator = new QTranslator(this);
+ translator->load(QString("/usr/share/deepin-fileicon/translations/deepin-fileicon_%1.qm").arg(QLocale::system().name()));
+ QCoreApplication::installTranslator(translator);
+}
+
+FileIconModule::~FileIconModule()
+{
+}
+
+void FileIconModule::active()
+{
+ if (!m_fileIconModel) {
+ m_fileIconModel = new FileIconModel;
+ }
+ if (!m_fileIconWidget) {
+ m_fileIconWidget = new FileIconWidget(m_fileIconModel);
+ }
+
+ m_frameProxy->pushWidget(this, m_fileIconWidget);
+ m_fileIconWidget->setVisible(true);
+}
+
+const QString FileIconModule::name() const
+{
+ return "DEEPINFILEICON";
+}
+const QString FileIconModule::apptitle() const
+{
+ return tr("File icon anomaly repair");
+}
+const QString FileIconModule::apptip() const
+{
+ return tr("Resolves the issue of abnormal file icon display");
+}
+const QString FileIconModule::appsupporter() const
+{
+ return tr("Supported by UOS");
+}
+const QString FileIconModule::icon() const
+{
+ return "deepin-file-icon";
+}
+
+int FileIconModule::apptype() const
+{
+ return ToolBoxProxyInterface::Repair;
+}
+
+bool FileIconModule::enable() const
+{
+ return true;
+}
+
+bool FileIconModule::checkauth() const
+{
+ return false;
+}
diff --git a/deepin-fileicon-plugin/fileiconmodule.h b/deepin-fileicon-plugin/fileiconmodule.h
new file mode 100644
index 0000000..ff3f502
--- /dev/null
+++ b/deepin-fileicon-plugin/fileiconmodule.h
@@ -0,0 +1,53 @@
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#pragma once
+
+#include
+#include
+
+#include "interface/toolboxinterface.h"
+#include "interface/toolboxproxyinterface.h"
+
+namespace PCC_NAMESPACE {
+class ToolBoxInterface;
+class ToolBoxProxyInterface;
+} // namespace PCC_NAMESPACE
+
+using namespace PCC_NAMESPACE;
+
+class FileIconWidget;
+class FileIconModel;
+class FileIconModule : public QObject
+ , public ToolBoxInterface
+{
+ Q_OBJECT
+
+ Q_PLUGIN_METADATA(IID ToolBoxInterface_iid FILE "fileicon_settings.json")
+ Q_INTERFACES(PCC_NAMESPACE::ToolBoxInterface)
+
+public:
+ explicit FileIconModule();
+
+ ~FileIconModule() Q_DECL_OVERRIDE;
+
+ const QString name() const Q_DECL_OVERRIDE;
+ const QString apptitle() const Q_DECL_OVERRIDE;
+ const QString apptip() const Q_DECL_OVERRIDE;
+ const QString appsupporter() const Q_DECL_OVERRIDE;
+ const QString icon() const Q_DECL_OVERRIDE;
+ int apptype() const Q_DECL_OVERRIDE;
+ bool enable() const Q_DECL_OVERRIDE;
+ bool checkauth() const Q_DECL_OVERRIDE;
+
+private:
+ void onStatusChanged();
+
+public Q_SLOTS:
+ void active() Q_DECL_OVERRIDE;
+
+private:
+ FileIconModel *m_fileIconModel;
+ FileIconWidget *m_fileIconWidget;
+};
diff --git a/deepin-fileicon-plugin/fileiconwidget.cpp b/deepin-fileicon-plugin/fileiconwidget.cpp
new file mode 100644
index 0000000..95136eb
--- /dev/null
+++ b/deepin-fileicon-plugin/fileiconwidget.cpp
@@ -0,0 +1,97 @@
+// Copyright (C) 2019 ~ 2019 Deepin Technology Co., Ltd.
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "fileiconwidget.h"
+#include "fileiconmodel.h"
+
+#include
+#include
+#include
+
+#include
+
+FileIconWidget::FileIconWidget(FileIconModel *model, QWidget *parent)
+ : DFrame(parent)
+ , m_model(model)
+{
+ initUI();
+ connect(m_execButton, &DSuggestButton::clicked, this, &FileIconWidget::resolveIconIssue);
+}
+
+FileIconWidget::~FileIconWidget()
+{
+}
+
+void FileIconWidget::initUI()
+{
+ QVBoxLayout *layout = new QVBoxLayout(this);
+ layout->setSpacing(10);
+ layout->setContentsMargins(20, 20, 20, 20);
+ this->setLayout(layout);
+
+ QLabel *title = new QLabel(tr("File icon anomaly repair"), this);
+ QFont font1 = title->font();
+ font1.setBold(true);
+ font1.setWeight(QFont::DemiBold);
+ DFontSizeManager::instance()->bind(title, DFontSizeManager::T5);
+ title->setContentsMargins(10, 0, 0, 0);
+
+ QLabel *detailInfo = new QLabel(tr("Resolves the issue of abnormal file icon display"), this);
+ DFontSizeManager::instance()->bind(detailInfo, DFontSizeManager::T8);
+ detailInfo->setContentsMargins(10, 0, 0, 0);
+
+ QLabel *descriptionInfo = new QLabel(tr("Tool Description"), this);
+ DFontSizeManager::instance()->bind(descriptionInfo, DFontSizeManager::T8);
+ descriptionInfo->setContentsMargins(10, 0, 0, 0);
+
+ DTipLabel *tipLabel = new DTipLabel(tr("Resolves the issue of abnormal file icon display"), this);
+ DFontSizeManager::instance()->bind(tipLabel, DFontSizeManager::T8);
+ tipLabel->setContentsMargins(10, 0, 0, 0);
+ tipLabel->setAlignment(Qt::AlignLeft);
+
+ DFrame *textFrame = new DFrame(this);
+ QVBoxLayout *textLayout = new QVBoxLayout(textFrame);
+ textLayout->setContentsMargins(2, 2, 2, 2);
+ textLayout->setSpacing(0);
+ textFrame->setLayout(textLayout);
+
+ m_textEdit = new QTextEdit(textFrame);
+ m_textEdit->setFixedSize(QSize(900, 400));
+ m_textEdit->setLineWidth(0);
+ textLayout->addWidget(m_textEdit, 0, Qt::AlignCenter);
+
+ m_execButton = new DSuggestButton(this);
+ m_execButton->setFixedWidth(180);
+ m_execButton->setText(tr("Execute immediately"));
+
+ layout->addWidget(title);
+ layout->addWidget(detailInfo);
+ layout->addSpacing(10);
+ layout->addWidget(descriptionInfo);
+ layout->addWidget(tipLabel);
+ layout->addWidget(textFrame, 0, Qt::AlignCenter);
+ layout->addWidget(m_execButton, 0, Qt::AlignRight);
+ layout->addStretch();
+}
+
+void FileIconWidget::resolveIconIssue()
+{
+ DDialog *dlg = new DDialog(this);
+ dlg->setOnButtonClickedClose(true);
+ // 设置属性当关闭时候删除自己
+ dlg->setAttribute(Qt::WA_DeleteOnClose);
+ dlg->setIcon(QIcon::fromTheme("deepin-file-icon"));
+ dlg->setMessage(tr("The operation cannot be undone. Please confirm if you want to proceed?"));
+ dlg->addButton(tr("Cancel", "button"), false, DDialog::ButtonType::ButtonNormal);
+ dlg->addButton(tr("Continue"), false, DDialog::ButtonType::ButtonRecommend);
+
+ connect(dlg, &DDialog::buttonClicked, this, [&](int index, const QString &text) {
+ Q_UNUSED(text);
+ if (1 == index) {
+ m_textEdit->setText(m_model->resolveIconIssue());
+ }
+ });
+ dlg->exec();
+}
diff --git a/deepin-fileicon-plugin/fileiconwidget.h b/deepin-fileicon-plugin/fileiconwidget.h
new file mode 100644
index 0000000..7e147d8
--- /dev/null
+++ b/deepin-fileicon-plugin/fileiconwidget.h
@@ -0,0 +1,37 @@
+// Copyright (C) 2019 ~ 2019 Deepin Technology Co., Ltd.
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#pragma once
+
+#include
+#include
+#include
+
+#include
+#include
+#include
+#include
+
+DWIDGET_USE_NAMESPACE
+class FileIconModel;
+class FileIconWidget : public DFrame
+{
+ Q_OBJECT
+public:
+ explicit FileIconWidget(FileIconModel *model, QWidget *parent = nullptr);
+ ~FileIconWidget();
+
+private:
+ // 初始化界面
+ void initUI();
+
+public Q_SLOTS:
+ void resolveIconIssue();
+
+private:
+ FileIconModel *m_model;
+ QTextEdit *m_textEdit;
+ DSuggestButton *m_execButton;
+};
diff --git a/deepin-fileicon-plugin/icons/fileicon_icons.qrc b/deepin-fileicon-plugin/icons/fileicon_icons.qrc
new file mode 100644
index 0000000..7c6403f
--- /dev/null
+++ b/deepin-fileicon-plugin/icons/fileicon_icons.qrc
@@ -0,0 +1,5 @@
+
+
+ icons/deepin-file-icon.svg
+
+
diff --git a/deepin-fileicon-plugin/icons/icons/deepin-file-icon.svg b/deepin-fileicon-plugin/icons/icons/deepin-file-icon.svg
new file mode 100644
index 0000000..3069e7b
--- /dev/null
+++ b/deepin-fileicon-plugin/icons/icons/deepin-file-icon.svg
@@ -0,0 +1,72 @@
+
+
\ No newline at end of file
diff --git a/deepin-fileicon-plugin/translate_generation.sh b/deepin-fileicon-plugin/translate_generation.sh
new file mode 100644
index 0000000..6b67c53
--- /dev/null
+++ b/deepin-fileicon-plugin/translate_generation.sh
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+# SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+#
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+# this file is used to auto-generate .qm file from .ts file.
+# author: shibowen at linuxdeepin.com
+
+ts_list=($(ls translations/*.ts))
+
+for ts in "${ts_list[@]}"; do
+ printf "\nprocess ${ts}\n"
+ lrelease "${ts}"
+done
diff --git a/deepin-fileicon-plugin/translations/deepin-fileicon_en_US.ts b/deepin-fileicon-plugin/translations/deepin-fileicon_en_US.ts
new file mode 100644
index 0000000..bb1d8a5
--- /dev/null
+++ b/deepin-fileicon-plugin/translations/deepin-fileicon_en_US.ts
@@ -0,0 +1,67 @@
+
+
+
+
+ FileIconModule
+
+
+ File icon anomaly repair
+
+
+
+
+ Resolves the issue of abnormal file icon display
+
+
+
+
+ Supported by UOS
+
+
+
+
+ FileIconWidget
+
+
+ File icon anomaly repair
+
+
+
+
+
+ Resolves the issue of abnormal file icon display
+
+
+
+
+ Tool Description
+
+
+
+
+ Execute immediately
+
+
+
+
+ The operation cannot be undone. Please confirm if you want to proceed?
+
+
+
+
+ Cancel
+ button
+
+
+
+
+ Continue
+
+
+
+
+ Execute successful
+
+
+
+
diff --git a/deepin-fileicon-plugin/translations/deepin-fileicon_zh_CN.ts b/deepin-fileicon-plugin/translations/deepin-fileicon_zh_CN.ts
new file mode 100644
index 0000000..3ca7b8c
--- /dev/null
+++ b/deepin-fileicon-plugin/translations/deepin-fileicon_zh_CN.ts
@@ -0,0 +1,67 @@
+
+
+
+
+ FileIconModule
+
+
+ File icon anomaly repair
+ 文件图标异常修复
+
+
+
+ Resolves the issue of abnormal file icon display
+ 解决文件图标显示异常问题
+
+
+
+ Supported by UOS
+ 由UOS提供服务
+
+
+
+ FileIconWidget
+
+
+ File icon anomaly repair
+ 文件图标异常修复
+
+
+
+
+ Resolves the issue of abnormal file icon display
+ 解决文件图标显示异常问题
+
+
+
+ Tool Description
+ 工具描述
+
+
+
+ Execute immediately
+ 立即执行
+
+
+
+ The operation cannot be undone. Please confirm if you want to proceed?
+ 操作无法撤销,请确认是否继续执行?
+
+
+
+ Cancel
+ button
+ 取 消
+
+
+
+ Continue
+ 继续执行
+
+
+
+ Execute successful
+ 执行成功
+
+
+
diff --git a/deepin-filename-plugin/CMakeLists.txt b/deepin-filename-plugin/CMakeLists.txt
new file mode 100644
index 0000000..15c4fee
--- /dev/null
+++ b/deepin-filename-plugin/CMakeLists.txt
@@ -0,0 +1,46 @@
+cmake_minimum_required(VERSION 3.7)
+
+set(PLUGIN_NAME "deepin-filename")
+
+project(${PLUGIN_NAME})
+
+set(CMAKE_AUTOMOC ON)
+
+file(GLOB_RECURSE SRCS
+ "*.h"
+ "*.cpp")
+
+find_package(Qt5 COMPONENTS Core Widgets DBus Svg LinguistTools REQUIRED)
+find_package(PkgConfig REQUIRED)
+find_package(DtkWidget REQUIRED)
+
+pkg_check_modules(DFrameworkDBus REQUIRED dframeworkdbus)
+pkg_check_modules(QGSettings REQUIRED gsettings-qt)
+
+file(GLOB TS_FILES "translations/*.ts")
+qt5_add_translation(QM_FILES ${TS_FILES})
+add_custom_target(translationsfilename ALL DEPENDS ${QM_FILES})
+install(FILES ${QM_FILES} DESTINATION share/${PLUGIN_NAME}/translations)
+
+add_library(${PLUGIN_NAME} SHARED ${SRCS} icons/filename_icons.qrc)
+set_target_properties(${PLUGIN_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ./)
+target_include_directories(${PLUGIN_NAME} PUBLIC
+ ${Qt5Widgets_INCLUDE_DIRS}
+ ${Qt5Svg_INCLUDE_DIRS}
+ ${DtkWidget_INCLUDE_DIRS}
+ ${QGSettings_INCLUDE_DIRS}
+ ${Qt5DBus_INCLUDE_DIRS}
+ ../deepin-pc-manager/include/
+ )
+target_link_libraries(${PLUGIN_NAME} PRIVATE
+ ${Qt5Widgets_LIBRARIES}
+ ${Qt5Svg_LIBRARIES}
+ ${DtkWidget_LIBRARIES}
+ ${DFrameworkDBus_LIBRARIES}
+ ${QGSettings_LIBRARIES}
+ ${Qt5DBus_LIBRARIES}
+ )
+
+install(TARGETS ${PLUGIN_NAME} LIBRARY DESTINATION /usr/lib/deepin-pc-manager/modules)
+install(FILES icons/icons/deepin-file-name.svg DESTINATION /usr/share/icons/hicolor/scalable/apps)
+install(FILES ./loogfilename.sh DESTINATION /usr/share/deepin-pc-manager)
diff --git a/deepin-filename-plugin/filename_settings.json b/deepin-filename-plugin/filename_settings.json
new file mode 100644
index 0000000..dbc6b7b
--- /dev/null
+++ b/deepin-filename-plugin/filename_settings.json
@@ -0,0 +1,3 @@
+{
+ "api" : "1.0.0"
+}
\ No newline at end of file
diff --git a/deepin-filename-plugin/filenamemodel.cpp b/deepin-filename-plugin/filenamemodel.cpp
new file mode 100644
index 0000000..2662766
--- /dev/null
+++ b/deepin-filename-plugin/filenamemodel.cpp
@@ -0,0 +1,38 @@
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "filenamemodel.h"
+
+#include
+
+#define LOOG_FILE_NAME_DIR "/usr/share/deepin-pc-manager/"
+#define LOOG_FILE_NAME_PATH "/usr/share/deepin-pc-manager/loogfilename.sh"
+FileNameModel::FileNameModel(QObject *parent)
+ : QObject(parent)
+{
+ initData();
+}
+
+FileNameModel::~FileNameModel()
+{
+}
+
+// 初始化数据
+void FileNameModel::initData()
+{
+}
+
+QString FileNameModel::startLoogFileNameSupport()
+{
+ QProcess builder;
+ builder.setWorkingDirectory(LOOG_FILE_NAME_DIR);
+ builder.setProcessChannelMode(QProcess::MergedChannels);
+ builder.start(QString("/bin/bash %1 %2").arg(LOOG_FILE_NAME_PATH));
+ if (!builder.waitForFinished()) {
+ builder.close();
+ return "长文件名支持失败";
+ }
+
+ return QString::fromLocal8Bit(builder.readAllStandardOutput()).trimmed();
+}
diff --git a/deepin-filename-plugin/filenamemodel.h b/deepin-filename-plugin/filenamemodel.h
new file mode 100644
index 0000000..1db638e
--- /dev/null
+++ b/deepin-filename-plugin/filenamemodel.h
@@ -0,0 +1,22 @@
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#pragma once
+
+#include
+
+class FileNameModel : public QObject
+{
+ Q_OBJECT
+public:
+ explicit FileNameModel(QObject *parent = nullptr);
+ ~FileNameModel();
+
+ QString startLoogFileNameSupport();
+
+private:
+ void initData();
+
+private:
+};
diff --git a/deepin-filename-plugin/filenamemodule.cpp b/deepin-filename-plugin/filenamemodule.cpp
new file mode 100644
index 0000000..e891705
--- /dev/null
+++ b/deepin-filename-plugin/filenamemodule.cpp
@@ -0,0 +1,79 @@
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "filenamemodule.h"
+#include "filenamemodel.h"
+#include "filenamewidget.h"
+
+#include
+
+#include
+#include
+
+DWIDGET_USE_NAMESPACE
+DCORE_USE_NAMESPACE
+
+FileNameModule::FileNameModule()
+ : QObject()
+ , ToolBoxInterface()
+ , m_fileNameModel(nullptr)
+ , m_fileNameWidget(nullptr)
+{
+ QTranslator *translator = new QTranslator(this);
+ translator->load(QString("/usr/share/deepin-filename/translations/deepin-filename_%1.qm").arg(QLocale::system().name()));
+ QCoreApplication::installTranslator(translator);
+}
+
+FileNameModule::~FileNameModule()
+{
+}
+
+void FileNameModule::active()
+{
+ if (!m_fileNameModel) {
+ m_fileNameModel = new FileNameModel;
+ }
+ if (!m_fileNameWidget) {
+ m_fileNameWidget = new FileNameWidget(m_fileNameModel);
+ }
+
+ m_frameProxy->pushWidget(this, m_fileNameWidget);
+ m_fileNameWidget->setVisible(true);
+}
+
+const QString FileNameModule::name() const
+{
+ return "DEEPINFILENAME";
+}
+const QString FileNameModule::apptitle() const
+{
+ return tr("Long filename support");
+}
+const QString FileNameModule::apptip() const
+{
+ return tr("Extend file name length to 225 chinese characters");
+}
+const QString FileNameModule::appsupporter() const
+{
+ return tr("Supported by UOS");
+}
+const QString FileNameModule::icon() const
+{
+ return "deepin-file-name";
+}
+
+int FileNameModule::apptype() const
+{
+ return ToolBoxProxyInterface::System;
+}
+
+bool FileNameModule::enable() const
+{
+ return true;
+}
+
+bool FileNameModule::checkauth() const
+{
+ return false;
+}
diff --git a/deepin-filename-plugin/filenamemodule.h b/deepin-filename-plugin/filenamemodule.h
new file mode 100644
index 0000000..7798b67
--- /dev/null
+++ b/deepin-filename-plugin/filenamemodule.h
@@ -0,0 +1,53 @@
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#pragma once
+
+#include
+#include
+
+#include "interface/toolboxinterface.h"
+#include "interface/toolboxproxyinterface.h"
+
+namespace PCC_NAMESPACE {
+class ToolBoxInterface;
+class ToolBoxProxyInterface;
+} // namespace PCC_NAMESPACE
+
+using namespace PCC_NAMESPACE;
+
+class FileNameWidget;
+class FileNameModel;
+class FileNameModule : public QObject
+ , public ToolBoxInterface
+{
+ Q_OBJECT
+
+ Q_PLUGIN_METADATA(IID ToolBoxInterface_iid FILE "filename_settings.json")
+ Q_INTERFACES(PCC_NAMESPACE::ToolBoxInterface)
+
+public:
+ explicit FileNameModule();
+
+ ~FileNameModule() Q_DECL_OVERRIDE;
+
+ const QString name() const Q_DECL_OVERRIDE;
+ const QString apptitle() const Q_DECL_OVERRIDE;
+ const QString apptip() const Q_DECL_OVERRIDE;
+ const QString appsupporter() const Q_DECL_OVERRIDE;
+ const QString icon() const Q_DECL_OVERRIDE;
+ int apptype() const Q_DECL_OVERRIDE;
+ bool enable() const Q_DECL_OVERRIDE;
+ bool checkauth() const Q_DECL_OVERRIDE;
+
+private:
+ void onStatusChanged();
+
+public Q_SLOTS:
+ void active() Q_DECL_OVERRIDE;
+
+private:
+ FileNameModel *m_fileNameModel;
+ FileNameWidget *m_fileNameWidget;
+};
diff --git a/deepin-filename-plugin/filenamewidget.cpp b/deepin-filename-plugin/filenamewidget.cpp
new file mode 100644
index 0000000..5d8a9aa
--- /dev/null
+++ b/deepin-filename-plugin/filenamewidget.cpp
@@ -0,0 +1,112 @@
+// Copyright (C) 2019 ~ 2019 Deepin Technology Co., Ltd.
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "filenamewidget.h"
+#include "filenamemodel.h"
+
+#include
+#include
+#include
+#include
+#include
+
+#include
+
+FileNameWidget::FileNameWidget(FileNameModel *model, QWidget *parent)
+ : DFrame(parent)
+ , m_model(model)
+ , m_textEdit(nullptr)
+ , m_execButton(nullptr)
+{
+ initUI();
+ connect(m_execButton, &DSuggestButton::clicked, this, &FileNameWidget::supportLoogFileName);
+}
+
+FileNameWidget::~FileNameWidget()
+{
+}
+
+void FileNameWidget::initUI()
+{
+ QVBoxLayout *layout = new QVBoxLayout(this);
+ layout->setSpacing(10);
+ layout->setContentsMargins(20, 20, 20, 20);
+ this->setLayout(layout);
+
+ QLabel *title = new QLabel(tr("Long filename support"), this);
+ QFont font1 = title->font();
+ font1.setBold(true);
+ font1.setWeight(QFont::DemiBold);
+ DFontSizeManager::instance()->bind(title, DFontSizeManager::T5);
+ title->setFont(font1);
+ title->setContentsMargins(10, 0, 0, 0);
+
+ QLabel *detailInfo = new QLabel(tr("Extend file name length to 225 chinese characters"), this);
+ DFontSizeManager::instance()->bind(detailInfo, DFontSizeManager::T8);
+ detailInfo->setContentsMargins(10, 0, 0, 0);
+
+ QLabel *descriptionInfo = new QLabel(tr("Tool Description"), this);
+ DFontSizeManager::instance()->bind(descriptionInfo, DFontSizeManager::T8);
+ descriptionInfo->setContentsMargins(10, 0, 0, 0);
+
+ DTipLabel *tipLabel = new DTipLabel(tr("Extend the maximum filename length to 255 Chinese characters, only supported on UOS1060 and above systems."), this);
+ DFontSizeManager::instance()->bind(tipLabel, DFontSizeManager::T8);
+ tipLabel->setContentsMargins(10, 0, 0, 0);
+ tipLabel->setAlignment(Qt::AlignLeft);
+
+ DFrame *textFrame = new DFrame(this);
+ QVBoxLayout *textLayout = new QVBoxLayout(textFrame);
+ textLayout->setContentsMargins(2, 2, 2, 2);
+ textLayout->setSpacing(0);
+ textFrame->setLayout(textLayout);
+
+ m_textEdit = new QTextEdit(textFrame);
+ m_textEdit->setFixedSize(QSize(900, 400));
+ m_textEdit->setLineWidth(0);
+ textLayout->addWidget(m_textEdit, 0, Qt::AlignCenter);
+
+ m_execButton = new DSuggestButton(this);
+ m_execButton->setFixedWidth(180);
+ m_execButton->setText(tr("Execute immediately"));
+
+ layout->addWidget(title);
+ layout->addWidget(detailInfo);
+ layout->addSpacing(10);
+ layout->addWidget(descriptionInfo);
+ layout->addWidget(tipLabel);
+ layout->addWidget(textFrame, 0, Qt::AlignCenter);
+ layout->addWidget(m_execButton, 0, Qt::AlignRight);
+ layout->addStretch();
+}
+
+void FileNameWidget::supportLoogFileName()
+{
+ DDialog *dlg = new DDialog(this);
+ dlg->setOnButtonClickedClose(true);
+ // 设置属性当关闭时候删除自己
+ dlg->setAttribute(Qt::WA_DeleteOnClose);
+ dlg->setIcon(QIcon::fromTheme("deepin-file-name"));
+ dlg->setMessage(tr("The operation cannot be undone. Please confirm if you want to proceed?"));
+ dlg->addButton(tr("Cancel", "button"), false, DDialog::ButtonType::ButtonNormal);
+ dlg->addButton(tr("Continue"), false, DDialog::ButtonType::ButtonRecommend);
+
+ connect(dlg, &DDialog::buttonClicked, this, [&](int index, const QString &text) {
+ Q_UNUSED(text);
+ if (1 == index) {
+ QString result = m_model->startLoogFileNameSupport();
+ m_textEdit->setText(result);
+
+ if (result.contains("true")) {
+ DFloatingMessage *floMsgSwitchOff = new DFloatingMessage(DFloatingMessage::TransientType);
+ floMsgSwitchOff->setDuration(2000);
+ floMsgSwitchOff->setIcon(QIcon::fromTheme("dcc_ok_tip"));
+ floMsgSwitchOff->setMessage(tr("Long filename support enabled, effective after restarting the computer"));
+ DMessageManager::instance()->sendMessage(this, floMsgSwitchOff);
+ DMessageManager::instance()->setContentMargens(this, QMargins(0, 0, 0, 20));
+ }
+ }
+ });
+ dlg->exec();
+}
diff --git a/deepin-filename-plugin/filenamewidget.h b/deepin-filename-plugin/filenamewidget.h
new file mode 100644
index 0000000..dd91dac
--- /dev/null
+++ b/deepin-filename-plugin/filenamewidget.h
@@ -0,0 +1,37 @@
+// Copyright (C) 2019 ~ 2019 Deepin Technology Co., Ltd.
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#pragma once
+
+#include
+#include
+#include
+
+#include
+#include
+#include
+#include
+
+DWIDGET_USE_NAMESPACE
+class FileNameModel;
+class FileNameWidget : public DFrame
+{
+ Q_OBJECT
+public:
+ explicit FileNameWidget(FileNameModel *model, QWidget *parent = nullptr);
+ ~FileNameWidget();
+
+private:
+ // 初始化界面
+ void initUI();
+
+public Q_SLOTS:
+ void supportLoogFileName();
+
+private:
+ FileNameModel *m_model;
+ QTextEdit *m_textEdit;
+ DSuggestButton *m_execButton;
+};
diff --git a/deepin-filename-plugin/icons/filename_icons.qrc b/deepin-filename-plugin/icons/filename_icons.qrc
new file mode 100644
index 0000000..cf27cab
--- /dev/null
+++ b/deepin-filename-plugin/icons/filename_icons.qrc
@@ -0,0 +1,5 @@
+
+
+ icons/deepin-file-name.svg
+
+
diff --git a/deepin-filename-plugin/icons/icons/deepin-file-name.svg b/deepin-filename-plugin/icons/icons/deepin-file-name.svg
new file mode 100644
index 0000000..8d56e7b
--- /dev/null
+++ b/deepin-filename-plugin/icons/icons/deepin-file-name.svg
@@ -0,0 +1,52 @@
+
+
\ No newline at end of file
diff --git a/deepin-filename-plugin/loogfilename.sh b/deepin-filename-plugin/loogfilename.sh
new file mode 100644
index 0000000..4dea9c6
--- /dev/null
+++ b/deepin-filename-plugin/loogfilename.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+# SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+#
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+echo '操作开始'
+dde-dconfig --set -a org.deepin.dde.file-manager -r org.deepin.dde.file-manager -k dfm.mount.dlnfs -v true
+echo 'dde-dconfig 配置完成'
+echo '操作完成,dlnfs状态:'`dde-dconfig --get -a org.deepin.dde.file-manager -r org.deepin.dde.file-manager -k dfm.mount.dlnfs`
+echo '已打开长文件名支持,重启电脑后生效'
\ No newline at end of file
diff --git a/deepin-filename-plugin/translate_generation.sh b/deepin-filename-plugin/translate_generation.sh
new file mode 100644
index 0000000..6b67c53
--- /dev/null
+++ b/deepin-filename-plugin/translate_generation.sh
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+# SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+#
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+# this file is used to auto-generate .qm file from .ts file.
+# author: shibowen at linuxdeepin.com
+
+ts_list=($(ls translations/*.ts))
+
+for ts in "${ts_list[@]}"; do
+ printf "\nprocess ${ts}\n"
+ lrelease "${ts}"
+done
diff --git a/deepin-filename-plugin/translations/deepin-filename_en_US.ts b/deepin-filename-plugin/translations/deepin-filename_en_US.ts
new file mode 100644
index 0000000..83bb03f
--- /dev/null
+++ b/deepin-filename-plugin/translations/deepin-filename_en_US.ts
@@ -0,0 +1,72 @@
+
+
+
+
+ FileNameModule
+
+
+ Long filename support
+
+
+
+
+ Extend file name length to 225 chinese characters
+
+
+
+
+ Supported by UOS
+
+
+
+
+ FileNameWidget
+
+
+ Long filename support
+
+
+
+
+ Extend file name length to 225 chinese characters
+
+
+
+
+ Tool Description
+
+
+
+
+ Extend the maximum filename length to 255 Chinese characters, only supported on UOS1060 and above systems.
+
+
+
+
+ Execute immediately
+
+
+
+
+ The operation cannot be undone. Please confirm if you want to proceed?
+
+
+
+
+ Cancel
+ button
+
+
+
+
+ Continue
+
+
+
+
+
+ Long filename support enabled, effective after restarting the computer
+
+
+
+
diff --git a/deepin-filename-plugin/translations/deepin-filename_zh_CN.ts b/deepin-filename-plugin/translations/deepin-filename_zh_CN.ts
new file mode 100644
index 0000000..7cbde34
--- /dev/null
+++ b/deepin-filename-plugin/translations/deepin-filename_zh_CN.ts
@@ -0,0 +1,72 @@
+
+
+
+
+ FileNameModule
+
+
+ Long filename support
+ 长文件名支持
+
+
+
+ Extend file name length to 225 chinese characters
+ 将文件名长度扩展到225个中文字符
+
+
+
+ Supported by UOS
+ 由UOS提供服务
+
+
+
+ FileNameWidget
+
+
+ Long filename support
+ 长文件名支持
+
+
+
+ Extend file name length to 225 chinese characters
+ 将文件名长度扩展到225个中文字符
+
+
+
+ Tool Description
+ 工具描述
+
+
+
+ Extend the maximum filename length to 255 Chinese characters, only supported on UOS1060 and above systems.
+ 将文件名最大长度扩展至255个中文字符,仅支持UOS1060及以上系统
+
+
+
+ Execute immediately
+ 立即执行
+
+
+
+ The operation cannot be undone. Please confirm if you want to proceed?
+ 操作无法撤销,请确认是否继续执行?
+
+
+
+ Cancel
+ button
+ 取 消
+
+
+
+ Continue
+ 继续执行
+
+
+
+
+ Long filename support enabled, effective after restarting the computer
+ 已打开长文件名支持,重启电脑后生效
+
+
+
diff --git a/deepin-hostmodify-plugin/CMakeLists.txt b/deepin-hostmodify-plugin/CMakeLists.txt
new file mode 100644
index 0000000..7d6b34f
--- /dev/null
+++ b/deepin-hostmodify-plugin/CMakeLists.txt
@@ -0,0 +1,45 @@
+cmake_minimum_required(VERSION 3.7)
+
+set(PLUGIN_NAME "deepin-hostmodify")
+
+project(${PLUGIN_NAME})
+
+set(CMAKE_AUTOMOC ON)
+
+file(GLOB_RECURSE SRCS
+ "*.h"
+ "*.cpp")
+
+find_package(Qt5 COMPONENTS Core Widgets DBus Svg LinguistTools REQUIRED)
+find_package(PkgConfig REQUIRED)
+find_package(DtkWidget REQUIRED)
+
+pkg_check_modules(DFrameworkDBus REQUIRED dframeworkdbus)
+pkg_check_modules(QGSettings REQUIRED gsettings-qt)
+
+file(GLOB TS_FILES "translations/*.ts")
+qt5_add_translation(QM_FILES ${TS_FILES})
+add_custom_target(translationshostmodify ALL DEPENDS ${QM_FILES})
+install(FILES ${QM_FILES} DESTINATION share/${PLUGIN_NAME}/translations)
+
+add_library(${PLUGIN_NAME} SHARED ${SRCS} icons/hostmodify_icons.qrc)
+set_target_properties(${PLUGIN_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ./)
+target_include_directories(${PLUGIN_NAME} PUBLIC
+ ${Qt5Widgets_INCLUDE_DIRS}
+ ${Qt5Svg_INCLUDE_DIRS}
+ ${DtkWidget_INCLUDE_DIRS}
+ ${QGSettings_INCLUDE_DIRS}
+ ${Qt5DBus_INCLUDE_DIRS}
+ ../deepin-pc-manager/include/
+ )
+target_link_libraries(${PLUGIN_NAME} PRIVATE
+ ${Qt5Widgets_LIBRARIES}
+ ${Qt5Svg_LIBRARIES}
+ ${DtkWidget_LIBRARIES}
+ ${DFrameworkDBus_LIBRARIES}
+ ${QGSettings_LIBRARIES}
+ ${Qt5DBus_LIBRARIES}
+ )
+
+install(TARGETS ${PLUGIN_NAME} LIBRARY DESTINATION /usr/lib/deepin-pc-manager/modules)
+install(FILES icons/icons/deepin-host-modify.svg DESTINATION /usr/share/icons/hicolor/scalable/apps)
diff --git a/deepin-hostmodify-plugin/hostmodify_settings.json b/deepin-hostmodify-plugin/hostmodify_settings.json
new file mode 100644
index 0000000..dbc6b7b
--- /dev/null
+++ b/deepin-hostmodify-plugin/hostmodify_settings.json
@@ -0,0 +1,3 @@
+{
+ "api" : "1.0.0"
+}
\ No newline at end of file
diff --git a/deepin-hostmodify-plugin/hostmodifymodel.cpp b/deepin-hostmodify-plugin/hostmodifymodel.cpp
new file mode 100644
index 0000000..db28777
--- /dev/null
+++ b/deepin-hostmodify-plugin/hostmodifymodel.cpp
@@ -0,0 +1,46 @@
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "hostmodifymodel.h"
+#include "invokers/invokerfactory.h"
+
+#include
+
+HostModifyModel::HostModifyModel(QObject *parent)
+ : QObject(parent)
+ , m_sysetemDaemonInvokerInter(nullptr)
+{
+ initData();
+}
+
+HostModifyModel::~HostModifyModel()
+{
+}
+
+// 初始化数据
+void HostModifyModel::initData()
+{
+ m_sysetemDaemonInvokerInter = InvokerFactory::GetInstance().CreateInvoker("com.deepin.pc.manager.system.daemon",
+ "/com/deepin/pc/manager/system/daemon",
+ "com.deepin.pc.manager.system.daemon",
+ ConnectType::SYSTEM,
+ this);
+}
+
+// 获取hosts文件信息
+QString HostModifyModel::getHostsFileInfo()
+{
+ QProcess proc;
+ proc.start("cat /etc/hosts");
+ proc.waitForStarted(-1);
+ proc.waitForFinished(-1);
+ m_hostInfo = proc.readAllStandardOutput();
+ return m_hostInfo;
+}
+
+void HostModifyModel::saveHostFile(QString host)
+{
+ m_hostInfo = host;
+ DBUS_NOBLOCK_INVOKE(m_sysetemDaemonInvokerInter, "ReplaceHostFile", host);
+}
diff --git a/deepin-hostmodify-plugin/hostmodifymodel.h b/deepin-hostmodify-plugin/hostmodifymodel.h
new file mode 100644
index 0000000..b19d4ea
--- /dev/null
+++ b/deepin-hostmodify-plugin/hostmodifymodel.h
@@ -0,0 +1,30 @@
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#pragma once
+
+#include
+
+class DBusInvokerInterface;
+class HostModifyModel : public QObject
+{
+ Q_OBJECT
+public:
+ explicit HostModifyModel(QObject *parent = nullptr);
+ ~HostModifyModel();
+
+ QString getDefaultHostInfo() { return m_hostInfo; }
+ // 获取hosts文件信息
+ QString getHostsFileInfo();
+
+ void saveHostFile(QString host);
+
+private:
+ void initData();
+
+private:
+ DBusInvokerInterface *m_sysetemDaemonInvokerInter;
+
+ QString m_hostInfo;
+};
diff --git a/deepin-hostmodify-plugin/hostmodifymodule.cpp b/deepin-hostmodify-plugin/hostmodifymodule.cpp
new file mode 100644
index 0000000..66289ab
--- /dev/null
+++ b/deepin-hostmodify-plugin/hostmodifymodule.cpp
@@ -0,0 +1,79 @@
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "hostmodifymodule.h"
+#include "hostmodifymodel.h"
+#include "hostmodifywidget.h"
+
+#include
+
+#include
+#include
+
+DWIDGET_USE_NAMESPACE
+DCORE_USE_NAMESPACE
+
+HostModifyModule::HostModifyModule()
+ : QObject()
+ , ToolBoxInterface()
+ , m_hostModifyModel(nullptr)
+ , m_hostModifyWidget(nullptr)
+{
+ QTranslator *translator = new QTranslator(this);
+ translator->load(QString("/usr/share/deepin-hostmodify/translations/deepin-hostmodify_%1.qm").arg(QLocale::system().name()));
+ QCoreApplication::installTranslator(translator);
+}
+
+HostModifyModule::~HostModifyModule()
+{
+}
+
+void HostModifyModule::active()
+{
+ if (!m_hostModifyModel) {
+ m_hostModifyModel = new HostModifyModel;
+ }
+ if (!m_hostModifyWidget) {
+ m_hostModifyWidget = new HostModifyWidget(m_hostModifyModel);
+ }
+
+ m_frameProxy->pushWidget(this, m_hostModifyWidget);
+ m_hostModifyWidget->setVisible(true);
+}
+
+const QString HostModifyModule::name() const
+{
+ return "DEEPINHOSTMODIFY";
+}
+const QString HostModifyModule::apptitle() const
+{
+ return tr("Hosts configuration modification");
+}
+const QString HostModifyModule::apptip() const
+{
+ return tr("Manually modify hosts file");
+}
+const QString HostModifyModule::appsupporter() const
+{
+ return tr("Supported by UOS");
+}
+const QString HostModifyModule::icon() const
+{
+ return "deepin-host-modify";
+}
+
+int HostModifyModule::apptype() const
+{
+ return ToolBoxProxyInterface::Network;
+}
+
+bool HostModifyModule::enable() const
+{
+ return true;
+}
+
+bool HostModifyModule::checkauth() const
+{
+ return true;
+}
diff --git a/deepin-hostmodify-plugin/hostmodifymodule.h b/deepin-hostmodify-plugin/hostmodifymodule.h
new file mode 100644
index 0000000..3d7b69d
--- /dev/null
+++ b/deepin-hostmodify-plugin/hostmodifymodule.h
@@ -0,0 +1,53 @@
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#pragma once
+
+#include
+#include
+
+#include "interface/toolboxinterface.h"
+#include "interface/toolboxproxyinterface.h"
+
+namespace PCC_NAMESPACE {
+class ToolBoxInterface;
+class ToolBoxProxyInterface;
+} // namespace PCC_NAMESPACE
+
+using namespace PCC_NAMESPACE;
+
+class HostModifyWidget;
+class HostModifyModel;
+class HostModifyModule : public QObject
+ , public ToolBoxInterface
+{
+ Q_OBJECT
+
+ Q_PLUGIN_METADATA(IID ToolBoxInterface_iid FILE "hostmodify_settings.json")
+ Q_INTERFACES(PCC_NAMESPACE::ToolBoxInterface)
+
+public:
+ explicit HostModifyModule();
+
+ ~HostModifyModule() Q_DECL_OVERRIDE;
+
+ const QString name() const Q_DECL_OVERRIDE;
+ const QString apptitle() const Q_DECL_OVERRIDE;
+ const QString apptip() const Q_DECL_OVERRIDE;
+ const QString appsupporter() const Q_DECL_OVERRIDE;
+ const QString icon() const Q_DECL_OVERRIDE;
+ int apptype() const Q_DECL_OVERRIDE;
+ bool enable() const Q_DECL_OVERRIDE;
+ bool checkauth() const Q_DECL_OVERRIDE;
+
+private:
+ void onStatusChanged();
+
+public Q_SLOTS:
+ void active() Q_DECL_OVERRIDE;
+
+private:
+ HostModifyModel *m_hostModifyModel;
+ HostModifyWidget *m_hostModifyWidget;
+};
diff --git a/deepin-hostmodify-plugin/hostmodifywidget.cpp b/deepin-hostmodify-plugin/hostmodifywidget.cpp
new file mode 100644
index 0000000..dbf5b76
--- /dev/null
+++ b/deepin-hostmodify-plugin/hostmodifywidget.cpp
@@ -0,0 +1,119 @@
+// Copyright (C) 2019 ~ 2019 Deepin Technology Co., Ltd.
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "hostmodifywidget.h"
+#include "hostmodifymodel.h"
+
+#include
+#include
+#include
+#include
+#include
+
+HostModifyWidget::HostModifyWidget(HostModifyModel *model, QWidget *parent)
+ : DFrame(parent)
+ , m_model(model)
+ , m_textEdit(nullptr)
+ , m_resetButton(nullptr)
+ , m_saveButton(nullptr)
+{
+ initUI();
+
+ m_textEdit->setText(m_model->getHostsFileInfo());
+ connect(m_textEdit, &QTextEdit::textChanged, this, &HostModifyWidget::acceptTextChanged);
+ connect(m_resetButton, &QPushButton::clicked, this, &HostModifyWidget::resetHostFile);
+ connect(m_saveButton, &DSuggestButton::clicked, this, &HostModifyWidget::saveHostFile);
+}
+
+HostModifyWidget::~HostModifyWidget()
+{
+}
+
+void HostModifyWidget::initUI()
+{
+ QVBoxLayout *layout = new QVBoxLayout(this);
+ layout->setSpacing(10);
+ layout->setContentsMargins(20, 20, 20, 20);
+ this->setLayout(layout);
+
+ QLabel *title = new QLabel(tr("Hosts configuration modification"), this);
+ QFont font1 = title->font();
+ font1.setBold(true);
+ font1.setWeight(QFont::DemiBold);
+ title->setFont(font1);
+ DFontSizeManager::instance()->bind(title, DFontSizeManager::T5);
+ title->setContentsMargins(0, 0, 0, 0);
+ title->setContentsMargins(10, 0, 0, 0);
+
+ QLabel *detailInfo = new QLabel(tr("Manually modify hosts file"), this);
+ DFontSizeManager::instance()->bind(detailInfo, DFontSizeManager::T8);
+ detailInfo->setContentsMargins(0, 0, 0, 0);
+ detailInfo->setContentsMargins(10, 0, 0, 0);
+
+ DFrame *textFrame = new DFrame(this);
+ QVBoxLayout *textLayout = new QVBoxLayout(textFrame);
+ textLayout->setContentsMargins(2, 2, 2, 2);
+ textLayout->setSpacing(0);
+ textFrame->setLayout(textLayout);
+
+ m_textEdit = new QTextEdit(textFrame);
+ m_textEdit->setFixedSize(QSize(900, 400));
+ m_textEdit->setLineWidth(0);
+ textLayout->addWidget(m_textEdit, 0, Qt::AlignCenter);
+
+ layout->addWidget(title);
+ layout->addWidget(detailInfo);
+ layout->addWidget(textFrame, 0, Qt::AlignCenter);
+
+ QHBoxLayout *btnLayout = new QHBoxLayout;
+ btnLayout->setContentsMargins(0, 0, 0, 0);
+ btnLayout->setSpacing(10);
+ m_resetButton = new DPushButton(this);
+ m_resetButton->setFixedWidth(150);
+ m_resetButton->setText(tr("Reset"));
+ m_saveButton = new DSuggestButton(this);
+ m_saveButton->setFixedWidth(150);
+ m_saveButton->setText(tr("Save"));
+
+ m_resetButton->setEnabled(false);
+ m_saveButton->setEnabled(false);
+ btnLayout->addStretch();
+ btnLayout->addWidget(m_resetButton, 0, Qt::AlignRight);
+ btnLayout->addWidget(m_saveButton, 0, Qt::AlignRight);
+ layout->addLayout(btnLayout);
+}
+
+void HostModifyWidget::acceptTextChanged()
+{
+ QString sDefaultInfo = m_model->getDefaultHostInfo();
+ QString sCurrentInfo = m_textEdit->toPlainText();
+
+ if (sDefaultInfo != sCurrentInfo) {
+ m_resetButton->setEnabled(true);
+ m_saveButton->setEnabled(true);
+ } else {
+ m_resetButton->setEnabled(false);
+ m_saveButton->setEnabled(false);
+ }
+}
+
+void HostModifyWidget::resetHostFile()
+{
+ m_textEdit->setText(m_model->getDefaultHostInfo());
+}
+void HostModifyWidget::saveHostFile()
+{
+ m_model->saveHostFile(m_textEdit->toPlainText());
+
+ m_resetButton->setEnabled(false);
+ m_saveButton->setEnabled(false);
+
+ DFloatingMessage *floMsgSwitchOff = new DFloatingMessage(DFloatingMessage::TransientType);
+ floMsgSwitchOff->setDuration(2000);
+ floMsgSwitchOff->setIcon(QIcon::fromTheme("dcc_ok_tip"));
+ floMsgSwitchOff->setMessage(tr("Save successful"));
+ DMessageManager::instance()->sendMessage(this, floMsgSwitchOff);
+ DMessageManager::instance()->setContentMargens(this, QMargins(0, 0, 0, 20));
+}
diff --git a/deepin-hostmodify-plugin/hostmodifywidget.h b/deepin-hostmodify-plugin/hostmodifywidget.h
new file mode 100644
index 0000000..ca3eab1
--- /dev/null
+++ b/deepin-hostmodify-plugin/hostmodifywidget.h
@@ -0,0 +1,41 @@
+// Copyright (C) 2019 ~ 2019 Deepin Technology Co., Ltd.
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#pragma once
+
+#include
+#include
+#include
+
+#include
+#include
+#include
+#include
+
+DWIDGET_USE_NAMESPACE
+class HostModifyModel;
+class HostModifyWidget : public DFrame
+{
+ Q_OBJECT
+public:
+ explicit HostModifyWidget(HostModifyModel *model, QWidget *parent = nullptr);
+ ~HostModifyWidget();
+
+private:
+ // 初始化界面
+ void initUI();
+
+public Q_SLOTS:
+ void acceptTextChanged();
+ void resetHostFile();
+ void saveHostFile();
+
+private:
+ HostModifyModel *m_model;
+ QTextEdit *m_textEdit;
+
+ DPushButton *m_resetButton;
+ DSuggestButton *m_saveButton;
+};
diff --git a/deepin-hostmodify-plugin/icons/hostmodify_icons.qrc b/deepin-hostmodify-plugin/icons/hostmodify_icons.qrc
new file mode 100644
index 0000000..eac3316
--- /dev/null
+++ b/deepin-hostmodify-plugin/icons/hostmodify_icons.qrc
@@ -0,0 +1,6 @@
+
+
+ icons/deepin-host-modify.svg
+ icons/dcc_ok_tip_20px.svg
+
+
diff --git a/deepin-pc-manager/src/window/icons/icons/dcc_antiav_normal_20px.svg b/deepin-hostmodify-plugin/icons/icons/dcc_ok_tip_20px.svg
similarity index 100%
rename from deepin-pc-manager/src/window/icons/icons/dcc_antiav_normal_20px.svg
rename to deepin-hostmodify-plugin/icons/icons/dcc_ok_tip_20px.svg
diff --git a/deepin-hostmodify-plugin/icons/icons/deepin-host-modify.svg b/deepin-hostmodify-plugin/icons/icons/deepin-host-modify.svg
new file mode 100644
index 0000000..84c264b
--- /dev/null
+++ b/deepin-hostmodify-plugin/icons/icons/deepin-host-modify.svg
@@ -0,0 +1,34 @@
+
+
\ No newline at end of file
diff --git a/deepin-hostmodify-plugin/invokers/dbusinvoker.cpp b/deepin-hostmodify-plugin/invokers/dbusinvoker.cpp
new file mode 100644
index 0000000..58219a5
--- /dev/null
+++ b/deepin-hostmodify-plugin/invokers/dbusinvoker.cpp
@@ -0,0 +1,104 @@
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "dbusinvoker.h"
+
+#include
+#include
+
+DBusInvoker::DBusInvoker(const QString &service,
+ const QString &path,
+ const QString &interface,
+ ConnectType type,
+ QObject *parent)
+ : QObject(parent)
+ , m_service(service)
+ , m_path(path)
+ , m_interface(interface)
+ , m_type(type)
+ , m_connection(QDBusConnection::sessionBus())
+{
+ if (SYSTEM == m_type) {
+ m_connection = QDBusConnection::systemBus();
+ }
+}
+
+// signal-slot connection
+bool DBusInvoker::Connect(const QString &signal, QObject *reciver, const char *slot)
+{
+ bool connectRst = false;
+ connectRst = m_connection.connect(m_service, m_path, m_interface, signal, reciver, slot);
+ if (!connectRst) {
+ qCritical() << "signal connect failed : " << signal << "for reason ["
+ << m_connection.lastError().message() << "]";
+ }
+ Q_ASSERT(connectRst);
+ return connectRst;
+}
+
+// signal-slot disconnection
+bool DBusInvoker::Disconnect(const QString &signal, QObject *reciver, const char *slot)
+{
+ bool disconnectRst = false;
+ disconnectRst = m_connection.disconnect(m_service, m_path, m_interface, signal, reciver, slot);
+ if (!disconnectRst) {
+ qCritical() << "signal disconnect failed : " << signal << "for reason ["
+ << m_connection.lastError().message() << "]";
+ }
+ Q_ASSERT(disconnectRst);
+ return disconnectRst;
+}
+
+DBusInvoker::~DBusInvoker()
+{
+ // 确保在调用delete时,释放自身成员对象
+ deleteLater();
+}
+
+// create method call or signal emit
+// invoke like this :
+// invoker->Connect("signalFunc", this, SLOT(slotFunc(bool, QString)));
+// there would be param type validate when signal emitted
+QDBusMessage DBusInvoker::Invoke(const QString &name,
+ const QList &functionParams,
+ BlockMode mode)
+{
+ if (name.isEmpty()) {
+ return QDBusMessage::createError(QDBusError::InvalidArgs, QString("name.isEmpty"));
+ }
+
+ QDBusMessage msg;
+ if (DBUS_PROPERTY_INVOKER_NAME == name) {
+ if (functionParams.isEmpty()) {
+ return QDBusMessage::createError(QDBusError::InvalidArgs,
+ QString("property not exist"));
+ }
+
+ msg = QDBusMessage::createMethodCall(m_service,
+ m_path,
+ "org.freedesktop.DBus.Properties",
+ "Get");
+ msg.setArguments({m_interface, functionParams.first().toString()});
+
+ QDBusMessage retMsg = m_connection.call(msg, QDBus::CallMode(mode));
+ return retMsg;
+ }
+
+ msg = QDBusMessage::createMethodCall(m_service, m_path, m_interface, name);
+ msg.setArguments(functionParams);
+
+ return m_connection.call(msg, QDBus::CallMode(mode));
+}
+
+// emit signal
+bool DBusInvoker::EmitSignal(const QString &name, const QList &arguments)
+{
+ if (name.isEmpty()) {
+ return false;
+ }
+
+ QDBusMessage signal = QDBusMessage::createSignal(m_path, m_interface, name);
+ signal.setArguments(arguments);
+ return m_connection.send(signal);
+}
diff --git a/deepin-hostmodify-plugin/invokers/dbusinvoker.h b/deepin-hostmodify-plugin/invokers/dbusinvoker.h
new file mode 100644
index 0000000..d1a8ab9
--- /dev/null
+++ b/deepin-hostmodify-plugin/invokers/dbusinvoker.h
@@ -0,0 +1,48 @@
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#ifndef DBUS_INVOKER_H
+#define DBUS_INVOKER_H
+
+#include "invokerinterface.h"
+
+#include
+#include
+
+// 公共dbus接口类
+#define DBUS_PROPERTY_INVOKER_NAME "dbusPropertyInvoker" // 公共dbus接口属性获取识别
+// interface
+class DBusInvoker : public QObject
+ , public DBusInvokerInterface
+{
+ Q_OBJECT
+public:
+ DBusInvoker(const QString &service,
+ const QString &path,
+ const QString &interface,
+ ConnectType type = ConnectType::SESSION,
+ QObject *parent = nullptr);
+
+ virtual QDBusMessage Invoke(const QString &name,
+ const QList &functionParams = QList(),
+ BlockMode mode = BlockMode::BLOCKWITHGUI) override;
+ virtual bool EmitSignal(const QString &name,
+ const QList &arguments = QList()) override;
+ virtual bool Connect(const QString &signal, QObject *reciver, const char *slot) override;
+ virtual bool Disconnect(const QString &signal, QObject *reciver, const char *slot) override;
+ virtual ~DBusInvoker() override;
+
+private:
+ QString m_service;
+ QString m_path;
+ QString m_interface;
+ ConnectType m_type;
+ QDBusConnection m_connection;
+
+private:
+ DBusInvoker(const DBusInvoker &);
+ DBusInvoker &operator=(const DBusInvoker &);
+};
+
+#endif
diff --git a/deepin-hostmodify-plugin/invokers/invokerfactory.cpp b/deepin-hostmodify-plugin/invokers/invokerfactory.cpp
new file mode 100644
index 0000000..f0c0634
--- /dev/null
+++ b/deepin-hostmodify-plugin/invokers/invokerfactory.cpp
@@ -0,0 +1,38 @@
+// Copyright (C) 2021 ~ 2021 Deepin Technology Co., Ltd.
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "invokerfactory.h"
+
+#include "dbusinvoker.h"
+
+InvokerFactory::InvokerFactory()
+{
+}
+
+InvokerFactory::~InvokerFactory()
+{
+}
+
+DBusInvokerInterface *InvokerFactory::CreateInvoker(const QString &service,
+ const QString &path,
+ const QString &interface,
+ ConnectType type,
+ QObject *parent)
+{
+ return new DBusInvoker(service, path, interface, type, parent);
+}
+
+// 单元测试扩展处理
+void InvokerFactory::setInvokerInteface(const QString &interfaceName,
+ DBusInvokerInterface *interface)
+{
+#ifdef DEEPIN_DEFENDER_UNITTEST
+ // 不关心是否重复
+ m_intefaceMap.insert(interfaceName, interface);
+#else
+ Q_UNUSED(interfaceName);
+ Q_UNUSED(interface);
+#endif
+}
diff --git a/deepin-hostmodify-plugin/invokers/invokerfactory.h b/deepin-hostmodify-plugin/invokers/invokerfactory.h
new file mode 100644
index 0000000..2f25e78
--- /dev/null
+++ b/deepin-hostmodify-plugin/invokers/invokerfactory.h
@@ -0,0 +1,52 @@
+// Copyright (C) 2021 ~ 2021 Deepin Technology Co., Ltd.
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#ifndef DBUS_INVOKER_FACTORY
+#define DBUS_INVOKER_FACTORY
+
+#include "invokerinterface.h"
+
+#include
+
+// 简化DBUS调用方法的写法
+#define DBUS_BLOCK_INVOKE(interface, funName, ...) \
+ interface->Invoke(funName, {__VA_ARGS__}, BlockMode::BLOCK)
+#define DBUS_INVOKE(interface, funName, ...) \
+ interface->Invoke(funName, {__VA_ARGS__}, BlockMode::BLOCKWITHGUI)
+#define DBUS_NOBLOCK_INVOKE(interface, funName, ...) \
+ interface->Invoke(funName, {__VA_ARGS__}, BlockMode::NOBLOCK)
+#define GET_MESSAGE_VALUE(type, output, message) type output = QDBusReply(message).value()
+
+// implement
+class InvokerFactory : public QObject
+ , public InvokerFactoryInterface
+{
+ Q_OBJECT
+public:
+ static InvokerFactory &GetInstance()
+ {
+ static InvokerFactory instance;
+ return instance;
+ }
+
+ virtual DBusInvokerInterface *CreateInvoker(const QString &service,
+ const QString &path,
+ const QString &interface,
+ ConnectType type = ConnectType::SESSION,
+ QObject *parent = nullptr) override;
+
+public:
+ void setInvokerInteface(const QString &, DBusInvokerInterface *);
+
+private:
+ InvokerFactory();
+ InvokerFactory(InvokerFactory &);
+ InvokerFactory &operator=(const InvokerFactory &);
+ ~InvokerFactory() override;
+
+ QMap m_intefaceMap;
+};
+
+#endif
diff --git a/deepin-hostmodify-plugin/invokers/invokerinterface.h b/deepin-hostmodify-plugin/invokers/invokerinterface.h
new file mode 100644
index 0000000..4702801
--- /dev/null
+++ b/deepin-hostmodify-plugin/invokers/invokerinterface.h
@@ -0,0 +1,50 @@
+// Copyright (C) 2021 ~ 2021 Deepin Technology Co., Ltd.
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#ifndef DBUS_INVOKE_INTERFACE_H
+#define DBUS_INVOKE_INTERFACE_H
+
+#include
+#include
+#include
+
+enum ConnectType { SYSTEM,
+ SESSION };
+
+enum InvokeType { CALL,
+ SIGNAL };
+
+enum BlockMode { NOBLOCK,
+ BLOCK,
+ BLOCKWITHGUI,
+ AUTODETECT };
+
+// interface
+class DBusInvokerInterface
+{
+public:
+ virtual QDBusMessage Invoke(const QString &name,
+ const QList &functionParams = QList(),
+ BlockMode mode = BlockMode::BLOCKWITHGUI) = 0;
+ virtual bool EmitSignal(const QString &name,
+ const QList &arguments = QList()) = 0;
+ virtual bool Connect(const QString &signal, QObject *reciver, const char *slot) = 0;
+ virtual bool Disconnect(const QString &signal, QObject *reciver, const char *slot) = 0;
+
+ virtual ~DBusInvokerInterface() {}
+};
+
+class InvokerFactoryInterface
+{
+public:
+ virtual DBusInvokerInterface *CreateInvoker(const QString &service,
+ const QString &path,
+ const QString &interface,
+ ConnectType type = ConnectType::SESSION,
+ QObject *parent = nullptr) = 0;
+ virtual ~InvokerFactoryInterface() {}
+};
+
+#endif
diff --git a/deepin-hostmodify-plugin/translate_generation.sh b/deepin-hostmodify-plugin/translate_generation.sh
new file mode 100644
index 0000000..6b67c53
--- /dev/null
+++ b/deepin-hostmodify-plugin/translate_generation.sh
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+# SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+#
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+# this file is used to auto-generate .qm file from .ts file.
+# author: shibowen at linuxdeepin.com
+
+ts_list=($(ls translations/*.ts))
+
+for ts in "${ts_list[@]}"; do
+ printf "\nprocess ${ts}\n"
+ lrelease "${ts}"
+done
diff --git a/deepin-hostmodify-plugin/translations/deepin-hostmodify_en_US.ts b/deepin-hostmodify-plugin/translations/deepin-hostmodify_en_US.ts
new file mode 100644
index 0000000..68dc2c8
--- /dev/null
+++ b/deepin-hostmodify-plugin/translations/deepin-hostmodify_en_US.ts
@@ -0,0 +1,50 @@
+
+
+
+
+ HostModifyModule
+
+
+ Hosts configuration modification
+
+
+
+
+ Manually modify hosts file
+
+
+
+
+ Supported by UOS
+
+
+
+
+ HostModifyWidget
+
+
+ Hosts configuration modification
+
+
+
+
+ Manually modify hosts file
+
+
+
+
+ Reset
+
+
+
+
+ Save
+
+
+
+
+ Save successful
+
+
+
+
diff --git a/deepin-hostmodify-plugin/translations/deepin-hostmodify_zh_CN.ts b/deepin-hostmodify-plugin/translations/deepin-hostmodify_zh_CN.ts
new file mode 100644
index 0000000..f0e828d
--- /dev/null
+++ b/deepin-hostmodify-plugin/translations/deepin-hostmodify_zh_CN.ts
@@ -0,0 +1,50 @@
+
+
+
+
+ HostModifyModule
+
+
+ Hosts configuration modification
+ Hosts配置修改
+
+
+
+ Manually modify hosts file
+ 手动修改host文件
+
+
+
+ Supported by UOS
+ 由UOS提供服务
+
+
+
+ HostModifyWidget
+
+
+ Hosts configuration modification
+ Hosts配置修改
+
+
+
+ Manually modify hosts file
+ 手动修改host文件
+
+
+
+ Reset
+ 重置
+
+
+
+ Save
+ 保存
+
+
+
+ Save successful
+ 保存成功
+
+
+
diff --git a/deepin-keyclean-plugin/CMakeLists.txt b/deepin-keyclean-plugin/CMakeLists.txt
new file mode 100644
index 0000000..09b81a5
--- /dev/null
+++ b/deepin-keyclean-plugin/CMakeLists.txt
@@ -0,0 +1,46 @@
+cmake_minimum_required(VERSION 3.7)
+
+set(PLUGIN_NAME "deepin-keyclean")
+
+project(${PLUGIN_NAME})
+
+set(CMAKE_AUTOMOC ON)
+
+file(GLOB_RECURSE SRCS
+ "*.h"
+ "*.cpp")
+
+find_package(Qt5 COMPONENTS Core Widgets DBus Svg LinguistTools REQUIRED)
+find_package(PkgConfig REQUIRED)
+find_package(DtkWidget REQUIRED)
+
+pkg_check_modules(DFrameworkDBus REQUIRED dframeworkdbus)
+pkg_check_modules(QGSettings REQUIRED gsettings-qt)
+
+file(GLOB TS_FILES "translations/*.ts")
+qt5_add_translation(QM_FILES ${TS_FILES})
+add_custom_target(translationskeyclean ALL DEPENDS ${QM_FILES})
+install(FILES ${QM_FILES} DESTINATION share/${PLUGIN_NAME}/translations)
+
+add_library(${PLUGIN_NAME} SHARED ${SRCS} icons/keyclean_icons.qrc)
+set_target_properties(${PLUGIN_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ./)
+target_include_directories(${PLUGIN_NAME} PUBLIC
+ ${Qt5Widgets_INCLUDE_DIRS}
+ ${Qt5Svg_INCLUDE_DIRS}
+ ${DtkWidget_INCLUDE_DIRS}
+ ${QGSettings_INCLUDE_DIRS}
+ ${Qt5DBus_INCLUDE_DIRS}
+ ../deepin-pc-manager/include/
+ )
+target_link_libraries(${PLUGIN_NAME} PRIVATE
+ ${Qt5Widgets_LIBRARIES}
+ ${Qt5Svg_LIBRARIES}
+ ${DtkWidget_LIBRARIES}
+ ${DFrameworkDBus_LIBRARIES}
+ ${QGSettings_LIBRARIES}
+ ${Qt5DBus_LIBRARIES}
+ )
+
+install(TARGETS ${PLUGIN_NAME} LIBRARY DESTINATION /usr/lib/deepin-pc-manager/modules)
+install(FILES icons/icons/deepin-key-clean.svg DESTINATION /usr/share/icons/hicolor/scalable/apps)
+install(FILES ./keyclean.sh DESTINATION /usr/share/deepin-pc-manager)
diff --git a/deepin-keyclean-plugin/icons/icons/deepin-key-clean.svg b/deepin-keyclean-plugin/icons/icons/deepin-key-clean.svg
new file mode 100644
index 0000000..2bac520
--- /dev/null
+++ b/deepin-keyclean-plugin/icons/icons/deepin-key-clean.svg
@@ -0,0 +1,64 @@
+
+
\ No newline at end of file
diff --git a/deepin-keyclean-plugin/icons/keyclean_icons.qrc b/deepin-keyclean-plugin/icons/keyclean_icons.qrc
new file mode 100644
index 0000000..0bc6269
--- /dev/null
+++ b/deepin-keyclean-plugin/icons/keyclean_icons.qrc
@@ -0,0 +1,5 @@
+
+
+ icons/deepin-key-clean.svg
+
+
diff --git a/deepin-keyclean-plugin/keyclean.sh b/deepin-keyclean-plugin/keyclean.sh
new file mode 100644
index 0000000..3d880c7
--- /dev/null
+++ b/deepin-keyclean-plugin/keyclean.sh
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+# SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+#
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+echo '操作开始'
+echo '移动keyrings目录到回收站:'`mv ~/.local/share/keyrings/* ~/.local/share/Trash/files/`
+echo 'deepin-keyrings-wb:'`mv ~/.local/share/deepin-keyrings-wb/* ~/.local/share/Trash/files/`
+echo '操作完成'
\ No newline at end of file
diff --git a/deepin-keyclean-plugin/keyclean_settings.json b/deepin-keyclean-plugin/keyclean_settings.json
new file mode 100644
index 0000000..dbc6b7b
--- /dev/null
+++ b/deepin-keyclean-plugin/keyclean_settings.json
@@ -0,0 +1,3 @@
+{
+ "api" : "1.0.0"
+}
\ No newline at end of file
diff --git a/deepin-keyclean-plugin/keycleanmodel.cpp b/deepin-keyclean-plugin/keycleanmodel.cpp
new file mode 100644
index 0000000..4b10be2
--- /dev/null
+++ b/deepin-keyclean-plugin/keycleanmodel.cpp
@@ -0,0 +1,37 @@
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "keycleanmodel.h"
+
+#include
+
+#define LOOG_KEY_LOCK_DIR "/usr/share/deepin-pc-manager/"
+#define LOOG_KEY_LOCK_PATH "/usr/share/deepin-pc-manager/keyclean.sh"
+KeyCleanModel::KeyCleanModel(QObject *parent)
+ : QObject(parent)
+{
+ initData();
+}
+
+KeyCleanModel::~KeyCleanModel()
+{
+}
+
+// 初始化数据
+void KeyCleanModel::initData()
+{
+}
+
+QString KeyCleanModel::startCleanKeyLock()
+{
+ QProcess builder;
+ builder.setWorkingDirectory(LOOG_KEY_LOCK_DIR);
+ builder.setProcessChannelMode(QProcess::MergedChannels);
+ builder.start(QString("/bin/bash %1 %2").arg(LOOG_KEY_LOCK_PATH));
+ if (!builder.waitForFinished()) {
+ builder.close();
+ return "秘钥环清理失败";
+ }
+ return QString::fromLocal8Bit(builder.readAllStandardOutput()).trimmed();
+}
diff --git a/deepin-keyclean-plugin/keycleanmodel.h b/deepin-keyclean-plugin/keycleanmodel.h
new file mode 100644
index 0000000..cdbafde
--- /dev/null
+++ b/deepin-keyclean-plugin/keycleanmodel.h
@@ -0,0 +1,22 @@
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#pragma once
+
+#include
+
+class KeyCleanModel : public QObject
+{
+ Q_OBJECT
+public:
+ explicit KeyCleanModel(QObject *parent = nullptr);
+ ~KeyCleanModel();
+
+ QString startCleanKeyLock();
+
+private:
+ void initData();
+
+private:
+};
diff --git a/deepin-keyclean-plugin/keycleanmodule.cpp b/deepin-keyclean-plugin/keycleanmodule.cpp
new file mode 100644
index 0000000..8efa60e
--- /dev/null
+++ b/deepin-keyclean-plugin/keycleanmodule.cpp
@@ -0,0 +1,79 @@
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "keycleanmodule.h"
+#include "keycleanmodel.h"
+#include "keycleanwidget.h"
+
+#include
+
+#include
+#include
+
+DWIDGET_USE_NAMESPACE
+DCORE_USE_NAMESPACE
+
+KeyCLeanModule::KeyCLeanModule()
+ : QObject()
+ , ToolBoxInterface()
+ , m_keyCleanModel(nullptr)
+ , m_keyCleanWidget(nullptr)
+{
+ QTranslator *translator = new QTranslator(this);
+ translator->load(QString("/usr/share/deepin-keyclean/translations/deepin-keyclean_%1.qm").arg(QLocale::system().name()));
+ QCoreApplication::installTranslator(translator);
+}
+
+KeyCLeanModule::~KeyCLeanModule()
+{
+}
+
+void KeyCLeanModule::active()
+{
+ if (!m_keyCleanModel) {
+ m_keyCleanModel = new KeyCleanModel;
+ }
+ if (!m_keyCleanWidget) {
+ m_keyCleanWidget = new KeyCleanWidget(m_keyCleanModel);
+ }
+
+ m_frameProxy->pushWidget(this, m_keyCleanWidget);
+ m_keyCleanWidget->setVisible(true);
+}
+
+const QString KeyCLeanModule::name() const
+{
+ return "DEEPINKEYCLEAN";
+}
+const QString KeyCLeanModule::apptitle() const
+{
+ return tr("Keyring cleaning");
+}
+const QString KeyCLeanModule::apptip() const
+{
+ return tr("Resolve repeated keyring unlock requests");
+}
+const QString KeyCLeanModule::appsupporter() const
+{
+ return tr("Supported by UOS");
+}
+const QString KeyCLeanModule::icon() const
+{
+ return "deepin-key-clean";
+}
+
+int KeyCLeanModule::apptype() const
+{
+ return ToolBoxProxyInterface::System;
+}
+
+bool KeyCLeanModule::enable() const
+{
+ return true;
+}
+
+bool KeyCLeanModule::checkauth() const
+{
+ return false;
+}
diff --git a/deepin-keyclean-plugin/keycleanmodule.h b/deepin-keyclean-plugin/keycleanmodule.h
new file mode 100644
index 0000000..1808408
--- /dev/null
+++ b/deepin-keyclean-plugin/keycleanmodule.h
@@ -0,0 +1,53 @@
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#pragma once
+
+#include
+#include
+
+#include "interface/toolboxinterface.h"
+#include "interface/toolboxproxyinterface.h"
+
+namespace PCC_NAMESPACE {
+class ToolBoxInterface;
+class ToolBoxProxyInterface;
+} // namespace PCC_NAMESPACE
+
+using namespace PCC_NAMESPACE;
+
+class KeyCleanWidget;
+class KeyCleanModel;
+class KeyCLeanModule : public QObject
+ , public ToolBoxInterface
+{
+ Q_OBJECT
+
+ Q_PLUGIN_METADATA(IID ToolBoxInterface_iid FILE "keyclean_settings.json")
+ Q_INTERFACES(PCC_NAMESPACE::ToolBoxInterface)
+
+public:
+ explicit KeyCLeanModule();
+
+ ~KeyCLeanModule() Q_DECL_OVERRIDE;
+
+ const QString name() const Q_DECL_OVERRIDE;
+ const QString apptitle() const Q_DECL_OVERRIDE;
+ const QString apptip() const Q_DECL_OVERRIDE;
+ const QString appsupporter() const Q_DECL_OVERRIDE;
+ const QString icon() const Q_DECL_OVERRIDE;
+ int apptype() const Q_DECL_OVERRIDE;
+ bool enable() const Q_DECL_OVERRIDE;
+ bool checkauth() const Q_DECL_OVERRIDE;
+
+private:
+ void onStatusChanged();
+
+public Q_SLOTS:
+ void active() Q_DECL_OVERRIDE;
+
+private:
+ KeyCleanModel *m_keyCleanModel;
+ KeyCleanWidget *m_keyCleanWidget;
+};
diff --git a/deepin-keyclean-plugin/keycleanwidget.cpp b/deepin-keyclean-plugin/keycleanwidget.cpp
new file mode 100644
index 0000000..d1249a9
--- /dev/null
+++ b/deepin-keyclean-plugin/keycleanwidget.cpp
@@ -0,0 +1,96 @@
+// Copyright (C) 2019 ~ 2019 Deepin Technology Co., Ltd.
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "keycleanwidget.h"
+#include "keycleanmodel.h"
+
+#include
+#include
+
+#include
+
+KeyCleanWidget::KeyCleanWidget(KeyCleanModel *model, QWidget *parent)
+ : DFrame(parent)
+ , m_model(model)
+{
+ initUI();
+ connect(m_execButton, &DSuggestButton::clicked, this, &KeyCleanWidget::cleanKeyLock);
+}
+
+KeyCleanWidget::~KeyCleanWidget()
+{
+}
+
+void KeyCleanWidget::initUI()
+{
+ QVBoxLayout *layout = new QVBoxLayout(this);
+ layout->setSpacing(10);
+ layout->setContentsMargins(20, 20, 20, 20);
+ this->setLayout(layout);
+
+ QLabel *title = new QLabel(tr("Keyring cleaning"), this);
+ QFont font1 = title->font();
+ font1.setBold(true);
+ font1.setWeight(QFont::DemiBold);
+ DFontSizeManager::instance()->bind(title, DFontSizeManager::T5);
+ title->setContentsMargins(10, 0, 0, 0);
+
+ QLabel *detailInfo = new QLabel(tr("Resolve repeated keyring unlock requests"), this);
+ DFontSizeManager::instance()->bind(detailInfo, DFontSizeManager::T8);
+ detailInfo->setContentsMargins(10, 0, 0, 0);
+
+ QLabel *descriptionInfo = new QLabel(tr("Tool Description"), this);
+ DFontSizeManager::instance()->bind(descriptionInfo, DFontSizeManager::T8);
+ descriptionInfo->setContentsMargins(10, 0, 0, 0);
+
+ DTipLabel *tipLabel = new DTipLabel(tr("Resolve the issue of repeatedly prompting for 'Unlock Login Keyring' dialog and being unable to prevent the pop-up through operations."), this);
+ DFontSizeManager::instance()->bind(tipLabel, DFontSizeManager::T8);
+ tipLabel->setContentsMargins(10, 0, 0, 0);
+ tipLabel->setAlignment(Qt::AlignLeft);
+
+ DFrame *textFrame = new DFrame(this);
+ QVBoxLayout *textLayout = new QVBoxLayout(textFrame);
+ textLayout->setContentsMargins(2, 2, 2, 2);
+ textLayout->setSpacing(0);
+ textFrame->setLayout(textLayout);
+
+ m_textEdit = new QTextEdit(textFrame);
+ m_textEdit->setFixedSize(QSize(900, 400));
+ m_textEdit->setLineWidth(0);
+ textLayout->addWidget(m_textEdit, 0, Qt::AlignCenter);
+
+ m_execButton = new DSuggestButton(this);
+ m_execButton->setFixedWidth(180);
+ m_execButton->setText(tr("Execute immediately"));
+
+ layout->addWidget(title);
+ layout->addWidget(detailInfo);
+ layout->addSpacing(10);
+ layout->addWidget(descriptionInfo);
+ layout->addWidget(tipLabel);
+ layout->addWidget(textFrame, 0, Qt::AlignCenter);
+ layout->addWidget(m_execButton, 0, Qt::AlignRight);
+ layout->addStretch();
+}
+
+void KeyCleanWidget::cleanKeyLock()
+{
+ DDialog *dlg = new DDialog(this);
+ dlg->setOnButtonClickedClose(true);
+ // 设置属性当关闭时候删除自己
+ dlg->setAttribute(Qt::WA_DeleteOnClose);
+ dlg->setIcon(QIcon::fromTheme("deepin-key-clean"));
+ dlg->setMessage(tr("The operation cannot be undone. Please confirm if you want to proceed?"));
+ dlg->addButton(tr("Cancel", "button"), false, DDialog::ButtonType::ButtonNormal);
+ dlg->addButton(tr("Continue"), false, DDialog::ButtonType::ButtonRecommend);
+
+ connect(dlg, &DDialog::buttonClicked, this, [&](int index, const QString &text) {
+ Q_UNUSED(text);
+ if (1 == index) {
+ m_textEdit->setText(m_model->startCleanKeyLock());
+ }
+ });
+ dlg->exec();
+}
diff --git a/deepin-keyclean-plugin/keycleanwidget.h b/deepin-keyclean-plugin/keycleanwidget.h
new file mode 100644
index 0000000..9eebca4
--- /dev/null
+++ b/deepin-keyclean-plugin/keycleanwidget.h
@@ -0,0 +1,38 @@
+// Copyright (C) 2019 ~ 2019 Deepin Technology Co., Ltd.
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#pragma once
+
+#include
+#include
+#include
+#include
+
+#include
+#include
+#include
+#include
+
+DWIDGET_USE_NAMESPACE
+class KeyCleanModel;
+class KeyCleanWidget : public DFrame
+{
+ Q_OBJECT
+public:
+ explicit KeyCleanWidget(KeyCleanModel *model, QWidget *parent = nullptr);
+ ~KeyCleanWidget();
+
+private:
+ // 初始化界面
+ void initUI();
+
+public Q_SLOTS:
+ void cleanKeyLock();
+
+private:
+ KeyCleanModel *m_model;
+ QTextEdit *m_textEdit;
+ DSuggestButton *m_execButton;
+};
diff --git a/deepin-keyclean-plugin/translate_generation.sh b/deepin-keyclean-plugin/translate_generation.sh
new file mode 100644
index 0000000..6b67c53
--- /dev/null
+++ b/deepin-keyclean-plugin/translate_generation.sh
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+# SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+#
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+# this file is used to auto-generate .qm file from .ts file.
+# author: shibowen at linuxdeepin.com
+
+ts_list=($(ls translations/*.ts))
+
+for ts in "${ts_list[@]}"; do
+ printf "\nprocess ${ts}\n"
+ lrelease "${ts}"
+done
diff --git a/deepin-keyclean-plugin/translations/deepin-keyclean_en_US.ts b/deepin-keyclean-plugin/translations/deepin-keyclean_en_US.ts
new file mode 100644
index 0000000..8047829
--- /dev/null
+++ b/deepin-keyclean-plugin/translations/deepin-keyclean_en_US.ts
@@ -0,0 +1,71 @@
+
+
+
+
+ KeyCLeanModule
+
+
+ Keyring cleaning
+
+
+
+
+ Resolve repeated keyring unlock requests
+
+
+
+
+ Supported by UOS
+
+
+
+
+ KeyCleanWidget
+
+
+ Keyring cleaning
+
+
+
+
+ Resolve repeated keyring unlock requests
+
+
+
+
+ Tool Description
+
+
+
+
+ Resolve the issue of repeatedly prompting for 'Unlock Login Keyring' dialog and being unable to prevent the pop-up through operations.
+
+
+
+
+ Execute immediately
+
+
+
+
+ The operation cannot be undone. Please confirm if you want to proceed?
+
+
+
+
+ Cancel
+ button
+
+
+
+
+ Continue
+
+
+
+
+ Execute successful
+
+
+
+
diff --git a/deepin-keyclean-plugin/translations/deepin-keyclean_zh_CN.ts b/deepin-keyclean-plugin/translations/deepin-keyclean_zh_CN.ts
new file mode 100644
index 0000000..0b62b1c
--- /dev/null
+++ b/deepin-keyclean-plugin/translations/deepin-keyclean_zh_CN.ts
@@ -0,0 +1,71 @@
+
+
+
+
+ KeyCLeanModule
+
+
+ Keyring cleaning
+ 密钥环清理
+
+
+
+ Resolve repeated keyring unlock requests
+ 清理密钥环信息
+
+
+
+ Supported by UOS
+ 由UOS提供服务
+
+
+
+ KeyCleanWidget
+
+
+ Keyring cleaning
+ 密钥环清理
+
+
+
+ Resolve repeated keyring unlock requests
+ 清理密钥环信息
+
+
+
+ Tool Description
+ 工具描述
+
+
+
+ Resolve the issue of repeatedly prompting for 'Unlock Login Keyring' dialog and being unable to prevent the pop-up through operations.
+ 解决多次弹出“解锁登录密钥环”对话框要求输入密码,且无法通过操作禁止弹出的问题
+
+
+
+ Execute immediately
+ 立即执行
+
+
+
+ The operation cannot be undone. Please confirm if you want to proceed?
+ 操作无法撤销,请确认是否继续执行?
+
+
+
+ Cancel
+ button
+ 取 消
+
+
+
+ Continue
+ 继续执行
+
+
+
+ Execute successful
+ 执行成功
+
+
+
diff --git a/deepin-netcheck-plugin/CMakeLists.txt b/deepin-netcheck-plugin/CMakeLists.txt
new file mode 100644
index 0000000..9a11730
--- /dev/null
+++ b/deepin-netcheck-plugin/CMakeLists.txt
@@ -0,0 +1,46 @@
+cmake_minimum_required(VERSION 3.7)
+
+set(PLUGIN_NAME "deepin-netcheck")
+
+project(${PLUGIN_NAME})
+
+set(CMAKE_AUTOMOC ON)
+
+file(GLOB_RECURSE SRCS
+ "*.h"
+ "*.cpp")
+
+find_package(Qt5 COMPONENTS Core Widgets DBus Svg LinguistTools REQUIRED)
+find_package(PkgConfig REQUIRED)
+find_package(DtkWidget REQUIRED)
+
+pkg_check_modules(DFrameworkDBus REQUIRED dframeworkdbus)
+pkg_check_modules(QGSettings REQUIRED gsettings-qt)
+
+file(GLOB TS_FILES "translations/*.ts")
+qt5_add_translation(QM_FILES ${TS_FILES})
+add_custom_target(translationsnetcheck ALL DEPENDS ${QM_FILES})
+install(FILES ${QM_FILES} DESTINATION share/${PLUGIN_NAME}/translations)
+
+add_library(${PLUGIN_NAME} SHARED ${SRCS} icons/netcheck_icons.qrc)
+set_target_properties(${PLUGIN_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ./)
+target_include_directories(${PLUGIN_NAME} PUBLIC
+ ${Qt5Widgets_INCLUDE_DIRS}
+ ${Qt5Svg_INCLUDE_DIRS}
+ ${DtkWidget_INCLUDE_DIRS}
+ ${QGSettings_INCLUDE_DIRS}
+ ${Qt5DBus_INCLUDE_DIRS}
+ ../deepin-pc-manager/include/
+ )
+target_link_libraries(${PLUGIN_NAME} PRIVATE
+ ${Qt5Widgets_LIBRARIES}
+ ${Qt5Svg_LIBRARIES}
+ ${DtkWidget_LIBRARIES}
+ ${DFrameworkDBus_LIBRARIES}
+ ${QGSettings_LIBRARIES}
+ ${Qt5DBus_LIBRARIES}
+ )
+
+install(TARGETS ${PLUGIN_NAME} LIBRARY DESTINATION /usr/lib/deepin-pc-manager/modules)
+install(FILES ./configs/org.deepin.dde.deepin-netcheck.json DESTINATION /usr/share/dsg/configs/org.deepin.dde.deepin-netcheck/)
+install(FILES icons/icons/deepin-net-check.svg DESTINATION /usr/share/icons/hicolor/scalable/apps)
diff --git a/deepin-netcheck-plugin/configs/org.deepin.dde.deepin-netcheck.json b/deepin-netcheck-plugin/configs/org.deepin.dde.deepin-netcheck.json
new file mode 100644
index 0000000..ce9dd48
--- /dev/null
+++ b/deepin-netcheck-plugin/configs/org.deepin.dde.deepin-netcheck.json
@@ -0,0 +1,26 @@
+{
+ "magic": "dsg.config.meta",
+ "version": "1.0",
+ "contents": {
+ "netCheckType": {
+ "value": 0,
+ "serial": 0,
+ "flags": ["global"],
+ "name": "netCheckType",
+ "description[zh_CN]": "网络检测类型",
+ "description": "",
+ "permissions": "readwrite",
+ "visibility": "private"
+ },
+ "netCheckIntranetDomain": {
+ "value": "",
+ "serial": 0,
+ "flags": ["global"],
+ "name": "netCheckIntranetDomain",
+ "description[zh_CN]": "内网域名",
+ "description": "",
+ "permissions": "readwrite",
+ "visibility": "private"
+ }
+ }
+ }
diff --git a/deepin-netcheck-plugin/icons/icons/dcc_net_check_96px.svg b/deepin-netcheck-plugin/icons/icons/dcc_net_check_96px.svg
new file mode 100644
index 0000000..51546da
--- /dev/null
+++ b/deepin-netcheck-plugin/icons/icons/dcc_net_check_96px.svg
@@ -0,0 +1,75 @@
+
+
\ No newline at end of file
diff --git a/deepin-pc-manager/src/window/icons/icons/dcc_login_tip_32px.svg b/deepin-netcheck-plugin/icons/icons/dcc_yellow_tip_32px.svg
similarity index 100%
rename from deepin-pc-manager/src/window/icons/icons/dcc_login_tip_32px.svg
rename to deepin-netcheck-plugin/icons/icons/dcc_yellow_tip_32px.svg
diff --git a/deepin-pc-manager/src/window/icons/icons/Network_in_the_diagnosis of_48px.svg b/deepin-netcheck-plugin/icons/icons/deepin-net-check.svg
similarity index 100%
rename from deepin-pc-manager/src/window/icons/icons/Network_in_the_diagnosis of_48px.svg
rename to deepin-netcheck-plugin/icons/icons/deepin-net-check.svg
diff --git a/deepin-netcheck-plugin/icons/netcheck_icons.qrc b/deepin-netcheck-plugin/icons/netcheck_icons.qrc
new file mode 100644
index 0000000..2d969bd
--- /dev/null
+++ b/deepin-netcheck-plugin/icons/netcheck_icons.qrc
@@ -0,0 +1,7 @@
+
+
+ icons/deepin-net-check.svg
+ icons/dcc_yellow_tip_32px.svg
+ icons/dcc_net_check_96px.svg
+
+
diff --git a/deepin-netcheck-plugin/invokers/dbusinvoker.cpp b/deepin-netcheck-plugin/invokers/dbusinvoker.cpp
new file mode 100644
index 0000000..58219a5
--- /dev/null
+++ b/deepin-netcheck-plugin/invokers/dbusinvoker.cpp
@@ -0,0 +1,104 @@
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "dbusinvoker.h"
+
+#include
+#include
+
+DBusInvoker::DBusInvoker(const QString &service,
+ const QString &path,
+ const QString &interface,
+ ConnectType type,
+ QObject *parent)
+ : QObject(parent)
+ , m_service(service)
+ , m_path(path)
+ , m_interface(interface)
+ , m_type(type)
+ , m_connection(QDBusConnection::sessionBus())
+{
+ if (SYSTEM == m_type) {
+ m_connection = QDBusConnection::systemBus();
+ }
+}
+
+// signal-slot connection
+bool DBusInvoker::Connect(const QString &signal, QObject *reciver, const char *slot)
+{
+ bool connectRst = false;
+ connectRst = m_connection.connect(m_service, m_path, m_interface, signal, reciver, slot);
+ if (!connectRst) {
+ qCritical() << "signal connect failed : " << signal << "for reason ["
+ << m_connection.lastError().message() << "]";
+ }
+ Q_ASSERT(connectRst);
+ return connectRst;
+}
+
+// signal-slot disconnection
+bool DBusInvoker::Disconnect(const QString &signal, QObject *reciver, const char *slot)
+{
+ bool disconnectRst = false;
+ disconnectRst = m_connection.disconnect(m_service, m_path, m_interface, signal, reciver, slot);
+ if (!disconnectRst) {
+ qCritical() << "signal disconnect failed : " << signal << "for reason ["
+ << m_connection.lastError().message() << "]";
+ }
+ Q_ASSERT(disconnectRst);
+ return disconnectRst;
+}
+
+DBusInvoker::~DBusInvoker()
+{
+ // 确保在调用delete时,释放自身成员对象
+ deleteLater();
+}
+
+// create method call or signal emit
+// invoke like this :
+// invoker->Connect("signalFunc", this, SLOT(slotFunc(bool, QString)));
+// there would be param type validate when signal emitted
+QDBusMessage DBusInvoker::Invoke(const QString &name,
+ const QList &functionParams,
+ BlockMode mode)
+{
+ if (name.isEmpty()) {
+ return QDBusMessage::createError(QDBusError::InvalidArgs, QString("name.isEmpty"));
+ }
+
+ QDBusMessage msg;
+ if (DBUS_PROPERTY_INVOKER_NAME == name) {
+ if (functionParams.isEmpty()) {
+ return QDBusMessage::createError(QDBusError::InvalidArgs,
+ QString("property not exist"));
+ }
+
+ msg = QDBusMessage::createMethodCall(m_service,
+ m_path,
+ "org.freedesktop.DBus.Properties",
+ "Get");
+ msg.setArguments({m_interface, functionParams.first().toString()});
+
+ QDBusMessage retMsg = m_connection.call(msg, QDBus::CallMode(mode));
+ return retMsg;
+ }
+
+ msg = QDBusMessage::createMethodCall(m_service, m_path, m_interface, name);
+ msg.setArguments(functionParams);
+
+ return m_connection.call(msg, QDBus::CallMode(mode));
+}
+
+// emit signal
+bool DBusInvoker::EmitSignal(const QString &name, const QList &arguments)
+{
+ if (name.isEmpty()) {
+ return false;
+ }
+
+ QDBusMessage signal = QDBusMessage::createSignal(m_path, m_interface, name);
+ signal.setArguments(arguments);
+ return m_connection.send(signal);
+}
diff --git a/deepin-netcheck-plugin/invokers/dbusinvoker.h b/deepin-netcheck-plugin/invokers/dbusinvoker.h
new file mode 100644
index 0000000..d1a8ab9
--- /dev/null
+++ b/deepin-netcheck-plugin/invokers/dbusinvoker.h
@@ -0,0 +1,48 @@
+// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#ifndef DBUS_INVOKER_H
+#define DBUS_INVOKER_H
+
+#include "invokerinterface.h"
+
+#include
+#include