diff --git a/example/T_Settings.qml b/example/T_Settings.qml index cf54b60f..f55df6f0 100644 --- a/example/T_Settings.qml +++ b/example/T_Settings.qml @@ -85,4 +85,38 @@ FluScrollablePage{ } + FluArea{ + Layout.fillWidth: true + Layout.topMargin: 20 + height: 80 + paddings: 10 + + ColumnLayout{ + spacing: 10 + anchors{ + top: parent.top + left: parent.left + } + + FluText{ + text:lang.dark_mode + fontStyle: FluText.BodyStrong + Layout.bottomMargin: 4 + } + + Flow{ + spacing: 5 + FluToggleSwitch{ + text:lang.sys_dark_mode + selected:FluTheme.dark + onClicked:{ + FluTheme.follow_system = true + FluTheme.dark = FluTheme.follow_system + } + } + } + } + + } + } diff --git a/example/lang/En.cpp b/example/lang/En.cpp index facd35d7..be00cd6a 100644 --- a/example/lang/En.cpp +++ b/example/lang/En.cpp @@ -13,6 +13,7 @@ En::En(QObject *parent) theming("Theming"); media("Media"); dark_mode("Dark Mode"); + sys_dark_mode("Sync with system"); search("Search"); about("About"); settings("Settings"); diff --git a/example/lang/Lang.h b/example/lang/Lang.h index 9725c522..074f53dc 100644 --- a/example/lang/Lang.h +++ b/example/lang/Lang.h @@ -16,6 +16,7 @@ class Lang : public QObject Q_PROPERTY_AUTO(QString,theming); Q_PROPERTY_AUTO(QString,media); Q_PROPERTY_AUTO(QString,dark_mode); + Q_PROPERTY_AUTO(QString,sys_dark_mode); Q_PROPERTY_AUTO(QString,search); Q_PROPERTY_AUTO(QString,about); Q_PROPERTY_AUTO(QString,settings); diff --git a/example/lang/Zh.cpp b/example/lang/Zh.cpp index 29739f61..16fa00df 100644 --- a/example/lang/Zh.cpp +++ b/example/lang/Zh.cpp @@ -13,6 +13,7 @@ Zh::Zh(QObject *parent) theming("主题"); media("媒体"); dark_mode("夜间模式"); + sys_dark_mode("跟随系统"); search("查找"); about("关于"); settings("设置"); diff --git a/src/FluTheme.cpp b/src/FluTheme.cpp index d3d7bf1b..4ebdc74b 100644 --- a/src/FluTheme.cpp +++ b/src/FluTheme.cpp @@ -21,4 +21,25 @@ FluTheme::FluTheme(QObject *parent) textSize(13); nativeText(false); frameless(true); + if (follow_system()){dark(isDark());} + (qobject_cast(QCoreApplication::instance()))->installEventFilter(this); +} + +bool FluTheme::eventFilter(QObject *obj, QEvent *event) +{ + Q_UNUSED(obj); + if (event->type() == QEvent::ApplicationPaletteChange) + { + if (follow_system()){dark(isDark());} + event->accept(); + return true; + } + return false; +} + +bool FluTheme::isDark() +{ + QPalette palette = (qobject_cast(QCoreApplication::instance()))->palette(); + QColor color = palette.color(QPalette::Window).rgb(); + return !(color.red() * 0.2126 + color.green() * 0.7152 + color.blue() * 0.0722 > 255 / 2); } diff --git a/src/FluTheme.h b/src/FluTheme.h index 6ce9c7fe..b8712879 100644 --- a/src/FluTheme.h +++ b/src/FluTheme.h @@ -11,6 +11,7 @@ class FluTheme : public QObject Q_PROPERTY_AUTO(FluColorSet*,primaryColor) Q_PROPERTY_AUTO(bool,frameless); Q_PROPERTY_AUTO(bool,dark); + Q_PROPERTY_AUTO(bool,follow_system); Q_PROPERTY_AUTO(bool,nativeText); Q_PROPERTY_AUTO(int,textSize); public: @@ -18,7 +19,8 @@ public: static FluTheme *getInstance(); private: static FluTheme* m_instance; - + bool eventFilter(QObject *obj, QEvent *event); + bool isDark(); }; #endif // FLUTHEME_H