Once again try to fix the selection

Things got broken. Again. We no longer kept track of the selected dives in
our structures which broke statistics.

This attempts to fix that, but appears to still have a bug when selecting
trips. Sometimes this results in 0 dives being selected according to our
data structures, while Qt happily shows all dives of the trip as seected.

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
Dirk Hohndel 2013-05-31 21:05:33 +09:00
parent 9a65798daf
commit e88a9aa83e
4 changed files with 48 additions and 4 deletions

View file

@ -210,7 +210,7 @@ void DiveListView::selectionChanged(const QItemSelection& selected, const QItemS
disconnect(selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), this, SLOT(currentChanged(QModelIndex,QModelIndex)));
Q_FOREACH(const QModelIndex& index, newSelected.indexes()) {
if(index.column() != 0)
if (index.column() != 0)
continue;
const QAbstractItemModel *model = index.model();
@ -218,16 +218,42 @@ void DiveListView::selectionChanged(const QItemSelection& selected, const QItemS
if (!dive) { // it's a trip!
if (model->rowCount(index)) {
QItemSelection selection;
struct dive *child = (struct dive*) model->data(index.child(0,0), TreeItemDT::DIVE_ROLE).value<void*>();
while (child) {
select_dive(get_index_for_dive(child));
child = child->next;
}
selection.select(index.child(0,0), index.child(model->rowCount(index) -1 , 0));
selectionModel()->select(selection, QItemSelectionModel::Select | QItemSelectionModel::Rows);
selectionModel()->setCurrentIndex(index, QItemSelectionModel::Select | QItemSelectionModel::NoUpdate);
if (!isExpanded(index))
expand(index);
}
} else {
select_dive(get_index_for_dive(dive));
}
}
Q_FOREACH(const QModelIndex& index, newDeselected.indexes()) {
if (index.column() != 0)
continue;
const QAbstractItemModel *model = index.model();
struct dive *dive = (struct dive*) model->data(index, TreeItemDT::DIVE_ROLE).value<void*>();
if (!dive) { // it's a trip!
if (model->rowCount(index)) {
struct dive *child = (struct dive*) model->data(index.child(0,0), TreeItemDT::DIVE_ROLE).value<void*>();
while (child) {
deselect_dive(get_index_for_dive(child));
child = child->next;
}
}
} else {
deselect_dive(get_index_for_dive(dive));
}
}
QTreeView::selectionChanged(selectionModel()->selection(), newDeselected);
connect(selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(selectionChanged(QItemSelection,QItemSelection)));
connect(selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), this, SLOT(currentChanged(QModelIndex,QModelIndex)));
// now that everything is up to date, update the widgets
Q_EMIT currentDiveChanged(selected_dive);
}

View file

@ -94,6 +94,8 @@ void GlobeGPS::centerOn(dive* dive)
if (messageWidget->isVisible() && (!dive || dive_has_gps_location(dive))) {
messageWidget->animatedHide();
}
if (!dive)
return;
editingDiveCoords = 0;

View file

@ -272,6 +272,20 @@ void MainTab::updateDiveInfo(int dive)
weightModel->clear();
addCylinder->setEnabled(false);
addWeight->setEnabled(false);
ui->maximumDepthAllText->clear();
ui->minimumDepthAllText->clear();
ui->averageDepthAllText->clear();
ui->maximumSacAllText->clear();
ui->minimumSacAllText->clear();
ui->averageSacAllText->clear();
ui->divesAllText->clear();
ui->maximumTemperatureAllText->clear();
ui->minimumTemperatureAllText->clear();
ui->averageTemperatureAllText->clear();
ui->totalTimeAllText->clear();
ui->averageTimeAllText->clear();
ui->longestAllText->clear();
ui->shortestAllText->clear();
}
/* statisticsTab*/
/* we can access the stats_selection struct, but how do we ensure the relevant dives are selected

View file

@ -63,9 +63,11 @@ void MainWindow::refreshDisplay()
void MainWindow::current_dive_changed(int divenr)
{
if (amount_selected && divenr >= 0) {
select_dive(divenr);
ui->globe->centerOn(get_dive(selected_dive));
redrawProfile();
}
ui->InfoWidget->updateDiveInfo(divenr);
}