diff options
-rw-r--r-- | desktop-widgets/command_divelist.cpp | 7 | ||||
-rw-r--r-- | desktop-widgets/divelistview.cpp | 16 | ||||
-rw-r--r-- | desktop-widgets/divelistview.h | 1 | ||||
-rw-r--r-- | desktop-widgets/mainwindow.cpp | 14 | ||||
-rw-r--r-- | qt-models/divetripmodel.cpp | 39 | ||||
-rw-r--r-- | qt-models/divetripmodel.h | 2 |
6 files changed, 74 insertions, 5 deletions
diff --git a/desktop-widgets/command_divelist.cpp b/desktop-widgets/command_divelist.cpp index d3ecfb796..7fbda35dc 100644 --- a/desktop-widgets/command_divelist.cpp +++ b/desktop-widgets/command_divelist.cpp @@ -423,7 +423,12 @@ void DiveListBase::restoreSelection(const std::vector<dive *> &selection, dive * }); bool currentDiveChanged = false; - if (current_dive != currentDive) { + // If currentDive is null, we have no current dive. In such a case always + // signal the frontend. + if (!currentDive) { + currentDiveChanged = true; + emit diveListNotifier.currentDiveChanged(); + } else if (current_dive != currentDive) { currentDiveChanged = true; // We cannot simply change the currentd dive to the given dive. diff --git a/desktop-widgets/divelistview.cpp b/desktop-widgets/divelistview.cpp index 4bfc6ea60..eb65e9e6e 100644 --- a/desktop-widgets/divelistview.cpp +++ b/desktop-widgets/divelistview.cpp @@ -45,6 +45,7 @@ DiveListView::DiveListView(QWidget *parent) : QTreeView(parent), mouseClickSelec setSelectionMode(ExtendedSelection); header()->setContextMenuPolicy(Qt::ActionsContextMenu); connect(DiveTripModel::instance(), &DiveTripModel::selectionChanged, this, &DiveListView::diveSelectionChanged); + connect(DiveTripModel::instance(), &DiveTripModel::newCurrentDive, this, &DiveListView::currentDiveChanged); header()->setStretchLastSection(true); @@ -207,6 +208,21 @@ void DiveListView::diveSelectionChanged(const QVector<QModelIndex> &indexes, boo } } +void DiveListView::currentDiveChanged(QModelIndex index) +{ + // Transform the index into a local index, since + // there might be sorting or filtering in effect. + MultiFilterSortModel *m = MultiFilterSortModel::instance(); + QModelIndex localIndex = m->mapFromSource(index); + + // Then, set the currently activated row. + // Note, we have to use the QItemSelectionModel::Current mode to avoid + // changing our selection (in contrast to Qt's documentation, which + // instructs to use QItemSelectionModel::NoUpdate, which results in + // funny side-effects). + selectionModel()->setCurrentIndex(localIndex, QItemSelectionModel::Current); +} + // If rows are added, check which of these rows is a trip and expand the first column void DiveListView::rowsInserted(const QModelIndex &parent, int start, int end) { diff --git a/desktop-widgets/divelistview.h b/desktop-widgets/divelistview.h index effde2ece..5c9ac2f25 100644 --- a/desktop-widgets/divelistview.h +++ b/desktop-widgets/divelistview.h @@ -59,6 +59,7 @@ slots: void loadImages(); void loadWebImages(); void diveSelectionChanged(const QVector<QModelIndex> &indexes, bool select); + void currentDiveChanged(QModelIndex index); private: bool mouseClickSelection; QList<int> expandedRows; diff --git a/desktop-widgets/mainwindow.cpp b/desktop-widgets/mainwindow.cpp index 72b4e4720..625c094c1 100644 --- a/desktop-widgets/mainwindow.cpp +++ b/desktop-widgets/mainwindow.cpp @@ -530,10 +530,16 @@ void MainWindow::configureToolbar() { void MainWindow::selectionChanged() { - graphics()->plotDive(nullptr, false, true); - information()->updateDiveInfo(); - configureToolbar(); - MapWidget::instance()->reload(); + if (!current_dive) { + information()->clearTabs(); + information()->updateDiveInfo(true); + graphics()->setEmptyState(); + } else { + graphics()->plotDive(nullptr, false, true); + information()->updateDiveInfo(); + configureToolbar(); + MapWidget::instance()->reload(); + } } void MainWindow::on_actionNew_triggered() diff --git a/qt-models/divetripmodel.cpp b/qt-models/divetripmodel.cpp index 7c027e4b4..761a2ffa6 100644 --- a/qt-models/divetripmodel.cpp +++ b/qt-models/divetripmodel.cpp @@ -442,6 +442,7 @@ DiveTripModel::DiveTripModel(QObject *parent) : connect(&diveListNotifier, &DiveListNotifier::divesTimeChanged, this, &DiveTripModel::divesTimeChanged); connect(&diveListNotifier, &DiveListNotifier::divesSelected, this, &DiveTripModel::divesSelected); connect(&diveListNotifier, &DiveListNotifier::divesDeselected, this, &DiveTripModel::divesDeselected); + connect(&diveListNotifier, &DiveListNotifier::currentDiveChanged, this, &DiveTripModel::currentDiveChanged); } int DiveTripModel::columnCount(const QModelIndex&) const @@ -1166,3 +1167,41 @@ void DiveTripModel::changeDiveSelection(dive_trip *trip, const QVector<dive *> & emit selectionChanged(indexes, select); } + +void DiveTripModel::currentDiveChanged() +{ + // The current dive has changed. Transform the current dive into an index and pass it on to the view. + if (!current_dive) { + emit newCurrentDive(QModelIndex()); // No current dive -> tell view to clear current index with an invalid index + return; + } + + dive_trip *trip = current_dive->divetrip; + if (!trip || currentLayout == LIST) { + // Either this is outside of a trip or we're in list mode. + int idx = findDiveIdx(current_dive); + if (idx < 0) { + // We don't know this dive. Something is wrong. Warn and bail. + qWarning() << "DiveTripModel::currentDiveChanged(): unknown top-level dive"; + emit newCurrentDive(QModelIndex()); + return; + } + emit newCurrentDive(createIndex(idx, 0, noParent)); + } else { + int idx = findTripIdx(trip); + if (idx < 0) { + // We don't know the trip - this shouldn't happen. Warn and bail. + qWarning() << "DiveTripModel::currentDiveChanged(): unknown trip"; + emit newCurrentDive(QModelIndex()); + return; + } + int diveIdx = findDiveInTrip(idx, current_dive); + if (diveIdx < 0) { + // We don't know this dive. Something is wrong. Warn and bail. + qWarning() << "DiveTripModel::currentDiveChanged(): unknown top-level dive"; + emit newCurrentDive(QModelIndex()); + return; + } + emit newCurrentDive(createIndex(diveIdx, 0, idx)); + } +} diff --git a/qt-models/divetripmodel.h b/qt-models/divetripmodel.h index 5cd69852c..c8050a6da 100644 --- a/qt-models/divetripmodel.h +++ b/qt-models/divetripmodel.h @@ -118,6 +118,7 @@ signals: // indexes into local indexes according to current sorting/filtering and instructs the QSelectionModel to // perform the appropriate actions. void selectionChanged(const QVector<QModelIndex> &indexes, bool select); + void newCurrentDive(QModelIndex index); private slots: void divesAdded(dive_trip *trip, bool addTrip, const QVector<dive *> &dives); void divesDeleted(dive_trip *trip, bool deleteTrip, const QVector<dive *> &dives); @@ -126,6 +127,7 @@ private slots: void divesMovedBetweenTrips(dive_trip *from, dive_trip *to, bool deleteFrom, bool createTo, const QVector<dive *> &dives); void divesSelected(dive_trip *trip, const QVector<dive *> &dives); void divesDeselected(dive_trip *trip, const QVector<dive *> &dives); + void currentDiveChanged(); private: // The model has up to two levels. At the top level, we have either trips or dives // that do not belong to trips. Such a top-level item is represented by the "Item" |