Simplify model handling and crashes fixes

So, there's only one crash left (that I put a big TODO: on the maintab.cpp
about) and I'll fix it tomorrow as it's quite late here and I'm almost
sleeping at the keyboard.

Signed-off-by: Tomaz Canabrava <tomaz.canabrava@gmail.com>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
Tomaz Canabrava 2015-06-01 23:13:51 -03:00 committed by Dirk Hohndel
parent ee9746c622
commit 6cd85d9b73
6 changed files with 41 additions and 13 deletions

View file

@ -341,6 +341,19 @@ int get_divenr(struct dive *dive)
return -1; return -1;
} }
int get_divesite_idx(struct dive_site *ds)
{
int i;
struct dive_site *d;
// tempting as it may be, don't die when called with dive=NULL
if (ds)
for_each_dive_site(i, d) {
if (d->uuid == ds->uuid) // don't compare pointers, we could be passing in a copy of the dive
return i;
}
return -1;
}
static struct gasmix air = { .o2.permille = O2_IN_AIR, .he.permille = 0 }; static struct gasmix air = { .o2.permille = O2_IN_AIR, .he.permille = 0 };
/* take into account previous dives until there is a 48h gap between dives */ /* take into account previous dives until there is a 48h gap between dives */

View file

@ -22,6 +22,7 @@ extern dive_trip_t *find_trip_by_idx(int idx);
extern int trip_has_selected_dives(dive_trip_t *trip); extern int trip_has_selected_dives(dive_trip_t *trip);
extern void get_dive_gas(struct dive *dive, int *o2_p, int *he_p, int *o2low_p); extern void get_dive_gas(struct dive *dive, int *o2_p, int *he_p, int *o2low_p);
extern int get_divenr(struct dive *dive); extern int get_divenr(struct dive *dive);
extern int get_divesite_idx(struct dive_site *ds);
extern dive_trip_t *find_matching_trip(timestamp_t when); extern dive_trip_t *find_matching_trip(timestamp_t when);
extern void remove_dive_from_trip(struct dive *dive, short was_autogen); extern void remove_dive_from_trip(struct dive *dive, short was_autogen);
extern dive_trip_t *create_and_hookup_trip_from_dive(struct dive *dive); extern dive_trip_t *create_and_hookup_trip_from_dive(struct dive *dive);

View file

@ -39,16 +39,10 @@ QVariant LocationInformationModel::data(const QModelIndex &index, int role) cons
void LocationInformationModel::update() void LocationInformationModel::update()
{ {
if (rowCount()) { beginResetModel();
beginRemoveRows(QModelIndex(), 0, rowCount()-1); internalRowCount = dive_site_table.nr;
endRemoveRows(); std::sort(dive_site_table.dive_sites, dive_site_table.dive_sites + dive_site_table.nr, dive_site_less_than);
} endResetModel();
if (dive_site_table.nr) {
beginInsertRows(QModelIndex(), 0, dive_site_table.nr);
internalRowCount = dive_site_table.nr;
std::sort(dive_site_table.dive_sites, dive_site_table.dive_sites + dive_site_table.nr, dive_site_less_than);
endInsertRows();
}
} }
int32_t LocationInformationModel::addDiveSite(const QString& name, int lon, int lat) int32_t LocationInformationModel::addDiveSite(const QString& name, int lon, int lat)
@ -76,3 +70,14 @@ bool LocationInformationModel::setData(const QModelIndex &index, const QVariant
emit dataChanged(index, index); emit dataChanged(index, index);
return true; return true;
} }
bool LocationInformationModel::removeRows(int row, int count, const QModelIndex & parent) {
if(row >= rowCount())
return false;
beginRemoveRows(QModelIndex(), row, row);
struct dive_site *ds = get_dive_site(row);
delete_dive_site(ds->uuid);
endRemoveRows();
return true;
}

View file

@ -13,6 +13,8 @@ public:
QVariant data(const QModelIndex &index = QModelIndex(), int role = Qt::DisplayRole) const; QVariant data(const QModelIndex &index = QModelIndex(), int role = Qt::DisplayRole) const;
int32_t addDiveSite(const QString& name, int lat = 0, int lon = 0); int32_t addDiveSite(const QString& name, int lat = 0, int lon = 0);
bool setData(const QModelIndex &index, const QVariant &value, int role); bool setData(const QModelIndex &index, const QVariant &value, int role);
bool removeRows(int row, int count, const QModelIndex & parent = QModelIndex());
public slots: public slots:
void update(); void update();
private: private:

View file

@ -91,7 +91,7 @@ void LocationInformationWidget::acceptChanges()
currentDs->notes = copy_string(uiString); currentDs->notes = copy_string(uiString);
} }
if (dive_site_is_empty(currentDs)) { if (dive_site_is_empty(currentDs)) {
delete_dive_site(currentDs->uuid); LocationInformationModel::instance()->removeRow(get_divesite_idx(currentDs));
displayed_dive.dive_site_uuid = 0; displayed_dive.dive_site_uuid = 0;
} }
@ -104,7 +104,7 @@ void LocationInformationWidget::acceptChanges()
void LocationInformationWidget::rejectChanges() void LocationInformationWidget::rejectChanges()
{ {
if (currentDs && dive_site_is_empty(currentDs)) { if (currentDs && dive_site_is_empty(currentDs)) {
delete_dive_site(currentDs->uuid); LocationInformationModel::instance()->removeRow(get_divesite_idx(currentDs));
displayed_dive.dive_site_uuid = 0; displayed_dive.dive_site_uuid = 0;
} }
resetState(); resetState();

View file

@ -243,6 +243,10 @@ void MainTab::disableGeoLookupEdition()
} }
void MainTab::prepareDiveSiteEdit() { void MainTab::prepareDiveSiteEdit() {
// TODO: This is wrong. We can only set this if we Accepted the dive site edit
// And not if we cancelled. Currently we are seting directly without even
// thinking - but too tired, fix this tomorrow.
uint32_t dive_site_uuid = LocationInformationModel::instance()->addDiveSite(tr("Unnamed")); uint32_t dive_site_uuid = LocationInformationModel::instance()->addDiveSite(tr("Unnamed"));
displayed_dive.dive_site_uuid = dive_site_uuid; displayed_dive.dive_site_uuid = dive_site_uuid;
emit requestDiveSiteEdit(dive_site_uuid); emit requestDiveSiteEdit(dive_site_uuid);
@ -429,7 +433,10 @@ bool MainTab::isEditing()
void MainTab::showLocation() void MainTab::showLocation()
{ {
ui.location->setCurrentText(get_dive_location(&displayed_dive)); if (get_dive_site_by_uuid(displayed_dive.dive_site_uuid))
ui.location->setCurrentText(get_dive_location(&displayed_dive));
else
ui.location->setCurrentIndex(-1);
} }
void MainTab::updateDiveInfo(bool clear) void MainTab::updateDiveInfo(bool clear)