This commit is contained in:
Egbert de Pauw 2024-11-27 08:30:19 +13:00 committed by GitHub
commit 38161d1ad5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 68 additions and 31 deletions

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

@ -169,8 +169,9 @@ 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 #git_checkout_library googlemaps master https://github.com/Subsurface/googlemaps.git
;; git_checkout_library googlemaps master https://github.com/vladest/googlemaps.git
;;
hidapi) hidapi)
git_checkout_library hidapi master https://github.com/libusb/hidapi.git git_checkout_library hidapi master https://github.com/libusb/hidapi.git
;; ;;