This moves the removal code to the model.

It's very important when programming via Model/View, in gtk or qt,
to not mess with the model data outside of the model. We were
deleting stuff that the model controlled outside of the model, so
it thought that there was still data there. This fixes the deletion
part, but there are also lots of other parts that I'll tackle in
the next commits.

Signed-off-by: Tomaz Canabrava <tcanabrava@kde.org>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
Tomaz Canabrava 2013-11-15 21:08:25 -02:00 committed by Dirk Hohndel
parent 06bf0e1849
commit 8827ea6f5d
3 changed files with 31 additions and 15 deletions

View file

@ -495,25 +495,23 @@ void DiveListView::deleteDive()
struct dive *d = (struct dive *) contextMenuIndex.data(DiveTripModel::DIVE_ROLE).value<void*>();
if (!d)
return;
// after a dive is deleted the ones following it move forward in the dive_table
// so instead of using the for_each_dive macro I'm using an explicit for loop
// to make this easier to understand
for (i = 0; i < dive_table.nr; i++) {
d = get_dive(i);
if (!d->selected)
continue;
delete_single_dive(i);
i--; // so the next dive isn't skipped... it's now #i
}
QSortFilterProxyModel *proxy = qobject_cast<QSortFilterProxyModel*>(model());
DiveTripModel *realModel = qobject_cast<DiveTripModel*>(proxy->sourceModel());
realModel->deleteSelectedDives();
struct dive* next_dive = 0;
if (amount_selected == 0) {
if (i > 0)
select_dive(nr - 1);
else
if (i > 0){
next_dive = get_dive(nr -1);
}
else{
mainWindow()->cleanUpEmpty();
}
}
mark_divelist_changed(TRUE);
mainWindow()->refreshDisplay();
reload(currentLayout, false);
if (next_dive)
selectDive(next_dive);
}
void DiveListView::testSlot()

View file

@ -1198,6 +1198,23 @@ QVariant DiveComputerModel::data(const QModelIndex& index, int role) const
return ret;
}
void DiveTripModel::deleteSelectedDives()
{
// after a dive is deleted the ones following it move forward in the dive_table
// so instead of using the for_each_dive macro I'm using an explicit for loop
// to make this easier to understand
beginRemoveRows(index(0,0), 0, rowCount()-1);
for (int i = 0; i < dive_table.nr; i++) {
struct dive *d = get_dive(i);
if (!d->selected)
continue;
delete_single_dive(i);
i--; // so the next dive isn't skipped... it's now #i
}
endRemoveRows();
setupModelData();
}
int DiveComputerModel::rowCount(const QModelIndex& parent) const
{
return numRows;

View file

@ -200,6 +200,7 @@ public:
DiveTripModel(QObject* parent = 0);
Layout layout() const;
void setLayout(Layout layout);
void deleteSelectedDives();
private:
void setupModelData();