#include "./initiatequick.h" #include "./controller.h" #ifdef Q_OS_ANDROID #include "./android.h" #endif #include "resources/config.h" #include "resources/qtconfig.h" // enable inline helper functions for Qt Quick provided by qtutilities #define QT_UTILITIES_GUI_QTQUICK // ensure QGuiApplication is defined before resources.h for desktop file name #ifdef PASSWORD_MANAGER_GUI_QTWIDGETS #include using App = QApplication; #else #include using App = QGuiApplication; #endif #include #include #include #include #include #include #include #include #include #include #include using namespace CppUtilities; using namespace Util; namespace QtGui { int runQuickGui(int argc, char *argv[], const QtConfigArguments &qtConfigArgs, const QString &file) { // setup Android-specifics (logging, theming) #ifdef Q_OS_ANDROID setupAndroidSpecifics(); #endif // init OpenSSL OpenSsl::init(); // init application SET_QT_APPLICATION_INFO; auto application = App(argc, argv); QObject::connect(&application, &QCoreApplication::aboutToQuit, &OpenSsl::clean); // restore Qt settings auto qtSettings = QtUtilities::QtSettings(); auto settings = QtUtilities::getSettings(QStringLiteral(PROJECT_NAME)); if (auto settingsError = QtUtilities::errorMessageForSettings(*settings); !settingsError.isEmpty()) { qDebug() << settingsError; } qtSettings.restore(*settings); qtSettings.apply(); // 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 qtConfigArgs.applySettings(qtSettings.hasCustomFont()); qtConfigArgs.applySettingsForQuickGui(); LOAD_QT_TRANSLATIONS; // init QML engine auto engine = QQmlApplicationEngine(); #ifdef Q_OS_ANDROID registerControllerForAndroid(&controller); #endif auto *const context = engine.rootContext(); context->setContextProperty(QStringLiteral("nativeInterface"), &controller); context->setContextProperty(QStringLiteral("app"), &application); context->setContextProperty(QStringLiteral("description"), QStringLiteral(APP_DESCRIPTION)); context->setContextProperty(QStringLiteral("dependencyVersions"), QStringList(DEPENCENCY_VERSIONS)); #if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) const auto importPaths = qEnvironmentVariable(PROJECT_VARNAME_UPPER "_QML_IMPORT_PATHS").split(QChar(':')); for (const auto &path : importPaths) { engine.addImportPath(path); } #endif // load main QML file; run event loop or exit if it cannot be loaded const auto mainUrl = QUrl(QStringLiteral("qrc:/qml/main.qml")); QObject::connect( &engine, &QQmlApplicationEngine::objectCreated, &application, [&mainUrl](QObject *obj, const QUrl &objUrl) { if (!obj && objUrl == mainUrl) { QCoreApplication::exit(EXIT_FAILURE); } }, Qt::QueuedConnection); engine.load(mainUrl); return application.exec(); } } // namespace QtGui