diff --git a/core/pref.h b/core/pref.h index 6949b762c..cfad1abfe 100644 --- a/core/pref.h +++ b/core/pref.h @@ -59,6 +59,7 @@ typedef struct { const char *device_name; } dive_computer_prefs_t; +// NOTE: these enums are duplicated in mobile-widgets/qmlinterface.h enum unit_system_values { METRIC, IMPERIAL, diff --git a/core/units.h b/core/units.h index ff34991f7..8839dde1d 100644 --- a/core/units.h +++ b/core/units.h @@ -275,6 +275,7 @@ static inline int32_t pressure_to_altitude(int32_t pressure) // pressure in mbar * keeps track of those units. */ /* turns out in Win32 PASCAL is defined as a calling convention */ +/* NOTE: these enums are duplicated in mobile-widgets/qmlinterface.h */ struct units { enum LENGTH { METERS, diff --git a/mobile-widgets/CMakeLists.txt b/mobile-widgets/CMakeLists.txt index 1eecb7d3b..6c1747dbc 100644 --- a/mobile-widgets/CMakeLists.txt +++ b/mobile-widgets/CMakeLists.txt @@ -1,6 +1,7 @@ # mobile backend functions set(SUBSURFACE_MOBILE_SRCS + qmlinterface.cpp qmlmanager.cpp qml/kirigami/src/columnview.cpp qml/kirigami/src/delegaterecycler.cpp diff --git a/mobile-widgets/qmlinterface.cpp b/mobile-widgets/qmlinterface.cpp new file mode 100644 index 000000000..78aba6a5c --- /dev/null +++ b/mobile-widgets/qmlinterface.cpp @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: GPL-2.0 +#include "qmlinterface.h" + +#include + +QMLInterface *QMLInterface::instance() +{ + static QMLInterface *self = new QMLInterface; + return self; +} + +void QMLInterface::setup(QQmlContext *ct) +{ + // Register interface class + ct->setContextProperty("Backend", QMLInterface::instance()); + + // Make enums available as types + qmlRegisterUncreatableType("org.subsurfacedivelog.mobile",1,0,"Enums","Enum is not a type"); + + // relink signals to QML +} diff --git a/mobile-widgets/qmlinterface.h b/mobile-widgets/qmlinterface.h new file mode 100644 index 000000000..59981e0d1 --- /dev/null +++ b/mobile-widgets/qmlinterface.h @@ -0,0 +1,95 @@ +// SPDX-License-Identifier: GPL-2.0 +#ifndef QMLINTERFACE_H +#define QMLINTERFACE_H +#include +#include +// This class is a pure interface class and may not contain any implementation code +// Allowed are: +// header +// Q_PROPERTY +// signal/slot for Q_PROPERTY functions +// the functions may contain either +// a) a function call to the implementation +// b) a reference to a global variable like e.g. prefs. +// Q_INVOCABLE functions +// the functions may contain +// a) a function call to the implementation +// source +// connect signal/signal to pass signals from implementation + + +class QMLInterface : public QObject { + Q_OBJECT + + // Q_PROPERTY used in QML + +public: + static QMLInterface *instance(); + + // function to do the needed setup and do connect of signal/signal + static void setup(QQmlContext *ct); + + // Duplicated enums, these enums are properly defined in the C/C++ structure + // but duplicated here to make them available to QML. + + // Duplicating the enums poses a slight risk for forgetting to update + // them if the proper enum is changed (e.g. assigning a new start value). + + // remark please do not use these enums outside the C++/QML interface. + enum UNIT_SYSTEM { + METRIC, + IMPERIAL, + PERSONALIZE + }; + Q_ENUM(UNIT_SYSTEM); + + enum LENGTH { + METERS, + FEET + }; + Q_ENUM(LENGTH); + + enum VOLUME { + LITER, + CUFT + }; + Q_ENUM(VOLUME); + + enum PRESSURE { + BAR, + PSI, + PASCALS + }; + Q_ENUM(PRESSURE); + + enum TEMPERATURE { + CELSIUS, + FAHRENHEIT, + KELVIN + }; + Q_ENUM(TEMPERATURE); + + enum WEIGHT { + KG, + LBS + }; + Q_ENUM(WEIGHT); + + enum TIME { + SECONDS, + MINUTES + }; + Q_ENUM(TIME); + + enum DURATION { + MIXED, + MINUTES_ONLY, + ALWAYS_HOURS + }; + Q_ENUM(DURATION); + +private: + QMLInterface() {} +}; +#endif // QMLINTERFACE_H + diff --git a/packaging/ios/Subsurface-mobile.pro b/packaging/ios/Subsurface-mobile.pro index 4b8aa079c..afe2e10c5 100644 --- a/packaging/ios/Subsurface-mobile.pro +++ b/packaging/ios/Subsurface-mobile.pro @@ -110,6 +110,7 @@ SOURCES += ../../subsurface-mobile-main.cpp \ ../../core/subsurface-qt/DiveListNotifier.cpp \ ../../backend-shared/exportfuncs.cpp \ ../../backend-shared/plannershared.cpp \ + ../../mobile-widgets/qmlinterface.cpp \ ../../mobile-widgets/qmlmanager.cpp \ ../../qt-models/divelistmodel.cpp \ ../../qt-models/diveplotdatamodel.cpp \ @@ -242,6 +243,7 @@ HEADERS += \ ../../core/subsurface-qt/DiveListNotifier.h \ ../../backend-shared/exportfuncs.h \ ../../backend-shared/plannershared.h \ + ../../mobile-widgets/qmlinterface.h \ ../../mobile-widgets/qmlmanager.h \ ../../map-widget/qmlmapwidgethelper.h \ ../../qt-models/divelistmodel.h \