diff options
Diffstat (limited to 'subsurface-helper.cpp')
-rw-r--r-- | subsurface-helper.cpp | 124 |
1 files changed, 122 insertions, 2 deletions
diff --git a/subsurface-helper.cpp b/subsurface-helper.cpp index 6a2383f08..b58f8b4aa 100644 --- a/subsurface-helper.cpp +++ b/subsurface-helper.cpp @@ -1,21 +1,60 @@ // SPDX-License-Identifier: GPL-2.0 #include <QQmlEngine> +#include <QDesktopWidget> +#include <QApplication> #include <QDebug> #include <QQuickItem> +#include "map-widget/qmlmapwidgethelper.h" +#include "qt-models/maplocationmodel.h" #include "core/qt-gui.h" #include "core/settings/qPref.h" +#include "core/ssrf.h" + #ifdef SUBSURFACE_MOBILE +#include <QQmlApplicationEngine> +#include <QQmlContext> #include "mobile-widgets/qmlmanager.h" #include "mobile-widgets/qmlprefs.h" #include "qt-models/divelistmodel.h" #include "qt-models/gpslistmodel.h" +#include "qt-models/messagehandlermodel.h" #include "profile-widget/qmlprofile.h" #include "core/downloadfromdcthread.h" #include "qt-models/diveimportedmodel.h" +#include "mobile-widgets/qml/kirigami/src/kirigamiplugin.h" +#else +#include "desktop-widgets/mainwindow.h" +#include "core/pluginmanager.h" #endif -#include "map-widget/qmlmapwidgethelper.h" -#include "qt-models/maplocationmodel.h" + +QObject *qqWindowObject = NULL; + +void init_ui() +{ + init_qt_late(); +#ifndef SUBSURFACE_MOBILE + PluginManager::instance().loadPlugins(); + + MainWindow *window = new MainWindow(); + window->setTitle(); +#endif +} + +void exit_ui() +{ +#ifndef SUBSURFACE_MOBILE + delete MainWindow::instance(); +#endif + delete qApp; + free((void *)existing_filename); +} + +double get_screen_dpi() +{ + QDesktopWidget *mydesk = qApp->desktop(); + return mydesk->physicalDpiX(); +} void register_qml_types() { @@ -55,3 +94,84 @@ void register_qml_types() if (rc < 0) qDebug() << "ERROR: Cannot register MapLocation, QML will not work!!"; } + +void run_ui() +{ + register_qml_types(); + +#ifdef SUBSURFACE_MOBILE + QQmlApplicationEngine engine; + LOG_STP("run_ui qml engine started"); + KirigamiPlugin::getInstance().registerTypes(); +#if defined(__APPLE__) && !defined(Q_OS_IOS) + // when running the QML UI on a Mac the deployment of the QML Components seems + // to fail and the search path for the components is rather odd - simply the + // same directory the executable was started from <bundle>/Contents/MacOS/ + // To work around this we need to manually copy the components at install time + // to Contents/Frameworks/qml and make sure that we add the correct import path + QStringList importPathList = engine.importPathList(); + Q_FOREACH(QString importPath, importPathList) { + if (importPath.contains("MacOS")) + engine.addImportPath(importPath.replace("MacOS", "Frameworks")); + } + qDebug() << "QML import path" << engine.importPathList(); +#endif + engine.addImportPath("qrc://imports"); + DiveListModel diveListModel; + LOG_STP("run_ui diveListModel started"); + DiveListSortModel *sortModel = new DiveListSortModel(0); + sortModel->setSourceModel(&diveListModel); + sortModel->setDynamicSortFilter(true); + sortModel->setSortRole(DiveListModel::DiveDateRole); + sortModel->sort(0, Qt::DescendingOrder); + LOG_STP("run_ui diveListModel sorted"); + GpsListModel gpsListModel; + QSortFilterProxyModel *gpsSortModel = new QSortFilterProxyModel(0); + gpsSortModel->setSourceModel(&gpsListModel); + gpsSortModel->setDynamicSortFilter(true); + gpsSortModel->setSortRole(GpsListModel::GpsWhenRole); + gpsSortModel->sort(0, Qt::DescendingOrder); + QQmlContext *ctxt = engine.rootContext(); + ctxt->setContextProperty("diveModel", sortModel); + ctxt->setContextProperty("gpsModel", gpsSortModel); + ctxt->setContextProperty("vendorList", vendorList); + set_non_bt_addresses(); + LOG_STP("run_ui set_non_bt_adresses"); + + ctxt->setContextProperty("connectionListModel", &connectionListModel); + ctxt->setContextProperty("logModel", MessageHandlerModel::self()); + + engine.load(QUrl(QStringLiteral("qrc:///qml/main.qml"))); + LOG_STP("run_ui qml loaded"); + qqWindowObject = engine.rootObjects().value(0); + if (!qqWindowObject) { + fprintf(stderr, "can't create window object\n"); + exit(1); + } + QQuickWindow *qml_window = qobject_cast<QQuickWindow *>(qqWindowObject); + qml_window->setIcon(QIcon(":subsurface-mobile-icon")); + qqWindowObject->setProperty("messageText", QVariant("Subsurface-mobile startup")); + qDebug() << "qqwindow devicePixelRatio" << qml_window->devicePixelRatio() << qml_window->screen()->devicePixelRatio(); + QScreen *screen = qml_window->screen(); + QObject::connect(qml_window, &QQuickWindow::screenChanged, QMLManager::instance(), &QMLManager::screenChanged); + QMLManager *manager = QMLManager::instance(); + LOG_STP("run_ui qmlmanager instance started"); + // now that the log file is initialized... + show_computer_list(); + LOG_STP("run_ui show_computer_list"); + + manager->setDevicePixelRatio(qml_window->devicePixelRatio(), qml_window->screen()); + manager->dlSortModel = sortModel; + manager->screenChanged(screen); + qDebug() << "qqwindow screen has ldpi/pdpi" << screen->logicalDotsPerInch() << screen->physicalDotsPerInch(); +#if !defined(Q_OS_ANDROID) && !defined(Q_OS_IOS) + qml_window->setHeight(1200); + qml_window->setWidth(800); +#endif + qml_window->show(); + LOG_STP("run_ui running exec"); +#else + MainWindow::instance()->show(); +#endif + qApp->exec(); +} |