Compare commits

...

4 commits

Author SHA1 Message Date
Dirk Hohndel
78e2952e57
Merge 5d38fd3fe8 into be6b017534 2024-11-27 08:30:19 +13:00
Michael Keller
be6b017534 Update the Windows MXE Build Image to 3.4.0.
Signed-off-by: Michael Keller <github@ike.ch>
2024-11-27 08:29:40 +13:00
Dirk Hohndel
5d38fd3fe8 Make googlemaps compile with Qt5 and Qt6
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2024-08-27 22:34:57 -07:00
Egbertdepauw
1742d6eabb qt6: Make subsurface buildable with Qt6 on Macos
Building on macos with the Qt6 framework.

made changes to several files to make it possible to build subsurface
desktop with the Qt 6.5.x and higher framework.

Tested versions: 6.5.2, 6.6.3, 6.7.2

code builds and googlemaps works, made some adjustments to get panning
and zooming with mouse or trackpad working.

See issue #3577 "Build Fails, macOS" for build details.

Signed-off-by: Egbertdepauw <egbert@despaankamer.nl>
2024-08-27 22:34:57 -07:00
6 changed files with 85 additions and 37 deletions

View file

@ -16,7 +16,7 @@ jobs:
build: build:
runs-on: ubuntu-latest runs-on: ubuntu-latest
container: container:
image: docker://subsurface/mxe-build:3.3.0 image: docker://subsurface/mxe-build:3.4.0
steps: steps:
- name: checkout sources - name: checkout sources

View file

@ -1,7 +1,7 @@
// SPDX-License-Identifier: GPL-2.0 // SPDX-License-Identifier: GPL-2.0
import QtQuick 2.5 import QtQuick
import QtLocation 5.3 import QtLocation
import QtPositioning 5.3 import QtPositioning
import org.subsurfacedivelog.mobile 1.0 import org.subsurfacedivelog.mobile 1.0
Item { Item {
@ -15,7 +15,7 @@ Item {
id: mapHelper id: mapHelper
map: map map: map
editMode: false editMode: false
onSelectedDivesChanged: rootItem.selectedDivesChanged(list) onSelectedDivesChanged: (list) => { rootItem.selectedDivesChanged(list) }
onEditModeChanged: editMessage.isVisible = editMode === true ? 1 : 0 onEditModeChanged: editMessage.isVisible = editMode === true ? 1 : 0
onCoordinatesChanged: {} onCoordinatesChanged: {}
Component.onCompleted: { Component.onCompleted: {
@ -29,7 +29,6 @@ Item {
id: map id: map
anchors.fill: parent anchors.fill: parent
zoomLevel: defaultZoomIn zoomLevel: defaultZoomIn
property var mapType property var mapType
readonly property var defaultCenter: QtPositioning.coordinate(0, 0) readonly property var defaultCenter: QtPositioning.coordinate(0, 0)
readonly property real defaultZoomIn: 12.0 readonly property real defaultZoomIn: 12.0
@ -41,12 +40,46 @@ Item {
property real newZoomOut: 1.0 property real newZoomOut: 1.0
property var clickCoord: QtPositioning.coordinate(0, 0) property var clickCoord: QtPositioning.coordinate(0, 0)
property bool isReady: false property bool isReady: false
Component.onCompleted: isReady = true Component.onCompleted: isReady = true
onZoomLevelChanged: { onZoomLevelChanged: {
if (isReady) if (isReady)
mapHelper.calculateSmallCircleRadius(map.center) mapHelper.calculateSmallCircleRadius(map.center)
} }
property geoCoordinate startCentroid
startCentroid: newCenter
PinchHandler {
id: pinch
target: null
onActiveChanged: if (active) {
map.startCentroid = map.toCoordinate(pinch.centroid.position, false)
}
onScaleChanged: (delta) => {
map.zoomLevel += Math.log2(delta)
map.alignCoordinateToPoint(map.startCentroid, pinch.centroid.position)
}
onRotationChanged: (delta) => {
map.bearing -= delta
map.alignCoordinateToPoint(map.startCentroid, pinch.centroid.position)
}
grabPermissions: PointerHandler.TakeOverForbidden
}
WheelHandler {
id: wheel
// workaround for QTBUG-87646 / QTBUG-112394 / QTBUG-112432:
// Magic Mouse pretends to be a trackpad but doesn't work with PinchHandler
// and we don't yet distinguish mice and trackpads on Wayland either
acceptedDevices: Qt.platform.pluginName === "cocoa" || Qt.platform.pluginName === "wayland"
? PointerDevice.Mouse | PointerDevice.TouchPad
: PointerDevice.Mouse
rotationScale: 1/120
property: "zoomLevel"
}
DragHandler {
id: drag
target: null
onTranslationChanged: (delta) => map.pan(-delta.x, -delta.y)
}
MapItemView { MapItemView {
id: mapItemView id: mapItemView
@ -67,7 +100,9 @@ Item {
} }
MouseArea { MouseArea {
drag.target: (mapHelper.editMode && model.isSelected) ? mapItem : undefined drag.target: (mapHelper.editMode && model.isSelected) ? mapItem : undefined
anchors.fill: parent anchors.fill: parent
hoverEnabled: true
onClicked: { onClicked: {
if (!mapHelper.editMode && model.divesite) if (!mapHelper.editMode && model.divesite)
mapHelper.selectedLocationChanged(model.divesite) mapHelper.selectedLocationChanged(model.divesite)
@ -122,8 +157,8 @@ Item {
MouseArea { MouseArea {
anchors.fill: parent anchors.fill: parent
onPressed: { map.stopZoomAnimations(); mouse.accepted = false } onPressed: (mouse) => { map.stopZoomAnimations(); mouse.accepted = false }
onWheel: { map.stopZoomAnimations(); wheel.accepted = false } onWheel: (wheel) => { map.stopZoomAnimations(); wheel.accepted = false }
onDoubleClicked: map.doubleClickHandler(map.toCoordinate(Qt.point(mouseX, mouseY))) onDoubleClicked: map.doubleClickHandler(map.toCoordinate(Qt.point(mouseX, mouseY)))
} }

View file

@ -4,20 +4,20 @@
#include <QDebug> #include <QDebug>
#include <QVector> #include <QVector>
#include "qmlmapwidgethelper.h"
#include "core/divefilter.h" #include "core/divefilter.h"
#include "core/divelist.h" #include "core/divelist.h"
#include "core/divelog.h" #include "core/divelog.h"
#include "core/divesite.h" #include "core/divesite.h"
#include "core/qthelper.h" #include "core/qthelper.h"
#include "core/range.h" #include "core/range.h"
#include "qt-models/maplocationmodel.h" #include "qmlmapwidgethelper.h"
#include "qt-models/divelocationmodel.h" #include "qt-models/divelocationmodel.h"
#include "qt-models/maplocationmodel.h"
#ifndef SUBSURFACE_MOBILE #ifndef SUBSURFACE_MOBILE
#include "desktop-widgets/mapwidget.h" #include "desktop-widgets/mapwidget.h"
#endif #endif
#define SMALL_CIRCLE_RADIUS_PX 26.0 #define SMALL_CIRCLE_RADIUS_PX 26.0
MapWidgetHelper::MapWidgetHelper(QObject *parent) : QObject(parent) MapWidgetHelper::MapWidgetHelper(QObject *parent) : QObject(parent)
{ {
@ -44,7 +44,7 @@ void MapWidgetHelper::centerOnDiveSite(struct dive_site *ds)
} else { } else {
// dive site with GPS // dive site with GPS
m_mapLocationModel->setSelected(ds); m_mapLocationModel->setSelected(ds);
QGeoCoordinate dsCoord (ds->location.lat.udeg * 0.000001, ds->location.lon.udeg * 0.000001); QGeoCoordinate dsCoord(ds->location.lat.udeg * 0.000001, ds->location.lon.udeg * 0.000001);
QMetaObject::invokeMethod(m_map, "centerOnCoordinate", Q_ARG(QVariant, QVariant::fromValue(dsCoord))); QMetaObject::invokeMethod(m_map, "centerOnCoordinate", Q_ARG(QVariant, QVariant::fromValue(dsCoord)));
} }
} }
@ -69,7 +69,7 @@ void MapWidgetHelper::centerOnSelectedDiveSite()
// find the most top-left and bottom-right dive sites on the map coordinate system. // find the most top-left and bottom-right dive sites on the map coordinate system.
qreal minLat = 0.0, minLon = 0.0, maxLat = 0.0, maxLon = 0.0; qreal minLat = 0.0, minLon = 0.0, maxLat = 0.0, maxLon = 0.0;
int count = 0; int count = 0;
for(struct dive_site *dss: selDS) { for (struct dive_site *dss : selDS) {
if (!has_location(&dss->location)) if (!has_location(&dss->location))
continue; continue;
qreal lat = dss->location.lat.udeg * 0.000001; qreal lat = dss->location.lat.udeg * 0.000001;
@ -92,7 +92,7 @@ void MapWidgetHelper::centerOnSelectedDiveSite()
// Pass coordinates to QML, either as a point or as a rectangle. // Pass coordinates to QML, either as a point or as a rectangle.
// If we didn't find any coordinates, do nothing. // If we didn't find any coordinates, do nothing.
if (count == 1) { if (count == 1) {
QGeoCoordinate dsCoord (selDS[0]->location.lat.udeg * 0.000001, selDS[0]->location.lon.udeg * 0.000001); QGeoCoordinate dsCoord(selDS[0]->location.lat.udeg * 0.000001, selDS[0]->location.lon.udeg * 0.000001);
QMetaObject::invokeMethod(m_map, "centerOnCoordinate", Q_ARG(QVariant, QVariant::fromValue(dsCoord))); QMetaObject::invokeMethod(m_map, "centerOnCoordinate", Q_ARG(QVariant, QVariant::fromValue(dsCoord)));
} else if (count > 1) { } else if (count > 1) {
QGeoCoordinate coordTopLeft(minLat, minLon); QGeoCoordinate coordTopLeft(minLat, minLon);
@ -134,7 +134,7 @@ void MapWidgetHelper::selectedLocationChanged(struct dive_site *ds_in)
return; return;
QGeoCoordinate locationCoord = location->coordinate; QGeoCoordinate locationCoord = location->coordinate;
for (auto [idx, dive]: enumerated_range(divelog.dives)) { for (auto [idx, dive] : enumerated_range(divelog.dives)) {
struct dive_site *ds = dive->dive_site; struct dive_site *ds = dive->dive_site;
if (!ds || !ds->has_gps_location()) if (!ds || !ds->has_gps_location())
continue; continue;
@ -151,9 +151,9 @@ void MapWidgetHelper::selectedLocationChanged(struct dive_site *ds_in)
} }
int last; // get latest dive chronologically int last; // get latest dive chronologically
if (!selectedDiveIds.isEmpty()) { if (!selectedDiveIds.isEmpty()) {
last = selectedDiveIds.last(); last = selectedDiveIds.last();
selectedDiveIds.clear(); selectedDiveIds.clear();
selectedDiveIds.append(last); selectedDiveIds.append(last);
} }
#endif #endif
emit selectedDivesChanged(selectedDiveIds); emit selectedDivesChanged(selectedDiveIds);
@ -162,7 +162,7 @@ void MapWidgetHelper::selectedLocationChanged(struct dive_site *ds_in)
void MapWidgetHelper::selectVisibleLocations() void MapWidgetHelper::selectVisibleLocations()
{ {
QList<int> selectedDiveIds; QList<int> selectedDiveIds;
for (auto [idx, dive]: enumerated_range(divelog.dives)) { for (auto [idx, dive] : enumerated_range(divelog.dives)) {
struct dive_site *ds = dive->dive_site; struct dive_site *ds = dive->dive_site;
if (!ds || ds->has_gps_location()) if (!ds || ds->has_gps_location())
continue; continue;
@ -171,7 +171,7 @@ void MapWidgetHelper::selectVisibleLocations()
QGeoCoordinate dsCoord(latitude, longitude); QGeoCoordinate dsCoord(latitude, longitude);
QPointF point; QPointF point;
QMetaObject::invokeMethod(m_map, "fromCoordinate", Q_RETURN_ARG(QPointF, point), QMetaObject::invokeMethod(m_map, "fromCoordinate", Q_RETURN_ARG(QPointF, point),
Q_ARG(QGeoCoordinate, dsCoord)); Q_ARG(QGeoCoordinate, dsCoord));
if (!qIsNaN(point.x())) if (!qIsNaN(point.x()))
#ifndef SUBSURFACE_MOBILE // indices on desktop #ifndef SUBSURFACE_MOBILE // indices on desktop
selectedDiveIds.append(idx); selectedDiveIds.append(idx);
@ -181,9 +181,9 @@ void MapWidgetHelper::selectVisibleLocations()
} }
int last; // get latest dive chronologically int last; // get latest dive chronologically
if (!selectedDiveIds.isEmpty()) { if (!selectedDiveIds.isEmpty()) {
last = selectedDiveIds.last(); last = selectedDiveIds.last();
selectedDiveIds.clear(); selectedDiveIds.clear();
selectedDiveIds.append(last); selectedDiveIds.append(last);
} }
#endif #endif
emit selectedDivesChanged(selectedDiveIds); emit selectedDivesChanged(selectedDiveIds);
@ -205,11 +205,11 @@ void MapWidgetHelper::calculateSmallCircleRadius(QGeoCoordinate coord)
{ {
QPointF point; QPointF point;
QMetaObject::invokeMethod(m_map, "fromCoordinate", Q_RETURN_ARG(QPointF, point), QMetaObject::invokeMethod(m_map, "fromCoordinate", Q_RETURN_ARG(QPointF, point),
Q_ARG(QGeoCoordinate, coord)); Q_ARG(QGeoCoordinate, coord));
QPointF point2(point.x() + SMALL_CIRCLE_RADIUS_PX, point.y()); QPointF point2(point.x() + SMALL_CIRCLE_RADIUS_PX, point.y());
QGeoCoordinate coord2; QGeoCoordinate coord2;
QMetaObject::invokeMethod(m_map, "toCoordinate", Q_RETURN_ARG(QGeoCoordinate, coord2), QMetaObject::invokeMethod(m_map, "toCoordinate", Q_RETURN_ARG(QGeoCoordinate, coord2),
Q_ARG(QPointF, point2)); Q_ARG(QPointF, point2));
m_smallCircleRadius = coord2.distanceTo(coord); m_smallCircleRadius = coord2.distanceTo(coord);
} }
@ -251,8 +251,8 @@ QString MapWidgetHelper::pluginObject()
{ {
QString lang = getUiLanguage().replace('_', '-'); QString lang = getUiLanguage().replace('_', '-');
QString cacheFolder = QString::fromStdString(system_default_directory() + "/googlemaps").replace("\\", "/"); QString cacheFolder = QString::fromStdString(system_default_directory() + "/googlemaps").replace("\\", "/");
return QStringLiteral("import QtQuick 2.0;" return QStringLiteral("import QtQuick;"
"import QtLocation 5.3;" "import QtLocation;"
"Plugin {" "Plugin {"
" id: mapPlugin;" " id: mapPlugin;"
" name: 'googlemaps';" " name: 'googlemaps';"
@ -263,5 +263,6 @@ QString MapWidgetHelper::pluginObject()
" console.warn('MapWidget.qml: cannot find a plugin named: ' + name);" " console.warn('MapWidget.qml: cannot find a plugin named: ' + name);"
" }" " }"
" }" " }"
"}").arg(lang, cacheFolder); "}")
.arg(lang, cacheFolder);
} }

View file

@ -34,7 +34,7 @@ if [[ -z "${CONTAINER_ID}" ]]; then
croak "Please make sure GIT_AUTHOR_NAME and GIT_AUTHOR_EMAIL are set for the first run of this script." croak "Please make sure GIT_AUTHOR_NAME and GIT_AUTHOR_EMAIL are set for the first run of this script."
fi fi
docker create -v ${SUBSURFACE_ROOT}:${CONTAINER_SUBSURFACE_DIR} --name=${CONTAINER_NAME} subsurface/mxe-build:3.3.0 sleep infinity docker create -v ${SUBSURFACE_ROOT}:${CONTAINER_SUBSURFACE_DIR} --name=${CONTAINER_NAME} subsurface/mxe-build:3.4.0 sleep infinity
fi fi
# Start the container # Start the container

View file

@ -571,7 +571,11 @@ if [ "$QUICK" != "1" ] && [ "$BUILD_DESKTOP$BUILD_MOBILE" != "" ] && ( [[ $QT_VE
# build the googlemaps map plugin # build the googlemaps map plugin
cd "$SRC" cd "$SRC"
./${SRC_DIR}/scripts/get-dep-lib.sh single . googlemaps if [ "$BUILD_WITH_QT6" = "1" ] ; then
./${SRC_DIR}/scripts/get-dep-lib.sh -qt6 single . googlemaps
else
./${SRC_DIR}/scripts/get-dep-lib.sh single . googlemaps
fi
pushd googlemaps pushd googlemaps
mkdir -p build mkdir -p build
mkdir -p J10build mkdir -p J10build

View file

@ -79,13 +79,17 @@ curl_download_library() {
fi fi
} }
QT6="0"
# deal with all the command line arguments # deal with all the command line arguments
if [ "$1" == "-qt6" ] ; then
shift
QT6="1"
fi
if [ $# -ne 2 ] && [ $# -ne 3 ] ; then if [ $# -ne 2 ] && [ $# -ne 3 ] ; then
echo "wrong number of parameters, format:" echo "wrong number of parameters, format:"
echo "get-dep-lib.sh <platform> <install dir>" echo "get-dep-lib.sh [ -qt6 ] <platform> <install dir>"
echo "get-dep-lib.sh single <install dir> <lib>" echo "get-dep-lib.sh [ -qt6 ] single <install dir> <lib>"
echo "get-dep-lib.sh singleAndroid <install dir> <lib>" echo "get-dep-lib.sh [ -qt6 ] singleAndroid <install dir> <lib>"
echo "where" echo "where"
echo "<platform> is one of scripts, ios or android" echo "<platform> is one of scripts, ios or android"
echo "(the name of the directory where build.sh resides)" echo "(the name of the directory where build.sh resides)"
@ -169,7 +173,11 @@ for package in "${PACKAGES[@]}" ; do
git_checkout_library breeze-icons $CURRENT_BREEZE_ICONS https://github.com/kde/breeze-icons.git git_checkout_library breeze-icons $CURRENT_BREEZE_ICONS https://github.com/kde/breeze-icons.git
;; ;;
googlemaps) googlemaps)
git_checkout_library googlemaps master https://github.com/Subsurface/googlemaps.git if [ "$QT6" = "1" ] ; then
git_checkout_library googlemaps master https://github.com/vladest/googlemaps.git
else
git_checkout_library googlemaps master https://github.com/Subsurface/googlemaps.git
fi
;; ;;
hidapi) hidapi)
git_checkout_library hidapi master https://github.com/libusb/hidapi.git git_checkout_library hidapi master https://github.com/libusb/hidapi.git