mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
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:
parent
b39f2406c6
commit
488eb15423
8 changed files with 38 additions and 3 deletions
|
@ -27,6 +27,7 @@
|
|||
#include "qt-models/divepicturemodel.h"
|
||||
#include "core/metrics.h"
|
||||
#include "desktop-widgets/simplewidgets.h"
|
||||
#include "desktop-widgets/mapwidget.h"
|
||||
|
||||
DiveListView::DiveListView(QWidget *parent) : QTreeView(parent), mouseClickSelection(false),
|
||||
currentLayout(DiveTripModelBase::TREE), dontEmitDiveChangedSignal(false), selectionSaved(false),
|
||||
|
@ -455,6 +456,22 @@ void DiveListView::selectDives(const QList<int> &newDiveSelection)
|
|||
scrollTo(idx.parent());
|
||||
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
|
||||
emit divesSelected();
|
||||
dontEmitDiveChangedSignal = false;
|
||||
|
|
|
@ -84,6 +84,12 @@ bool MapWidget::editMode() const
|
|||
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()
|
||||
{
|
||||
CHECK_IS_READY_RETURN_VOID();
|
||||
|
|
|
@ -24,6 +24,7 @@ public:
|
|||
static MapWidget *instance();
|
||||
void reload();
|
||||
void selectionChanged();
|
||||
void setSelected(const QVector<dive_site *> &divesites);
|
||||
bool editMode() const;
|
||||
|
||||
public slots:
|
||||
|
|
|
@ -69,10 +69,8 @@ Item {
|
|||
drag.target: (mapHelper.editMode && mapHelper.model.isSelected(model.divesite)) ? mapItem : undefined
|
||||
anchors.fill: parent
|
||||
onClicked: {
|
||||
if (!mapHelper.editMode && model.divesite) {
|
||||
mapHelper.model.setSelected(model.divesite)
|
||||
if (!mapHelper.editMode && model.divesite)
|
||||
mapHelper.selectedLocationChanged(model.divesite)
|
||||
}
|
||||
}
|
||||
onDoubleClicked: map.doubleClickHandler(mapItem.coordinate)
|
||||
onReleased: {
|
||||
|
|
|
@ -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()
|
||||
{
|
||||
QVector<struct dive_site *> selDS = m_mapLocationModel->selectedDs();
|
||||
|
@ -115,6 +120,7 @@ void MapWidgetHelper::reloadMapLocations()
|
|||
|
||||
void MapWidgetHelper::selectionChanged()
|
||||
{
|
||||
updateEditMode();
|
||||
m_mapLocationModel->selectionChanged();
|
||||
}
|
||||
|
||||
|
|
|
@ -37,6 +37,7 @@ public:
|
|||
Q_INVOKABLE void selectVisibleLocations();
|
||||
Q_INVOKABLE void selectedLocationChanged(struct dive_site *ds);
|
||||
void selectionChanged();
|
||||
void setSelected(const QVector<dive_site *> &divesites);
|
||||
QString pluginObject();
|
||||
bool editMode() const;
|
||||
|
||||
|
|
|
@ -229,6 +229,11 @@ void MapLocationModel::setSelected(struct dive_site *ds)
|
|||
m_selectedDs.append(ds);
|
||||
}
|
||||
|
||||
void MapLocationModel::setSelected(const QVector<dive_site *> &divesites)
|
||||
{
|
||||
m_selectedDs = divesites;
|
||||
}
|
||||
|
||||
bool MapLocationModel::isSelected(const QVariant &dsVariant) const
|
||||
{
|
||||
dive_site *ds = dsVariant.value<dive_site *>();
|
||||
|
|
|
@ -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
|
||||
void reload(QObject *map);
|
||||
void selectionChanged();
|
||||
void setSelected(const QVector<dive_site *> &divesites);
|
||||
MapLocation *getMapLocation(const struct dive_site *ds);
|
||||
const QVector<dive_site *> &selectedDs() const;
|
||||
Q_INVOKABLE void setSelected(struct dive_site *ds);
|
||||
|
|
Loading…
Add table
Reference in a new issue