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.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

View File

@ -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);

View File

@ -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

View File

@ -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);