mirror of
https://github.com/subsurface/subsurface.git
synced 2024-11-28 05:00:20 +00:00
mobile-widgets: add pure interface for passing values to QML
Add a header file that contains a duplicate of the enums, that are needed in QML in one class. the unit enums are added imidiatly, since they are needed or will be neede shortly in Settings and DivePlannerSettings This class will also contain Q_PROPERTY and signal/slot for variables used in QML. This is done to allow e.g. deco_mode qPrefUnits::planner_deco_mode() void qPrefUnits::set_planner_deco_mode(deco_mode) as strongly typed in C++ and DECO_MODE planner_deco_mode() void set_planner_deco_mode(DECO_MODE) as strongly typed in QML Remark: wrong assignments gives errors in QML The advantage over using strings or the value directly is that QML detects typos and flags them as errors/warnings. It is important to note that the class may only contain a) a function call to the implementation b) a reference to a global variable e.g. prefs. Added note to the original definitions of the enums that they have been duplicated. Signed-off-by: jan Iversen <jan@casacondor.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
parent
fe8b7e3b72
commit
fdc2fd35bf
6 changed files with 121 additions and 0 deletions
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
21
mobile-widgets/qmlinterface.cpp
Normal file
21
mobile-widgets/qmlinterface.cpp
Normal file
|
@ -0,0 +1,21 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
#include "qmlinterface.h"
|
||||
|
||||
#include <QQmlEngine>
|
||||
|
||||
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<QMLInterface>("org.subsurfacedivelog.mobile",1,0,"Enums","Enum is not a type");
|
||||
|
||||
// relink signals to QML
|
||||
}
|
95
mobile-widgets/qmlinterface.h
Normal file
95
mobile-widgets/qmlinterface.h
Normal file
|
@ -0,0 +1,95 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
#ifndef QMLINTERFACE_H
|
||||
#define QMLINTERFACE_H
|
||||
#include <QObject>
|
||||
#include <QQmlContext>
|
||||
// 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
|
||||
|
|
@ -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 \
|
||||
|
|
Loading…
Reference in a new issue