summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--desktop-widgets/mapwidget.cpp29
-rw-r--r--mobile-widgets/qml/MapWidgetError.qml13
-rw-r--r--subsurface.qrc1
3 files changed, 38 insertions, 5 deletions
diff --git a/desktop-widgets/mapwidget.cpp b/desktop-widgets/mapwidget.cpp
index 34f7ed217..806b82c2d 100644
--- a/desktop-widgets/mapwidget.cpp
+++ b/desktop-widgets/mapwidget.cpp
@@ -12,8 +12,14 @@
#include "mainwindow.h"
#include "divelistview.h"
+static const QUrl urlMapWidget = QUrl(QStringLiteral("qrc:/MapWidget.qml"));
+static const QUrl urlMapWidgetError = QUrl(QStringLiteral("qrc:/MapWidgetError.qml"));
+static bool isReady = false;
static bool skipReload = false;
+#define CHECK_IS_READY_RETURN_VOID() \
+ if (!isReady) return
+
MapWidget *MapWidget::m_instance = NULL;
MapWidget::MapWidget(QWidget *parent) : QQuickWidget(parent)
@@ -22,19 +28,23 @@ MapWidget::MapWidget(QWidget *parent) : QQuickWidget(parent)
qmlRegisterType<MapLocationModel>("org.subsurfacedivelog.mobile", 1, 0, "MapLocationModel");
qmlRegisterType<MapLocation>("org.subsurfacedivelog.mobile", 1, 0, "MapLocation");
+ setResizeMode(QQuickWidget::SizeRootObjectToView);
connect(this, &QQuickWidget::statusChanged, this, &MapWidget::doneLoading);
- setSource(QUrl(QStringLiteral("qrc:/MapWidget.qml")));
+ setSource(urlMapWidget);
}
void MapWidget::doneLoading(QQuickWidget::Status status)
{
- if (status != QQuickWidget::Ready) {
- qDebug() << "MapWidget status" << status;
+ // the default map widget QML failed; load the error QML.
+ if (source() == urlMapWidget && status != QQuickWidget::Ready) {
+ qDebug() << urlMapWidget << "failed to load with status:" << status;
+ setSource(urlMapWidgetError);
+ return;
+ } else if (source() == urlMapWidgetError) { // the error QML finished loading.
return;
}
- qDebug() << "MapWidget ready";
- setResizeMode(QQuickWidget::SizeRootObjectToView);
+ isReady = true;
m_rootItem = qobject_cast<QQuickItem *>(rootObject());
m_mapHelper = rootObject()->findChild<MapWidgetHelper *>();
connect(m_mapHelper, SIGNAL(selectedDivesChanged(QList<int>)),
@@ -45,12 +55,14 @@ void MapWidget::doneLoading(QQuickWidget::Status status)
void MapWidget::centerOnDiveSite(struct dive_site *ds)
{
+ CHECK_IS_READY_RETURN_VOID();
if (!skipReload)
m_mapHelper->centerOnDiveSite(ds);
}
void MapWidget::centerOnIndex(const QModelIndex& idx)
{
+ CHECK_IS_READY_RETURN_VOID();
struct dive_site *ds = get_dive_site_by_uuid(idx.model()->index(idx.row(), 0).data().toInt());
if (!ds || !dive_site_has_gps_location(ds))
centerOnDiveSite(&displayed_dive_site);
@@ -60,11 +72,13 @@ void MapWidget::centerOnIndex(const QModelIndex& idx)
void MapWidget::repopulateLabels()
{
+ CHECK_IS_READY_RETURN_VOID();
m_mapHelper->reloadMapLocations();
}
void MapWidget::reload()
{
+ CHECK_IS_READY_RETURN_VOID();
setEditMode(false);
if (!skipReload)
m_mapHelper->reloadMapLocations();
@@ -72,21 +86,25 @@ void MapWidget::reload()
void MapWidget::setEditMode(bool editMode)
{
+ CHECK_IS_READY_RETURN_VOID();
m_mapHelper->setEditMode(editMode);
}
void MapWidget::endGetDiveCoordinates()
{
+ CHECK_IS_READY_RETURN_VOID();
setEditMode(false);
}
void MapWidget::prepareForGetDiveCoordinates()
{
+ CHECK_IS_READY_RETURN_VOID();
setEditMode(true);
}
void MapWidget::selectedDivesChanged(QList<int> list)
{
+ CHECK_IS_READY_RETURN_VOID();
skipReload = true;
MainWindow::instance()->dive_list()->unselectDives();
if (!list.empty())
@@ -96,6 +114,7 @@ void MapWidget::selectedDivesChanged(QList<int> list)
void MapWidget::coordinatesChangedLocal()
{
+ CHECK_IS_READY_RETURN_VOID();
emit coordinatesChanged();
}
diff --git a/mobile-widgets/qml/MapWidgetError.qml b/mobile-widgets/qml/MapWidgetError.qml
new file mode 100644
index 000000000..346e95f07
--- /dev/null
+++ b/mobile-widgets/qml/MapWidgetError.qml
@@ -0,0 +1,13 @@
+// SPDX-License-Identifier: GPL-2.0
+import QtQuick 2.0
+
+Item {
+ Text {
+ anchors.fill: parent
+ horizontalAlignment: Text.AlignHCenter
+ verticalAlignment: Text.AlignVCenter
+ color: "red"
+ text: qsTr("MapWidget.qml failed to load!
+The QML modules QtPositioning and QtLocation could be missing!")
+ }
+}
diff --git a/subsurface.qrc b/subsurface.qrc
index e5f75d1e3..fc4e2ce6c 100644
--- a/subsurface.qrc
+++ b/subsurface.qrc
@@ -1,6 +1,7 @@
<RCC>
<qresource prefix="/">
<file alias="MapWidget.qml">mobile-widgets/qml/MapWidget.qml</file>
+ <file alias="MapWidgetError.qml">mobile-widgets/qml/MapWidgetError.qml</file>
<file alias="MapWidgetContextMenu.qml">mobile-widgets/qml/MapWidgetContextMenu.qml</file>
<file alias="mapwidget-marker">mobile-widgets/qml/icons/mapwidget-marker.png</file>
<file alias="mapwidget-marker-selected">mobile-widgets/qml/icons/mapwidget-marker-selected.png</file>