Add approach for handling darkmode changes dynamically

This seems to work for plain QCC2 parts but unfortunately doesn't help with
Kirigami (see added not). Hence this is disabled for now.
This commit is contained in:
Martchus 2024-03-31 22:53:32 +02:00
parent ba9a6e26de
commit 21a16e0be0
4 changed files with 42 additions and 4 deletions

View File

@ -1,6 +1,8 @@
import QtQuick 2.7 import QtQuick 2.7
import QtQuick.Templates 2.0 as T2 import QtQuick.Templates 2.0 as T2
import QtQuick.Controls 2.1 as Controls import QtQuick.Controls 2.1 as Controls
import QtQuick.Controls.Material
import QtQuick.Controls.Universal
import QtQuick.Layouts 1.2 import QtQuick.Layouts 1.2
import org.kde.kirigami 2.4 as Kirigami import org.kde.kirigami 2.4 as Kirigami
@ -9,6 +11,9 @@ Kirigami.ApplicationWindow {
property var fieldsPage: undefined property var fieldsPage: undefined
property var lastEntriesPage: undefined property var lastEntriesPage: undefined
Material.theme: nativeInterface.darkModeEnabled ? Material.Dark : Material.Light
Universal.theme: nativeInterface.darkModeEnabled ? Universal.Dark : Universal.Light
globalDrawer: Kirigami.GlobalDrawer { globalDrawer: Kirigami.GlobalDrawer {
id: leftMenu id: leftMenu
property bool showNoPasswordWarning: nativeInterface.fileOpen property bool showNoPasswordWarning: nativeInterface.fileOpen

View File

@ -50,7 +50,8 @@ Controller::Controller(QSettings &settings, const QString &filePath, QObject *pa
#else #else
false false
#endif #endif
) )
, m_darkModeEnabled(false)
{ {
m_fieldModel.setPasswordVisibility(PasswordVisibility::Never); m_fieldModel.setPasswordVisibility(PasswordVisibility::Never);
m_entryFilterModel.setFilterCaseSensitivity(Qt::CaseInsensitive); m_entryFilterModel.setFilterCaseSensitivity(Qt::CaseInsensitive);

View File

@ -44,6 +44,7 @@ class Controller : public QObject {
Q_PROPERTY(QUndoStack *undoStack READ undoStack NOTIFY undoStackChanged) Q_PROPERTY(QUndoStack *undoStack READ undoStack NOTIFY undoStackChanged)
Q_PROPERTY(QString undoText READ undoText NOTIFY undoTextChanged) Q_PROPERTY(QString undoText READ undoText NOTIFY undoTextChanged)
Q_PROPERTY(QString redoText READ redoText NOTIFY redoTextChanged) Q_PROPERTY(QString redoText READ redoText NOTIFY redoTextChanged)
Q_PROPERTY(bool darkModeEnabled READ isDarkModeEnabled WRITE setDarkModeEnabled NOTIFY darkModeEnabledChanged)
public: public:
explicit Controller(QSettings &settings, const QString &filePath = QString(), QObject *parent = nullptr); explicit Controller(QSettings &settings, const QString &filePath = QString(), QObject *parent = nullptr);
@ -86,6 +87,8 @@ public:
QString undoText() const; QString undoText() const;
QString redoText() const; QString redoText() const;
Io::PasswordFileSaveFlags prepareSaving(); Io::PasswordFileSaveFlags prepareSaving();
bool isDarkModeEnabled() const;
void setDarkModeEnabled(bool darkModeEnabled);
public Q_SLOTS: public Q_SLOTS:
void init(); void init();
@ -129,6 +132,7 @@ Q_SIGNALS:
void undoTextChanged(const QString &undoText); void undoTextChanged(const QString &undoText);
void redoTextChanged(const QString &redoText); void redoTextChanged(const QString &redoText);
void settingsError(const QString &errorMessage); void settingsError(const QString &errorMessage);
void darkModeEnabledChanged(bool darkModeEnabled);
private Q_SLOTS: private Q_SLOTS:
void handleEntriesRemoved(const QModelIndex &parentIndex, int first, int last); void handleEntriesRemoved(const QModelIndex &parentIndex, int first, int last);
@ -160,6 +164,7 @@ private:
bool m_fileModified; bool m_fileModified;
bool m_useNativeFileDialog; bool m_useNativeFileDialog;
bool m_filterAsDialog; bool m_filterAsDialog;
bool m_darkModeEnabled;
}; };
inline QModelIndex Controller::ensureSourceEntryIndex(const QModelIndex &entryIndexMaybeFromFilterModel) const inline QModelIndex Controller::ensureSourceEntryIndex(const QModelIndex &entryIndexMaybeFromFilterModel) const
@ -345,6 +350,18 @@ inline QString Controller::redoText() const
#endif #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() inline void Controller::undo()
{ {
#ifdef PASSWORD_MANAGER_UNDO_SUPPORT #ifdef PASSWORD_MANAGER_UNDO_SUPPORT

View File

@ -61,8 +61,24 @@ int runQuickGui(int argc, char *argv[], const QtConfigArguments &qtConfigArgs, c
} }
qtSettings.restore(*settings); qtSettings.restore(*settings);
qtSettings.apply(); 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 #endif
// apply settings specified via command line args // apply settings specified via command line args
@ -71,7 +87,6 @@ int runQuickGui(int argc, char *argv[], const QtConfigArguments &qtConfigArgs, c
LOAD_QT_TRANSLATIONS; LOAD_QT_TRANSLATIONS;
// init QML engine // init QML engine
auto controller = Controller(*settings, file);
auto engine = QQmlApplicationEngine(); auto engine = QQmlApplicationEngine();
#ifdef Q_OS_ANDROID #ifdef Q_OS_ANDROID
registerControllerForAndroid(&controller); registerControllerForAndroid(&controller);