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;
}
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 };
/* 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 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_divesite_idx(struct dive_site *ds);
extern dive_trip_t *find_matching_trip(timestamp_t when);
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);

View file

@ -39,16 +39,10 @@ QVariant LocationInformationModel::data(const QModelIndex &index, int role) cons
void LocationInformationModel::update()
{
if (rowCount()) {
beginRemoveRows(QModelIndex(), 0, rowCount()-1);
endRemoveRows();
}
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();
}
beginResetModel();
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);
endResetModel();
}
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);
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;
int32_t addDiveSite(const QString& name, int lat = 0, int lon = 0);
bool setData(const QModelIndex &index, const QVariant &value, int role);
bool removeRows(int row, int count, const QModelIndex & parent = QModelIndex());
public slots:
void update();
private:

View file

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

View file

@ -243,6 +243,10 @@ void MainTab::disableGeoLookupEdition()
}
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"));
displayed_dive.dive_site_uuid = dive_site_uuid;
emit requestDiveSiteEdit(dive_site_uuid);
@ -429,7 +433,10 @@ bool MainTab::isEditing()
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)