Desktop: show all selected dive sites on click

When clicking a dive site on the map, the QML code would set
the selected dive site, but then all dives of dive sites in
the vicinity were set. But still only the clicked-on dive site
was shown.

Therefore, don't set the list of selected dive sites in QML,
but later in DiveListView::selectDives(), where we know all
the dives that were selected.

This, again, gives nasty entanglement of diverse widgets and
models.

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
Berthold Stoeger 2019-08-30 17:38:54 +02:00 committed by Dirk Hohndel
parent b39f2406c6
commit 488eb15423
8 changed files with 38 additions and 3 deletions

View file

@ -27,6 +27,7 @@
#include "qt-models/divepicturemodel.h" #include "qt-models/divepicturemodel.h"
#include "core/metrics.h" #include "core/metrics.h"
#include "desktop-widgets/simplewidgets.h" #include "desktop-widgets/simplewidgets.h"
#include "desktop-widgets/mapwidget.h"
DiveListView::DiveListView(QWidget *parent) : QTreeView(parent), mouseClickSelection(false), DiveListView::DiveListView(QWidget *parent) : QTreeView(parent), mouseClickSelection(false),
currentLayout(DiveTripModelBase::TREE), dontEmitDiveChangedSignal(false), selectionSaved(false), currentLayout(DiveTripModelBase::TREE), dontEmitDiveChangedSignal(false), selectionSaved(false),
@ -455,6 +456,22 @@ void DiveListView::selectDives(const QList<int> &newDiveSelection)
scrollTo(idx.parent()); scrollTo(idx.parent());
scrollTo(idx); scrollTo(idx);
} }
// update the selected-flag for the dive sites.
// the actual reloading of the dive sites will be perfomed
// by the main-window in response to the divesSelected signal
// emitted below.
QVector<dive_site *> selectedSites;
for (int idx: newDiveSelection) {
dive *d = get_dive(idx);
if (!d)
continue;
dive_site *ds = d->dive_site;
if (ds && !selectedSites.contains(ds))
selectedSites.append(ds);
}
MapWidget::instance()->setSelected(selectedSites);
// now that everything is up to date, update the widgets // now that everything is up to date, update the widgets
emit divesSelected(); emit divesSelected();
dontEmitDiveChangedSignal = false; dontEmitDiveChangedSignal = false;

View file

@ -84,6 +84,12 @@ bool MapWidget::editMode() const
return isReady && m_mapHelper->editMode(); return isReady && m_mapHelper->editMode();
} }
void MapWidget::setSelected(const QVector<dive_site *> &divesites)
{
CHECK_IS_READY_RETURN_VOID();
m_mapHelper->setSelected(divesites);
}
void MapWidget::selectionChanged() void MapWidget::selectionChanged()
{ {
CHECK_IS_READY_RETURN_VOID(); CHECK_IS_READY_RETURN_VOID();

View file

@ -24,6 +24,7 @@ public:
static MapWidget *instance(); static MapWidget *instance();
void reload(); void reload();
void selectionChanged(); void selectionChanged();
void setSelected(const QVector<dive_site *> &divesites);
bool editMode() const; bool editMode() const;
public slots: public slots:

View file

@ -69,10 +69,8 @@ Item {
drag.target: (mapHelper.editMode && mapHelper.model.isSelected(model.divesite)) ? mapItem : undefined drag.target: (mapHelper.editMode && mapHelper.model.isSelected(model.divesite)) ? mapItem : undefined
anchors.fill: parent anchors.fill: parent
onClicked: { onClicked: {
if (!mapHelper.editMode && model.divesite) { if (!mapHelper.editMode && model.divesite)
mapHelper.model.setSelected(model.divesite)
mapHelper.selectedLocationChanged(model.divesite) mapHelper.selectedLocationChanged(model.divesite)
}
} }
onDoubleClicked: map.doubleClickHandler(mapItem.coordinate) onDoubleClicked: map.doubleClickHandler(mapItem.coordinate)
onReleased: { onReleased: {

View file

@ -46,6 +46,11 @@ void MapWidgetHelper::centerOnDiveSite(struct dive_site *ds)
} }
} }
void MapWidgetHelper::setSelected(const QVector<dive_site *> &divesites)
{
m_mapLocationModel->setSelected(divesites);
}
void MapWidgetHelper::centerOnSelectedDiveSite() void MapWidgetHelper::centerOnSelectedDiveSite()
{ {
QVector<struct dive_site *> selDS = m_mapLocationModel->selectedDs(); QVector<struct dive_site *> selDS = m_mapLocationModel->selectedDs();
@ -115,6 +120,7 @@ void MapWidgetHelper::reloadMapLocations()
void MapWidgetHelper::selectionChanged() void MapWidgetHelper::selectionChanged()
{ {
updateEditMode();
m_mapLocationModel->selectionChanged(); m_mapLocationModel->selectionChanged();
} }

View file

@ -37,6 +37,7 @@ public:
Q_INVOKABLE void selectVisibleLocations(); Q_INVOKABLE void selectVisibleLocations();
Q_INVOKABLE void selectedLocationChanged(struct dive_site *ds); Q_INVOKABLE void selectedLocationChanged(struct dive_site *ds);
void selectionChanged(); void selectionChanged();
void setSelected(const QVector<dive_site *> &divesites);
QString pluginObject(); QString pluginObject();
bool editMode() const; bool editMode() const;

View file

@ -229,6 +229,11 @@ void MapLocationModel::setSelected(struct dive_site *ds)
m_selectedDs.append(ds); m_selectedDs.append(ds);
} }
void MapLocationModel::setSelected(const QVector<dive_site *> &divesites)
{
m_selectedDs = divesites;
}
bool MapLocationModel::isSelected(const QVariant &dsVariant) const bool MapLocationModel::isSelected(const QVariant &dsVariant) const
{ {
dive_site *ds = dsVariant.value<dive_site *>(); dive_site *ds = dsVariant.value<dive_site *>();

View file

@ -68,6 +68,7 @@ public:
// If map is not null, it will be used to place new dive sites without GPS location at the center of the map // If map is not null, it will be used to place new dive sites without GPS location at the center of the map
void reload(QObject *map); void reload(QObject *map);
void selectionChanged(); void selectionChanged();
void setSelected(const QVector<dive_site *> &divesites);
MapLocation *getMapLocation(const struct dive_site *ds); MapLocation *getMapLocation(const struct dive_site *ds);
const QVector<dive_site *> &selectedDs() const; const QVector<dive_site *> &selectedDs() const;
Q_INVOKABLE void setSelected(struct dive_site *ds); Q_INVOKABLE void setSelected(struct dive_site *ds);