mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
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:
parent
06bf0e1849
commit
8827ea6f5d
3 changed files with 31 additions and 15 deletions
|
@ -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()
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -200,6 +200,7 @@ public:
|
|||
DiveTripModel(QObject* parent = 0);
|
||||
Layout layout() const;
|
||||
void setLayout(Layout layout);
|
||||
void deleteSelectedDives();
|
||||
|
||||
private:
|
||||
void setupModelData();
|
||||
|
|
Loading…
Add table
Reference in a new issue