Selection: move initialization of selection from view to model

The goal here is to unify desktop and mobile by moving
selection code from the desktop-only view.
Currently, initialization of the selection still has to be
called from the view after connecting the appropriate signals.
This is due to the weird way in which create completely new
models when resetting them.

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
Berthold Stoeger 2019-11-26 00:08:35 +01:00 committed by bstoeger
parent 755f185cfc
commit a431840075
3 changed files with 22 additions and 6 deletions

View file

@ -86,8 +86,11 @@ void DiveListView::resetModel()
MultiFilterSortModel::instance()->resetModel(currentLayout);
// If the model was reset, we have to reconnect the signals and tell
// the filter model to update its source model.
connect(DiveTripModelBase::instance(), &DiveTripModelBase::selectionChanged, this, &DiveListView::diveSelectionChanged);
connect(DiveTripModelBase::instance(), &DiveTripModelBase::currentDiveChanged, this, &DiveListView::currentDiveChanged);
DiveTripModelBase *m = DiveTripModelBase::instance();
connect(m, &DiveTripModelBase::selectionChanged, this, &DiveListView::diveSelectionChanged);
connect(m, &DiveTripModelBase::currentDiveChanged, this, &DiveListView::currentDiveChanged);
// Get the initial selection
m->initSelection();
}
void DiveListView::calculateInitialColumnWidth(int col)
@ -519,10 +522,6 @@ void DiveListView::reload()
{
resetModel();
if (amount_selected && current_dive != NULL)
selectDive(get_divenr(current_dive), true);
else
select_newest_visible_dive();
if (selectedIndexes().count()) {
QModelIndex curr = selectedIndexes().first();
curr = curr.parent().isValid() ? curr.parent() : curr;

View file

@ -3,6 +3,7 @@
#include "core/divefilter.h"
#include "core/gettextfromc.h"
#include "core/metrics.h"
#include "core/selection.h"
#include "core/trip.h"
#include "core/qthelper.h"
#include "core/divesite.h"
@ -372,6 +373,19 @@ void DiveTripModelBase::resetModel(DiveTripModelBase::Layout layout)
currentModel.reset(new DiveTripModelList);
}
// After resetting the model, the higher up model or view may call this
// function to get informed on the current selection.
// TODO: Currently, this reads and resets the selection. Make this more
// efficient by maintaining a list of selected dives.
void DiveTripModelBase::initSelection()
{
std::vector<dive *> dives = getDiveSelection();
if (!dives.empty())
setSelection(dives, current_dive);
else
select_newest_visible_dive();
}
void DiveTripModelBase::clear()
{
beginResetModel();

View file

@ -72,6 +72,9 @@ public:
// by instance().
static void resetModel(Layout layout);
// Call after having set the model to be informed of the current selection.
void initSelection();
// Clear all dives
void clear();