mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
Dive list: propagate current-item to frontend
The command-objects select a current item, but this selection was not propagated to the front-end. The current item is the base for keyboard-navigation through the dive-list and therefore should be set correctly. It took some experimentation to get the flags right: QItemSelectionModel::Current Hopefully, these are the correct flags across all supported Qt versions! Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
parent
b16be29595
commit
3c6cdfd8c0
6 changed files with 74 additions and 5 deletions
|
@ -423,7 +423,12 @@ void DiveListBase::restoreSelection(const std::vector<dive *> &selection, dive *
|
||||||
});
|
});
|
||||||
|
|
||||||
bool currentDiveChanged = false;
|
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;
|
currentDiveChanged = true;
|
||||||
|
|
||||||
// We cannot simply change the currentd dive to the given dive.
|
// We cannot simply change the currentd dive to the given dive.
|
||||||
|
|
|
@ -45,6 +45,7 @@ DiveListView::DiveListView(QWidget *parent) : QTreeView(parent), mouseClickSelec
|
||||||
setSelectionMode(ExtendedSelection);
|
setSelectionMode(ExtendedSelection);
|
||||||
header()->setContextMenuPolicy(Qt::ActionsContextMenu);
|
header()->setContextMenuPolicy(Qt::ActionsContextMenu);
|
||||||
connect(DiveTripModel::instance(), &DiveTripModel::selectionChanged, this, &DiveListView::diveSelectionChanged);
|
connect(DiveTripModel::instance(), &DiveTripModel::selectionChanged, this, &DiveListView::diveSelectionChanged);
|
||||||
|
connect(DiveTripModel::instance(), &DiveTripModel::newCurrentDive, this, &DiveListView::currentDiveChanged);
|
||||||
|
|
||||||
header()->setStretchLastSection(true);
|
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
|
// 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)
|
void DiveListView::rowsInserted(const QModelIndex &parent, int start, int end)
|
||||||
{
|
{
|
||||||
|
|
|
@ -59,6 +59,7 @@ slots:
|
||||||
void loadImages();
|
void loadImages();
|
||||||
void loadWebImages();
|
void loadWebImages();
|
||||||
void diveSelectionChanged(const QVector<QModelIndex> &indexes, bool select);
|
void diveSelectionChanged(const QVector<QModelIndex> &indexes, bool select);
|
||||||
|
void currentDiveChanged(QModelIndex index);
|
||||||
private:
|
private:
|
||||||
bool mouseClickSelection;
|
bool mouseClickSelection;
|
||||||
QList<int> expandedRows;
|
QList<int> expandedRows;
|
||||||
|
|
|
@ -530,11 +530,17 @@ void MainWindow::configureToolbar() {
|
||||||
|
|
||||||
void MainWindow::selectionChanged()
|
void MainWindow::selectionChanged()
|
||||||
{
|
{
|
||||||
|
if (!current_dive) {
|
||||||
|
information()->clearTabs();
|
||||||
|
information()->updateDiveInfo(true);
|
||||||
|
graphics()->setEmptyState();
|
||||||
|
} else {
|
||||||
graphics()->plotDive(nullptr, false, true);
|
graphics()->plotDive(nullptr, false, true);
|
||||||
information()->updateDiveInfo();
|
information()->updateDiveInfo();
|
||||||
configureToolbar();
|
configureToolbar();
|
||||||
MapWidget::instance()->reload();
|
MapWidget::instance()->reload();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void MainWindow::on_actionNew_triggered()
|
void MainWindow::on_actionNew_triggered()
|
||||||
{
|
{
|
||||||
|
|
|
@ -442,6 +442,7 @@ DiveTripModel::DiveTripModel(QObject *parent) :
|
||||||
connect(&diveListNotifier, &DiveListNotifier::divesTimeChanged, this, &DiveTripModel::divesTimeChanged);
|
connect(&diveListNotifier, &DiveListNotifier::divesTimeChanged, this, &DiveTripModel::divesTimeChanged);
|
||||||
connect(&diveListNotifier, &DiveListNotifier::divesSelected, this, &DiveTripModel::divesSelected);
|
connect(&diveListNotifier, &DiveListNotifier::divesSelected, this, &DiveTripModel::divesSelected);
|
||||||
connect(&diveListNotifier, &DiveListNotifier::divesDeselected, this, &DiveTripModel::divesDeselected);
|
connect(&diveListNotifier, &DiveListNotifier::divesDeselected, this, &DiveTripModel::divesDeselected);
|
||||||
|
connect(&diveListNotifier, &DiveListNotifier::currentDiveChanged, this, &DiveTripModel::currentDiveChanged);
|
||||||
}
|
}
|
||||||
|
|
||||||
int DiveTripModel::columnCount(const QModelIndex&) const
|
int DiveTripModel::columnCount(const QModelIndex&) const
|
||||||
|
@ -1166,3 +1167,41 @@ void DiveTripModel::changeDiveSelection(dive_trip *trip, const QVector<dive *> &
|
||||||
|
|
||||||
emit selectionChanged(indexes, select);
|
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));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -118,6 +118,7 @@ signals:
|
||||||
// indexes into local indexes according to current sorting/filtering and instructs the QSelectionModel to
|
// indexes into local indexes according to current sorting/filtering and instructs the QSelectionModel to
|
||||||
// perform the appropriate actions.
|
// perform the appropriate actions.
|
||||||
void selectionChanged(const QVector<QModelIndex> &indexes, bool select);
|
void selectionChanged(const QVector<QModelIndex> &indexes, bool select);
|
||||||
|
void newCurrentDive(QModelIndex index);
|
||||||
private slots:
|
private slots:
|
||||||
void divesAdded(dive_trip *trip, bool addTrip, const QVector<dive *> &dives);
|
void divesAdded(dive_trip *trip, bool addTrip, const QVector<dive *> &dives);
|
||||||
void divesDeleted(dive_trip *trip, bool deleteTrip, 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 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 divesSelected(dive_trip *trip, const QVector<dive *> &dives);
|
||||||
void divesDeselected(dive_trip *trip, const QVector<dive *> &dives);
|
void divesDeselected(dive_trip *trip, const QVector<dive *> &dives);
|
||||||
|
void currentDiveChanged();
|
||||||
private:
|
private:
|
||||||
// The model has up to two levels. At the top level, we have either trips or dives
|
// 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"
|
// that do not belong to trips. Such a top-level item is represented by the "Item"
|
||||||
|
|
Loading…
Add table
Reference in a new issue