diff --git a/qml/main.qml b/qml/main.qml index 4c01440..cd133c8 100644 --- a/qml/main.qml +++ b/qml/main.qml @@ -1,6 +1,8 @@ import QtQuick 2.7 import QtQuick.Templates 2.0 as T2 import QtQuick.Controls 2.1 as Controls +import QtQuick.Controls.Material +import QtQuick.Controls.Universal import QtQuick.Layouts 1.2 import org.kde.kirigami 2.4 as Kirigami @@ -9,6 +11,9 @@ Kirigami.ApplicationWindow { property var fieldsPage: undefined property var lastEntriesPage: undefined + Material.theme: nativeInterface.darkModeEnabled ? Material.Dark : Material.Light + Universal.theme: nativeInterface.darkModeEnabled ? Universal.Dark : Universal.Light + globalDrawer: Kirigami.GlobalDrawer { id: leftMenu property bool showNoPasswordWarning: nativeInterface.fileOpen diff --git a/quickgui/controller.cpp b/quickgui/controller.cpp index 3f99a71..145f41a 100644 --- a/quickgui/controller.cpp +++ b/quickgui/controller.cpp @@ -50,7 +50,8 @@ Controller::Controller(QSettings &settings, const QString &filePath, QObject *pa #else false #endif - ) + ) + , m_darkModeEnabled(false) { m_fieldModel.setPasswordVisibility(PasswordVisibility::Never); m_entryFilterModel.setFilterCaseSensitivity(Qt::CaseInsensitive); diff --git a/quickgui/controller.h b/quickgui/controller.h index 5120ded..653844a 100644 --- a/quickgui/controller.h +++ b/quickgui/controller.h @@ -44,6 +44,7 @@ class Controller : public QObject { Q_PROPERTY(QUndoStack *undoStack READ undoStack NOTIFY undoStackChanged) Q_PROPERTY(QString undoText READ undoText NOTIFY undoTextChanged) Q_PROPERTY(QString redoText READ redoText NOTIFY redoTextChanged) + Q_PROPERTY(bool darkModeEnabled READ isDarkModeEnabled WRITE setDarkModeEnabled NOTIFY darkModeEnabledChanged) public: explicit Controller(QSettings &settings, const QString &filePath = QString(), QObject *parent = nullptr); @@ -86,6 +87,8 @@ public: QString undoText() const; QString redoText() const; Io::PasswordFileSaveFlags prepareSaving(); + bool isDarkModeEnabled() const; + void setDarkModeEnabled(bool darkModeEnabled); public Q_SLOTS: void init(); @@ -129,6 +132,7 @@ Q_SIGNALS: void undoTextChanged(const QString &undoText); void redoTextChanged(const QString &redoText); void settingsError(const QString &errorMessage); + void darkModeEnabledChanged(bool darkModeEnabled); private Q_SLOTS: void handleEntriesRemoved(const QModelIndex &parentIndex, int first, int last); @@ -160,6 +164,7 @@ private: bool m_fileModified; bool m_useNativeFileDialog; bool m_filterAsDialog; + bool m_darkModeEnabled; }; inline QModelIndex Controller::ensureSourceEntryIndex(const QModelIndex &entryIndexMaybeFromFilterModel) const @@ -345,6 +350,18 @@ inline QString Controller::redoText() const #endif } +inline bool Controller::isDarkModeEnabled() const +{ + return m_darkModeEnabled; +} + +inline void Controller::setDarkModeEnabled(bool darkModeEnabled) +{ + if (darkModeEnabled != m_darkModeEnabled) { + emit darkModeEnabledChanged(m_darkModeEnabled = darkModeEnabled); + } +} + inline void Controller::undo() { #ifdef PASSWORD_MANAGER_UNDO_SUPPORT diff --git a/quickgui/initiatequick.cpp b/quickgui/initiatequick.cpp index 5b80a94..117bca8 100644 --- a/quickgui/initiatequick.cpp +++ b/quickgui/initiatequick.cpp @@ -61,8 +61,24 @@ int runQuickGui(int argc, char *argv[], const QtConfigArguments &qtConfigArgs, c } qtSettings.restore(*settings); qtSettings.apply(); -#if defined(Q_OS_ANDROID) - qtSettings.reapplyDefaultIconTheme(QtUtilities::isDarkModeEnabled().value_or(false)); + + // create controller and handle dark mode + // note: Not handling changes of the dark mode setting dynamically yet because it does not work with Kirigami. + // It looks like Kirigami does not follow the QCC2 theme (the Material.theme/Material.theme settings) but + // instead uses colors based on the initial palette. Not sure how to toggle Kirigami's palette in accordance + // with the QCC2 theme. Hence this code is disabled via APPLY_COLOR_SCHEME_DYNAMICALLY for now. + auto controller = Controller(*settings, file); +#ifdef APPLY_COLOR_SCHEME_DYNAMICALLY + QtUtilities::onDarkModeChanged( + [&qtSettings, &controller](bool isDarkModeEnabled) { + qtSettings.reapplyDefaultIconTheme(isDarkModeEnabled); + controller.setDarkModeEnabled(isDarkModeEnabled); + }, + &controller); +#else + const auto isDarkModeEnabled = QtUtilities::isDarkModeEnabled().value_or(false); + qtSettings.reapplyDefaultIconTheme(isDarkModeEnabled); + controller.setDarkModeEnabled(isDarkModeEnabled); #endif // apply settings specified via command line args @@ -71,7 +87,6 @@ int runQuickGui(int argc, char *argv[], const QtConfigArguments &qtConfigArgs, c LOAD_QT_TRANSLATIONS; // init QML engine - auto controller = Controller(*settings, file); auto engine = QQmlApplicationEngine(); #ifdef Q_OS_ANDROID registerControllerForAndroid(&controller);