From 1742d6eabb03611606af029e806d896290b81dd3 Mon Sep 17 00:00:00 2001 From: Egbertdepauw Date: Tue, 27 Aug 2024 13:51:37 +0200 Subject: [PATCH 1/5] 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 --- map-widget/qml/MapWidget.qml | 53 +++++++++++++++++++++++++------ map-widget/qmlmapwidgethelper.cpp | 41 ++++++++++++------------ scripts/get-dep-lib.sh | 5 +-- 3 files changed, 68 insertions(+), 31 deletions(-) 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/get-dep-lib.sh b/scripts/get-dep-lib.sh index ec261d46f..48a22b4bf 100755 --- a/scripts/get-dep-lib.sh +++ b/scripts/get-dep-lib.sh @@ -169,8 +169,9 @@ 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 - ;; + #git_checkout_library googlemaps master https://github.com/Subsurface/googlemaps.git + git_checkout_library googlemaps master https://github.com/vladest/googlemaps.git + ;; hidapi) git_checkout_library hidapi master https://github.com/libusb/hidapi.git ;; From 5d38fd3fe8f24ebb6cff40c841e469b515d91c05 Mon Sep 17 00:00:00 2001 From: Dirk Hohndel Date: Tue, 27 Aug 2024 22:32:01 -0700 Subject: [PATCH 2/5] Make googlemaps compile with Qt5 and Qt6 Signed-off-by: Dirk Hohndel --- scripts/build.sh | 6 +++++- scripts/get-dep-lib.sh | 21 ++++++++++++++------- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/scripts/build.sh b/scripts/build.sh index 95b3e242f..6f7086451 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/get-dep-lib.sh b/scripts/get-dep-lib.sh index 48a22b4bf..16c5f33fd 100755 --- a/scripts/get-dep-lib.sh +++ b/scripts/get-dep-lib.sh @@ -79,13 +79,17 @@ curl_download_library() { fi } - +QT6="0" # deal with all the command line arguments +if [ "$1" == "-qt6" ] ; then + shift + QT6="1" +fi if [ $# -ne 2 ] && [ $# -ne 3 ] ; then echo "wrong number of parameters, format:" - echo "get-dep-lib.sh " - 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,9 +173,12 @@ 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 - git_checkout_library googlemaps master https://github.com/vladest/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 ;; From f7d32c850d084ad8fa57aed64cb3e6e5b8cabe76 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 26 Sep 2024 21:49:15 +0000 Subject: [PATCH 3/5] build(deps): bump ubuntu in /scripts/docker/mxe-build-container Bumps ubuntu from 22.04 to 24.04. --- updated-dependencies: - dependency-name: ubuntu dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- scripts/docker/mxe-build-container/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/docker/mxe-build-container/Dockerfile b/scripts/docker/mxe-build-container/Dockerfile index cb3950f5a..9b314c029 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 && \ From f60f01838cdcc48aaddce1de748d340c852e0497 Mon Sep 17 00:00:00 2001 From: Michael Keller Date: Fri, 27 Sep 2024 15:13:05 +1200 Subject: [PATCH 4/5] Update MXE docker Image Version Number. Signed-off-by: Michael Keller --- .github/workflows/windows-mxe-dockerimage.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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: From 8212b286411a1e9055081883f9286ba66fbdb8cc Mon Sep 17 00:00:00 2001 From: Michael Keller Date: Tue, 22 Oct 2024 12:07:49 +1300 Subject: [PATCH 5/5] Make MXE Build on ubuntu 24.04. As per https://github.com/mxe/mxe/commit/a31368b037221d56bcfcfd8c546b89adffe9ea04. Signed-off-by: Michael Keller --- scripts/docker/mxe-build-container/Dockerfile | 6 +-- .../mdbtools_version.patch | 52 ------------------- 2 files changed, 2 insertions(+), 56 deletions(-) delete mode 100644 scripts/docker/mxe-build-container/mdbtools_version.patch diff --git a/scripts/docker/mxe-build-container/Dockerfile b/scripts/docker/mxe-build-container/Dockerfile index 9b314c029..511117ba3 100644 --- a/scripts/docker/mxe-build-container/Dockerfile +++ b/scripts/docker/mxe-build-container/Dockerfile @@ -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 '