From 8d4874d55313545720350619f5562e1dc3bf963b 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 --- src/backend/ThemeChecker.cpp | 44 ++++++++++++ src/backend/ThemeChecker.h | 26 ++++++++ src/mainwindow-dtk.cpp | 126 ++++++++++++++++++++++------------- src/mainwindow-dtk.h | 3 + src/spark-store.pro | 2 + 5 files changed, 153 insertions(+), 48 deletions(-) create mode 100644 src/backend/ThemeChecker.cpp create mode 100644 src/backend/ThemeChecker.h 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..48155bb 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 @@ -267,57 +269,85 @@ 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); + + if (!isUserSetDark && !isUserSetWhite) { + // 否则,根据传入的 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 \