mirror of
https://github.com/subsurface/subsurface.git
synced 2024-11-27 20:58:47 +00:00
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>
This commit is contained in:
parent
914cdb102b
commit
c5e5535f51
3 changed files with 69 additions and 31 deletions
|
@ -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)))
|
||||
}
|
||||
|
||||
|
|
|
@ -4,20 +4,20 @@
|
|||
#include <QDebug>
|
||||
#include <QVector>
|
||||
|
||||
#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<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;
|
||||
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';"
|
||||
|
@ -261,7 +261,9 @@ QString MapWidgetHelper::pluginObject()
|
|||
" Component.onCompleted: {"
|
||||
" if (availableServiceProviders.indexOf(name) === -1) {"
|
||||
" console.warn('MapWidget.qml: cannot find a plugin named: ' + name);"
|
||||
" console.warn('Test van Egbert');"
|
||||
" }"
|
||||
" }"
|
||||
"}").arg(lang, cacheFolder);
|
||||
"}")
|
||||
.arg(lang, cacheFolder);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
;;
|
||||
|
|
Loading…
Reference in a new issue