From 5cb1cff0cabd7103d049ab0146a0e75fd4a0277a Mon Sep 17 00:00:00 2001 From: uniartisan Date: Tue, 24 Oct 2023 19:25:32 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BD=BF=E7=94=A8dbus=E6=94=AF?= =?UTF-8?q?=E6=8C=81kde=E7=9A=84=E6=9A=97=E8=89=B2=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + src/backend/ThemeChecker.cpp | 44 ++++++++++ src/backend/ThemeChecker.h | 26 ++++++ src/mainwindow-dtk.cpp | 134 +++++++++++++++++++----------- src/mainwindow-dtk.h | 3 + src/spark-store.pro | 2 + translations/spark-store_en.ts | 22 ++--- translations/spark-store_es.ts | 22 ++--- translations/spark-store_fr.ts | 22 ++--- translations/spark-store_zh_CN.ts | 22 ++--- translations/spark-store_zh_TW.ts | 22 ++--- 11 files changed, 216 insertions(+), 104 deletions(-) create mode 100644 src/backend/ThemeChecker.cpp create mode 100644 src/backend/ThemeChecker.h diff --git a/.gitignore b/.gitignore index 6fe4004..21d239c 100644 --- a/.gitignore +++ b/.gitignore @@ -53,3 +53,4 @@ debian/*.substvars debian/spark-store .vscode/* +src/spark-store diff --git a/src/backend/ThemeChecker.cpp b/src/backend/ThemeChecker.cpp new file mode 100644 index 0000000..3d57b1c --- /dev/null +++ b/src/backend/ThemeChecker.cpp @@ -0,0 +1,44 @@ +#include "ThemeChecker.h" +#include +#include +#include + +ThemeChecker::ThemeChecker(QObject *parent) : QObject(parent), lastColorSchema(-1) { + timer = new QTimer(this); + connect(timer, SIGNAL(timeout()), this, SLOT(checkThemeChange())); + timer->start(1000); +} + +void ThemeChecker::checkThemeChange() { + + + QProcess process; + QStringList parameters; + parameters << "-c" << "dbus-send --session --print-reply=literal --reply-timeout=1000 --dest=org.freedesktop.portal.Desktop /org/freedesktop/portal/desktop org.freedesktop.portal.Settings.Read string:'org.freedesktop.appearance' string:'color-scheme'"; + process.start("/bin/sh", parameters); + + if (process.waitForFinished(-1)) { + QString errorOutput = QString(process.readAllStandardError()).trimmed(); + if (!errorOutput.isEmpty()) { + qWarning() << "检测到DBus错误:" << errorOutput; + return; + } + + QString output = QString(process.readAll()).trimmed(); + int systemColorSchema = output.right(1).toInt(); + + if(systemColorSchema != lastColorSchema) { + lastColorSchema = systemColorSchema; + qDebug() << "主题已更改,新的主题是:" << systemColorSchema; + if(systemColorSchema == 1){ + emit themeChanged(true); + } + else if(systemColorSchema == 0 || systemColorSchema == 2){ + emit themeChanged(false); + } + } + } else { + qWarning() << "DBus调用未能完成"; + } +} + diff --git a/src/backend/ThemeChecker.h b/src/backend/ThemeChecker.h new file mode 100644 index 0000000..4ca29f2 --- /dev/null +++ b/src/backend/ThemeChecker.h @@ -0,0 +1,26 @@ +#ifndef THEMECHECKER_H +#define THEMECHECKER_H + +#include +#include + + +class ThemeChecker : public QObject +{ + Q_OBJECT +public: + explicit ThemeChecker(QObject *parent = nullptr); + +signals: + void themeChanged(bool isDark); + +public slots: + void checkThemeChange(); + + +private: + int lastColorSchema; + QTimer *timer; +}; + +#endif // THEMECHECKER_H diff --git a/src/mainwindow-dtk.cpp b/src/mainwindow-dtk.cpp index 4cc8a90..1e1e210 100644 --- a/src/mainwindow-dtk.cpp +++ b/src/mainwindow-dtk.cpp @@ -16,6 +16,8 @@ #include #include +#include + #define AppPageApplist 0 #define AppPageSearchlist 1 #define AppPageAppdetail 2 @@ -139,7 +141,7 @@ void MainWindow::initTitleBar() { ui->titlebar->setIcon(QIcon::fromTheme("spark-store")); ui->titlebar->setBackgroundTransparent(true); - // ui->titlebar->setSwitchThemeMenuVisible(false); // 去除 dtk 标题栏主题切换菜单 + ui->titlebar->setSwitchThemeMenuVisible(false); // 去除 dtk 标题栏主题切换菜单 // 初始化标题栏控件 DLabel *title = new DLabel(ui->titlebar); @@ -267,57 +269,91 @@ void MainWindow::initTrayIcon() trayIcon->show(); } -void MainWindow::initConnections() +void MainWindow::refreshTheme(bool isDarkMode) { - // 主题切换 - connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, [=](DGuiApplicationHelper::ColorType themeType) - { - if (themeType == DGuiApplicationHelper::DarkType) { - //深色模式 - setMaskColor(QColor("#2a2b2b")); - backButton->setIcon(QIcon(":/icon/dark/back.svg")); - downloadButton->setIcon(":/icon/dark/download.svg"); - downloadButton->setBackgroundColor(QColor("#444444")); - downloadButton->setColor(QColor("#66CCFF")); - ui->pushButton_14->setIcon(QIcon(":/icon/dark/update.svg")); - for (int i = 0; i < ui->buttonGroup->buttons().size(); i++) { - ui->buttonGroup->buttons()[i]->setIcon(QIcon(":/icon/dark/leftbutton_" + QString::number(i) + ".svg")); - if (QLocale::system().name() == "zh_CN") { - ui->buttonGroup->buttons()[i]->setStyleSheet("QPushButton{background-color:transparent;}\ - QPushButton:hover{background-color:#7a7a7a;border:0px;border-radius:8px;}\ - QPushButton:checked{background-color:#6e6e6e;border:0px;border-radius:8px;}"); - } else { - ui->buttonGroup->buttons()[i]->setStyleSheet("QPushButton{background-color:transparent;text-align: left; padding-left: 15px;}\ - QPushButton:hover{background-color:#7a7a7a;border:0px;border-radius:8px;text-align: left; padding-left: 15px;}\ - QPushButton:checked{background-color:#6e6e6e;border:0px;border-radius:8px;text-align: left; padding-left: 15px;}"); - } - } - } else { - //亮色模式 - setMaskColor(QColor("#f3f7f8")); - backButton->setIcon(QIcon(":/icon/light/back.svg")); - downloadButton->setBackgroundColor(QColor("#e3e4e4")); - downloadButton->setColor(QColor("#66CCFF")); - downloadButton->setIcon(":/icon/light/download.svg"); - ui->pushButton_14->setIcon(QIcon(":/icon/light/update.svg")); - for (int i = 0; i < ui->buttonGroup->buttons().size(); i++) { - ui->buttonGroup->buttons()[i]->setIcon(QIcon(":/icon/light/leftbutton_" + QString::number(i) + ".svg")); - if (QLocale::system().name() == "zh_CN") { - ui->buttonGroup->buttons()[i]->setStyleSheet("QPushButton{background-color:transparent;}\ - QPushButton:hover{background-color:#eAeAeA;border:0px;border-radius:8px;}\ - QPushButton:checked{background-color:#dddddd;border:0px;border-radius:8px;}"); - } else { - ui->buttonGroup->buttons()[i]->setStyleSheet("QPushButton{background-color:transparent;text-align: left; padding-left: 15px;}\ - QPushButton:hover{background-color:#eAeAeA;border:0px;border-radius:8px;text-align: left; padding-left: 15px;}\ - QPushButton:checked{background-color:#dddddd;border:0px;border-radius:8px;text-align: left; padding-left: 15px;}"); - } + // 使用isDarkMode变量来判断是否是深色模式 + if (isDarkMode) { + //深色模式 + setMaskColor(QColor("#2a2b2b")); + backButton->setIcon(QIcon(":/icon/dark/back.svg")); + downloadButton->setIcon(":/icon/dark/download.svg"); + downloadButton->setBackgroundColor(QColor("#444444")); + downloadButton->setColor(QColor("#66CCFF")); + ui->pushButton_14->setIcon(QIcon(":/icon/dark/update.svg")); + for (int i = 0; i < ui->buttonGroup->buttons().size(); i++) { + ui->buttonGroup->buttons()[i]->setIcon(QIcon(":/icon/dark/leftbutton_" + QString::number(i) + ".svg")); + if (QLocale::system().name() == "zh_CN") { + ui->buttonGroup->buttons()[i]->setStyleSheet("QPushButton{background-color:transparent;}\ + QPushButton:hover{background-color:#7a7a7a;border:0px;border-radius:8px;}\ + QPushButton:checked{background-color:#6e6e6e;border:0px;border-radius:8px;}"); + } else { + ui->buttonGroup->buttons()[i]->setStyleSheet("QPushButton{background-color:transparent;text-align: left; padding-left: 15px;}\ + QPushButton:hover{background-color:#7a7a7a;border:0px;border-radius:8px;text-align: left; padding-left: 15px;}\ + QPushButton:checked{background-color:#6e6e6e;border:0px;border-radius:8px;text-align: left; padding-left: 15px;}"); } } - ui->pushButton_14->setStyleSheet(ui->pushButton_4->styleSheet()); - ui->applistpage->setTheme(themeType == DGuiApplicationHelper::DarkType); - ui->applistpage_1->setTheme(themeType == DGuiApplicationHelper::DarkType); - ui->appintopage->setTheme(themeType == DGuiApplicationHelper::DarkType); - ui->settingspage->setTheme(themeType == DGuiApplicationHelper::DarkType); }); + } else { + //亮色模式 + setMaskColor(QColor("#f3f7f8")); + backButton->setIcon(QIcon(":/icon/light/back.svg")); + downloadButton->setBackgroundColor(QColor("#e3e4e4")); + downloadButton->setColor(QColor("#66CCFF")); + downloadButton->setIcon(":/icon/light/download.svg"); + ui->pushButton_14->setIcon(QIcon(":/icon/light/update.svg")); + for (int i = 0; i < ui->buttonGroup->buttons().size(); i++) { + ui->buttonGroup->buttons()[i]->setIcon(QIcon(":/icon/light/leftbutton_" + QString::number(i) + ".svg")); + if (QLocale::system().name() == "zh_CN") { + ui->buttonGroup->buttons()[i]->setStyleSheet("QPushButton{background-color:transparent;}\ + QPushButton:hover{background-color:#eAeAeA;border:0px;border-radius:8px;}\ + QPushButton:checked{background-color:#dddddd;border:0px;border-radius:8px;}"); + } else { + ui->buttonGroup->buttons()[i]->setStyleSheet("QPushButton{background-color:transparent;text-align: left; padding-left: 15px;}\ + QPushButton:hover{background-color:#eAeAeA;border:0px;border-radius:8px;text-align: left; padding-left: 15px;}\ + QPushButton:checked{background-color:#dddddd;border:0px;border-radius:8px;text-align: left; padding-left: 15px;}"); + } + } + } + ui->pushButton_14->setStyleSheet(ui->pushButton_4->styleSheet()); + ui->applistpage->setTheme(isDarkMode); + ui->applistpage_1->setTheme(isDarkMode); + ui->appintopage->setTheme(isDarkMode); + ui->settingspage->setTheme(isDarkMode); +} + +void MainWindow::onThemeChanged(bool isDark) { + DGuiApplicationHelper::ColorType currentTheme = DGuiApplicationHelper::instance()->themeType(); + + // 检查当前外观设置 + bool isUserSetDark = (currentTheme == DGuiApplicationHelper::DarkType); //当前已经是深色模式 + bool isUserSetWhite = (currentTheme == DGuiApplicationHelper::LightType); //当前已经是浅色模式 + + // 检查 isDark 为 true 时, isUserSetDark 是否为 true + // 检查 isDark 为 false , isUserSetWhite 是否为 ture + qDebug() << isUserSetDark << isUserSetWhite << isDark; + + + if ((isUserSetDark != isDark) || (isUserSetWhite == !isDark)) { + // 否则,根据传入的 isDark 值设置 + refreshTheme(isDark); + } + +} + + +void MainWindow::initConnections() +{ + + // 主题切换 + connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, [=](DGuiApplicationHelper::ColorType themeType) + { + bool isDarkMode = (themeType == DGuiApplicationHelper::ColorType::DarkType); + refreshTheme(isDarkMode); + }); + + ThemeChecker *themeChecker = new ThemeChecker(this); + connect(themeChecker, SIGNAL(themeChanged(bool)), this, SLOT(onThemeChanged(bool))); + + // appintopage按下下载按钮时标题栏下载列表按钮抖动 connect(ui->appintopage, &AppIntoPage::clickedDownloadBtn, [=]() diff --git a/src/mainwindow-dtk.h b/src/mainwindow-dtk.h index 11fd60e..4831a59 100644 --- a/src/mainwindow-dtk.h +++ b/src/mainwindow-dtk.h @@ -30,6 +30,8 @@ public: void openUrl(const QString &url); bool isCloseWindowAnimation(); + void refreshTheme(bool isDarkMode); + protected: void closeEvent(QCloseEvent *event) override; @@ -48,6 +50,7 @@ private: public slots: void notify(QObject *receiver, QEvent *event); + void onThemeChanged(bool isDark); private slots: //接受来自dbus的url diff --git a/src/spark-store.pro b/src/spark-store.pro index 16dfc5d..481c4db 100644 --- a/src/spark-store.pro +++ b/src/spark-store.pro @@ -35,6 +35,7 @@ PKGCONFIG += dtkcore dtkgui dtkwidget SOURCES += \ backend/DataCollectorAndUploader.cpp \ + backend/ThemeChecker.cpp \ backend/downloadworker.cpp \ backend/image_show.cpp \ backend/sparkapi.cpp \ @@ -60,6 +61,7 @@ SOURCES += \ HEADERS += \ backend/DataCollectorAndUploader.h \ + backend/ThemeChecker.h \ backend/downloadworker.h \ backend/image_show.h \ backend/sparkapi.h \ diff --git a/translations/spark-store_en.ts b/translations/spark-store_en.ts index 1579777..aa11124 100644 --- a/translations/spark-store_en.ts +++ b/translations/spark-store_en.ts @@ -480,33 +480,33 @@ - + Submit App - + Submit App with client(Recommanded) - + Settings - + APP Upgrade and Install Settings - - + + Spark Store - + Search or enter spk:// @@ -516,7 +516,7 @@ - + Spark Store @@ -536,7 +536,7 @@ - + Show MainWindow @@ -658,12 +658,12 @@ TitleBarMenu - + About - + Exit diff --git a/translations/spark-store_es.ts b/translations/spark-store_es.ts index bb740a2..28ee71c 100644 --- a/translations/spark-store_es.ts +++ b/translations/spark-store_es.ts @@ -480,33 +480,33 @@ Actualización de app - + Submit App Presentación de la aplicación - + Submit App with client(Recommanded) Enviar la aplicación al cliente (recomendación) - + Settings Configuración - + APP Upgrade and Install Settings Actualización e instalación de app - - + + Spark Store SPARK Store - + Search or enter spk:// Buscar o introducir spk: /% @@ -516,7 +516,7 @@ - + Spark Store SPARK Store @@ -536,7 +536,7 @@ Descargar lista - + Show MainWindow Mostrar la ventana principal @@ -658,12 +658,12 @@ TitleBarMenu - + About Sobre - + Exit Exportaciones diff --git a/translations/spark-store_fr.ts b/translations/spark-store_fr.ts index abde11d..5801d28 100644 --- a/translations/spark-store_fr.ts +++ b/translations/spark-store_fr.ts @@ -480,33 +480,33 @@ Mise à niveau app - + Submit App Soumettre une application - + Submit App with client(Recommanded) Soumettre une demande au client (recommandé) - + Settings Paramètres - + APP Upgrade and Install Settings Paramètres de mise à niveau et d'installation de l'app - - + + Spark Store Le Spark store - + Search or enter spk:// Rechercher ou entrer SPK / @@ -516,7 +516,7 @@ - + Spark Store Le Spark store @@ -536,7 +536,7 @@ Télécharger la Liste - + Show MainWindow Afficher la fenêtre principale @@ -658,12 +658,12 @@ TitleBarMenu - + About À propos - + Exit Exportations diff --git a/translations/spark-store_zh_CN.ts b/translations/spark-store_zh_CN.ts index 7cb6ae0..8ebdcae 100644 --- a/translations/spark-store_zh_CN.ts +++ b/translations/spark-store_zh_CN.ts @@ -480,33 +480,33 @@ 更新 - + Submit App 投递应用 - + Submit App with client(Recommanded) 使用本地投稿器投递应用(推荐) - + Settings 设置 - + APP Upgrade and Install Settings 应用更新和安装设置 - - + + Spark Store 星火应用商店 - + Search or enter spk:// 搜索或打开链接 @@ -516,7 +516,7 @@ - + Spark Store 星火应用商店 @@ -536,7 +536,7 @@ 下载列表 - + Show MainWindow 显示主窗口 @@ -658,12 +658,12 @@ TitleBarMenu - + About 关于 - + Exit 退出 diff --git a/translations/spark-store_zh_TW.ts b/translations/spark-store_zh_TW.ts index 4aa4b63..3c2f0c3 100644 --- a/translations/spark-store_zh_TW.ts +++ b/translations/spark-store_zh_TW.ts @@ -480,33 +480,33 @@ 軟體更新 - + Submit App 上傳軟體 - + Submit App with client(Recommanded) 從客戶端上傳軟體(推薦的) - + Settings 設定 - + APP Upgrade and Install Settings 軟體升級 和 安裝設定 - - + + Spark Store 星火应用商店 - + Search or enter spk:// 搜索或打开链接 @@ -516,7 +516,7 @@ - + Spark Store 星火应用商店 @@ -536,7 +536,7 @@ 下载列表 - + Show MainWindow 显示主窗口 @@ -658,12 +658,12 @@ TitleBarMenu - + About 关于 - + Exit 退出