diff --git a/.github/workflows/windows-mxe-dockerimage.yml b/.github/workflows/windows-mxe-dockerimage.yml index 5b5c05616..2e4c1d009 100644 --- a/.github/workflows/windows-mxe-dockerimage.yml +++ b/.github/workflows/windows-mxe-dockerimage.yml @@ -12,7 +12,7 @@ jobs: windows-mxe: runs-on: ubuntu-latest env: - VERSION: ${{ '3.2.0' }} # 'official' images should have a dot-zero version + VERSION: ${{ '3.3.0' }} # 'official' images should have a dot-zero version mxe_sha: '974808c2ecb02866764d236fe533ae57ba342e7a' steps: diff --git a/map-widget/qml/MapWidget.qml b/map-widget/qml/MapWidget.qml index f028bd1c3..682841d25 100644 --- a/map-widget/qml/MapWidget.qml +++ b/map-widget/qml/MapWidget.qml @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-2.0 -import QtQuick 2.5 -import QtLocation 5.3 -import QtPositioning 5.3 +import QtQuick +import QtLocation +import QtPositioning import org.subsurfacedivelog.mobile 1.0 Item { @@ -15,7 +15,7 @@ Item { id: mapHelper map: map editMode: false - onSelectedDivesChanged: rootItem.selectedDivesChanged(list) + onSelectedDivesChanged: (list) => { rootItem.selectedDivesChanged(list) } onEditModeChanged: editMessage.isVisible = editMode === true ? 1 : 0 onCoordinatesChanged: {} Component.onCompleted: { @@ -29,7 +29,6 @@ Item { id: map anchors.fill: parent zoomLevel: defaultZoomIn - property var mapType readonly property var defaultCenter: QtPositioning.coordinate(0, 0) readonly property real defaultZoomIn: 12.0 @@ -41,12 +40,46 @@ Item { property real newZoomOut: 1.0 property var clickCoord: QtPositioning.coordinate(0, 0) property bool isReady: false - Component.onCompleted: isReady = true onZoomLevelChanged: { if (isReady) 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 { id: mapItemView @@ -67,7 +100,9 @@ Item { } MouseArea { drag.target: (mapHelper.editMode && model.isSelected) ? mapItem : undefined - anchors.fill: parent + anchors.fill: parent + hoverEnabled: true + onClicked: { if (!mapHelper.editMode && model.divesite) mapHelper.selectedLocationChanged(model.divesite) @@ -122,8 +157,8 @@ Item { MouseArea { anchors.fill: parent - onPressed: { map.stopZoomAnimations(); mouse.accepted = false } - onWheel: { map.stopZoomAnimations(); wheel.accepted = false } + onPressed: (mouse) => { map.stopZoomAnimations(); mouse.accepted = false } + onWheel: (wheel) => { map.stopZoomAnimations(); wheel.accepted = false } onDoubleClicked: map.doubleClickHandler(map.toCoordinate(Qt.point(mouseX, mouseY))) } diff --git a/map-widget/qmlmapwidgethelper.cpp b/map-widget/qmlmapwidgethelper.cpp index f957fac49..e556b256c 100644 --- a/map-widget/qmlmapwidgethelper.cpp +++ b/map-widget/qmlmapwidgethelper.cpp @@ -4,20 +4,20 @@ #include #include -#include "qmlmapwidgethelper.h" #include "core/divefilter.h" #include "core/divelist.h" #include "core/divelog.h" #include "core/divesite.h" #include "core/qthelper.h" #include "core/range.h" -#include "qt-models/maplocationmodel.h" +#include "qmlmapwidgethelper.h" #include "qt-models/divelocationmodel.h" +#include "qt-models/maplocationmodel.h" #ifndef SUBSURFACE_MOBILE #include "desktop-widgets/mapwidget.h" #endif -#define SMALL_CIRCLE_RADIUS_PX 26.0 +#define SMALL_CIRCLE_RADIUS_PX 26.0 MapWidgetHelper::MapWidgetHelper(QObject *parent) : QObject(parent) { @@ -44,7 +44,7 @@ void MapWidgetHelper::centerOnDiveSite(struct dive_site *ds) } else { // dive site with GPS 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))); } } @@ -69,7 +69,7 @@ void MapWidgetHelper::centerOnSelectedDiveSite() // 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; int count = 0; - for(struct dive_site *dss: selDS) { + for (struct dive_site *dss : selDS) { if (!has_location(&dss->location)) continue; 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. // If we didn't find any coordinates, do nothing. 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))); } else if (count > 1) { QGeoCoordinate coordTopLeft(minLat, minLon); @@ -134,7 +134,7 @@ void MapWidgetHelper::selectedLocationChanged(struct dive_site *ds_in) return; 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; if (!ds || !ds->has_gps_location()) continue; @@ -151,9 +151,9 @@ void MapWidgetHelper::selectedLocationChanged(struct dive_site *ds_in) } int last; // get latest dive chronologically if (!selectedDiveIds.isEmpty()) { - last = selectedDiveIds.last(); - selectedDiveIds.clear(); - selectedDiveIds.append(last); + last = selectedDiveIds.last(); + selectedDiveIds.clear(); + selectedDiveIds.append(last); } #endif emit selectedDivesChanged(selectedDiveIds); @@ -162,7 +162,7 @@ void MapWidgetHelper::selectedLocationChanged(struct dive_site *ds_in) void MapWidgetHelper::selectVisibleLocations() { QList selectedDiveIds; - for (auto [idx, dive]: enumerated_range(divelog.dives)) { + for (auto [idx, dive] : enumerated_range(divelog.dives)) { struct dive_site *ds = dive->dive_site; if (!ds || ds->has_gps_location()) continue; @@ -171,7 +171,7 @@ void MapWidgetHelper::selectVisibleLocations() QGeoCoordinate dsCoord(latitude, longitude); QPointF point; QMetaObject::invokeMethod(m_map, "fromCoordinate", Q_RETURN_ARG(QPointF, point), - Q_ARG(QGeoCoordinate, dsCoord)); + Q_ARG(QGeoCoordinate, dsCoord)); if (!qIsNaN(point.x())) #ifndef SUBSURFACE_MOBILE // indices on desktop selectedDiveIds.append(idx); @@ -181,9 +181,9 @@ void MapWidgetHelper::selectVisibleLocations() } int last; // get latest dive chronologically if (!selectedDiveIds.isEmpty()) { - last = selectedDiveIds.last(); - selectedDiveIds.clear(); - selectedDiveIds.append(last); + last = selectedDiveIds.last(); + selectedDiveIds.clear(); + selectedDiveIds.append(last); } #endif emit selectedDivesChanged(selectedDiveIds); @@ -205,11 +205,11 @@ void MapWidgetHelper::calculateSmallCircleRadius(QGeoCoordinate coord) { 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()); 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); } @@ -251,8 +251,8 @@ QString MapWidgetHelper::pluginObject() { QString lang = getUiLanguage().replace('_', '-'); QString cacheFolder = QString::fromStdString(system_default_directory() + "/googlemaps").replace("\\", "/"); - return QStringLiteral("import QtQuick 2.0;" - "import QtLocation 5.3;" + return QStringLiteral("import QtQuick;" + "import QtLocation;" "Plugin {" " id: mapPlugin;" " name: 'googlemaps';" @@ -263,5 +263,6 @@ QString MapWidgetHelper::pluginObject() " console.warn('MapWidget.qml: cannot find a plugin named: ' + name);" " }" " }" - "}").arg(lang, cacheFolder); + "}") + .arg(lang, cacheFolder); } diff --git a/scripts/build.sh b/scripts/build.sh index 69dcb649d..d0e3f7ee8 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -571,7 +571,11 @@ if [ "$QUICK" != "1" ] && [ "$BUILD_DESKTOP$BUILD_MOBILE" != "" ] && ( [[ $QT_VE # build the googlemaps map plugin 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 mkdir -p build mkdir -p J10build diff --git a/scripts/docker/mxe-build-container/Dockerfile b/scripts/docker/mxe-build-container/Dockerfile index cb3950f5a..511117ba3 100644 --- a/scripts/docker/mxe-build-container/Dockerfile +++ b/scripts/docker/mxe-build-container/Dockerfile @@ -1,7 +1,7 @@ # Build the image using the --build-arg option, e.g.: # docker build -t boret/myimage:0.1 --build-arg=mxe_sha=123ABC456 . -FROM ubuntu:22.04 as base +FROM ubuntu:24.04 as base # update and set up the packages we need for the build RUN apt-get update && \ @@ -48,13 +48,14 @@ RUN apt-get install -y \ libxml-parser-perl \ python3 \ python3-mako \ + python3-setuptools \ python-is-python3 \ ruby \ xz-utils \ scons # very often master is broken, so we pass in a known good SHA -ARG mxe_sha=master +ARG mxe_sha=d6377b2f2334694dbb040294fd0d848327e63328 ENV _ver=${mxe_sha} WORKDIR /win @@ -73,9 +74,6 @@ ADD settings.mk . # backend is not picked ADD qtconnectivity-1.patch src/ -ADD mdbtools_version.patch . -RUN patch -p1 < mdbtools_version.patch 2>&1 | tee mxe-patch.log - # separate download from build so that we can redo the build RUN make -j download 2>&1 | tee mxe-build.log diff --git a/scripts/docker/mxe-build-container/mdbtools_version.patch b/scripts/docker/mxe-build-container/mdbtools_version.patch deleted file mode 100644 index 98fa6112d..000000000 --- a/scripts/docker/mxe-build-container/mdbtools_version.patch +++ /dev/null @@ -1,52 +0,0 @@ -# Temporary patch to apply to MXE's src/mdbtools.mk file while building docker -# image, until it's applied upstream at github's MXE repo. - - -diff --git a/src/mdbtools.mk b/src/mdbtools.mk -index 42d303c2..d9d0f557 100644 ---- a/src/mdbtools.mk -+++ b/src/mdbtools.mk -@@ -1,19 +1,17 @@ - # This file is part of MXE. See LICENSE.md for licensing information. - - PKG := mdbtools --$(PKG)_WEBSITE := https://sourceforge.net/projects/mdbtools/ -+$(PKG)_WEBSITE := https://github.com/mdbtools/mdbtools - $(PKG)_IGNORE := --$(PKG)_VERSION := 0.7.1 --$(PKG)_CHECKSUM := 4eac1bce55066a38d9ea6c52a8e8ecc101b79afe75118ecc16852990472c4721 --$(PKG)_SUBDIR := brianb-mdbtools-f8ce1cc --$(PKG)_FILE := $(PKG)-$($(PKG)_VERSION).tar.gz --$(PKG)_URL := https://github.com/brianb/$(PKG)/tarball/$($(PKG)_VERSION)/$($(PKG)_FILE) -+$(PKG)_VERSION := 1.0.0 -+$(PKG)_CHECKSUM := 3446e1d71abdeb98d41e252777e67e1909b186496fda59f98f67032f7fbcd955 -+$(PKG)_GH_CONF := mdbtools/mdbtools/releases, v - $(PKG)_DEPS := cc glib - - define $(PKG)_UPDATE -- $(WGET) -q -O- 'https://github.com/brianb/mdbtools/tags' | \ -- grep ' " - echo "get-dep-lib.sh single " - echo "get-dep-lib.sh singleAndroid " + echo "get-dep-lib.sh [ -qt6 ] " + echo "get-dep-lib.sh [ -qt6 ] single " + echo "get-dep-lib.sh [ -qt6 ] singleAndroid " echo "where" echo " is one of scripts, ios or android" 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 ;; 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) git_checkout_library hidapi master https://github.com/libusb/hidapi.git