mirror of
https://github.com/subsurface/subsurface.git
synced 2024-11-30 22:20:21 +00:00
Selection: move selection of "first" dive to core
The DiveListView has a function to select the first dive. Move this to the core to be able to call it from all parts (not only desktop) of the code. Currently, this has a (small?) UI regression: when filtering dives and no selected dive is visible anymore, the old code would select the first dive in the list. The new code selects the newest dive, which might not be the first if some sort-criterion is active. To revert to the old behavior, it will be necessary to move the sorting function likewise to the core. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
parent
86f384f932
commit
755f185cfc
4 changed files with 16 additions and 26 deletions
|
@ -210,3 +210,16 @@ std::vector<dive *> getDiveSelection()
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Select the first dive that is visible
|
||||||
|
extern "C" void select_newest_visible_dive()
|
||||||
|
{
|
||||||
|
for (int i = dive_table.nr - 1; i >= 0; --i) {
|
||||||
|
dive *d = dive_table.dives[i];
|
||||||
|
if (!d->hidden_by_filter)
|
||||||
|
return setSelection({ d }, d);
|
||||||
|
}
|
||||||
|
|
||||||
|
// No visible dive -> deselect all
|
||||||
|
setSelection({}, nullptr);
|
||||||
|
}
|
||||||
|
|
|
@ -19,6 +19,7 @@ extern void deselect_dive(struct dive *dive);
|
||||||
extern struct dive *first_selected_dive(void);
|
extern struct dive *first_selected_dive(void);
|
||||||
extern struct dive *last_selected_dive(void);
|
extern struct dive *last_selected_dive(void);
|
||||||
extern bool consecutive_selected(void);
|
extern bool consecutive_selected(void);
|
||||||
|
extern void select_newest_visible_dive();
|
||||||
|
|
||||||
#if DEBUG_SELECTION_TRACKING
|
#if DEBUG_SELECTION_TRACKING
|
||||||
extern void dump_selection(void);
|
extern void dump_selection(void);
|
||||||
|
|
|
@ -474,28 +474,6 @@ void DiveListView::selectDives(const QList<int> &newDiveSelection)
|
||||||
selectionChangeDone();
|
selectionChangeDone();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get index of first dive. This assumes that trips without dives are never shown.
|
|
||||||
// May return an invalid index if no dive is found.
|
|
||||||
QModelIndex DiveListView::indexOfFirstDive()
|
|
||||||
{
|
|
||||||
// Fetch the first top-level item. If this is a trip, it is supposed to have at least
|
|
||||||
// one child. In that case return the child. Otherwise return the top-level item, which
|
|
||||||
// should be a dive.
|
|
||||||
QAbstractItemModel *m = model();
|
|
||||||
QModelIndex firstDiveOrTrip = m->index(0, 0);
|
|
||||||
if (!firstDiveOrTrip.isValid())
|
|
||||||
return QModelIndex();
|
|
||||||
QModelIndex child = m->index(0, 0, firstDiveOrTrip);
|
|
||||||
return child.isValid() ? child : firstDiveOrTrip;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DiveListView::selectFirstDive()
|
|
||||||
{
|
|
||||||
QModelIndex first = indexOfFirstDive();
|
|
||||||
if (first.isValid())
|
|
||||||
setCurrentIndex(first);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DiveListView::eventFilter(QObject *, QEvent *event)
|
bool DiveListView::eventFilter(QObject *, QEvent *event)
|
||||||
{
|
{
|
||||||
if (event->type() != QEvent::KeyPress)
|
if (event->type() != QEvent::KeyPress)
|
||||||
|
@ -544,7 +522,7 @@ void DiveListView::reload()
|
||||||
if (amount_selected && current_dive != NULL)
|
if (amount_selected && current_dive != NULL)
|
||||||
selectDive(get_divenr(current_dive), true);
|
selectDive(get_divenr(current_dive), true);
|
||||||
else
|
else
|
||||||
selectFirstDive();
|
select_newest_visible_dive();
|
||||||
if (selectedIndexes().count()) {
|
if (selectedIndexes().count()) {
|
||||||
QModelIndex curr = selectedIndexes().first();
|
QModelIndex curr = selectedIndexes().first();
|
||||||
curr = curr.parent().isValid() ? curr.parent() : curr;
|
curr = curr.parent().isValid() ? curr.parent() : curr;
|
||||||
|
@ -1114,7 +1092,7 @@ void DiveListView::filterFinished()
|
||||||
|
|
||||||
// If there are no more selected dives, select the first visible dive
|
// If there are no more selected dives, select the first visible dive
|
||||||
if (!selectionModel()->hasSelection())
|
if (!selectionModel()->hasSelection())
|
||||||
selectFirstDive();
|
select_newest_visible_dive();
|
||||||
emit divesSelected();
|
emit divesSelected();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -34,8 +34,6 @@ public:
|
||||||
void selectDive(QModelIndex index, bool scrollto = false, bool toggle = false);
|
void selectDive(QModelIndex index, bool scrollto = false, bool toggle = false);
|
||||||
void selectDive(int dive_table_idx, bool scrollto = false, bool toggle = false);
|
void selectDive(int dive_table_idx, bool scrollto = false, bool toggle = false);
|
||||||
void selectDives(const QList<int> &newDiveSelection);
|
void selectDives(const QList<int> &newDiveSelection);
|
||||||
void selectFirstDive();
|
|
||||||
QModelIndex indexOfFirstDive();
|
|
||||||
void rememberSelection();
|
void rememberSelection();
|
||||||
void restoreSelection();
|
void restoreSelection();
|
||||||
void contextMenuEvent(QContextMenuEvent *event);
|
void contextMenuEvent(QContextMenuEvent *event);
|
||||||
|
|
Loading…
Reference in a new issue