subsurface/qt-ui/divelistview.cpp
Tomaz Canabrava d39b1aedcd Fix loading a second dive, after the first file was loaded.
This patch fixes loading a second dive-file after the first
one had been loaded. it simply clears some information and
makes sure that the current selected dive is invalid when
the file closes. I also did a bit of code cleanup on this one
to make things simpler in the future.

Signed-off-by: Tomaz Canabrava <tcanabrava@kde.org>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-05-16 12:23:38 -07:00

131 lines
3.9 KiB
C++

/*
* divelistview.cpp
*
* classes for the divelist of Subsurface
*
*/
#include "divelistview.h"
#include "models.h"
#include "modeldelegates.h"
#include <QApplication>
#include <QHeaderView>
#include <QDebug>
#include <QKeyEvent>
#include <QSortFilterProxyModel>
DiveListView::DiveListView(QWidget *parent) : QTreeView(parent), mouseClickSelection(false)
{
setUniformRowHeights(true);
setItemDelegateForColumn(TreeItemDT::RATING, new StarWidgetsDelegate());
QSortFilterProxyModel *model = new QSortFilterProxyModel(this);
setModel(model);
}
void DiveListView::reload()
{
QSortFilterProxyModel *m = qobject_cast<QSortFilterProxyModel*>(model());
QAbstractItemModel *oldModel = m->sourceModel();
oldModel->deleteLater();
m->setSourceModel(new DiveTripModel(this));
sortByColumn(0, Qt::DescendingOrder);
QModelIndex firstDiveOrTrip = m->index(0,0);
if (firstDiveOrTrip.isValid()){
if (m->index(0,0, firstDiveOrTrip).isValid())
setCurrentIndex(m->index(0,0, firstDiveOrTrip));
else
setCurrentIndex(firstDiveOrTrip);
}
}
void DiveListView::setModel(QAbstractItemModel* model)
{
QTreeView::setModel(model);
}
void DiveListView::setSelection(const QRect& rect, QItemSelectionModel::SelectionFlags command)
{
if (mouseClickSelection)
QTreeView::setSelection(rect, command);
}
void DiveListView::mousePressEvent(QMouseEvent* event)
{
mouseClickSelection = true;
QTreeView::mousePressEvent(event);
}
void DiveListView::mouseReleaseEvent(QMouseEvent* event)
{
mouseClickSelection = false;
QTreeView::mouseReleaseEvent(event);
}
void DiveListView::keyPressEvent(QKeyEvent* event)
{
if(event->modifiers())
mouseClickSelection = true;
QTreeView::keyPressEvent(event);
}
void DiveListView::keyReleaseEvent(QKeyEvent* event)
{
mouseClickSelection = false;
QWidget::keyReleaseEvent(event);
}
void DiveListView::currentChanged(const QModelIndex& current, const QModelIndex& previous)
{
if (!current.isValid())
return;
const QAbstractItemModel *model = current.model();
int selectedDive = 0;
struct dive *dive = (struct dive*) model->data(current, TreeItemDT::DIVE_ROLE).value<void*>();
if (!dive) { // it's a trip! select first child.
dive = (struct dive*) model->data(current.child(0,0), TreeItemDT::DIVE_ROLE).value<void*>();
selectedDive = get_divenr(dive);
}else{
selectedDive = get_divenr(dive);
}
if (selectedDive == selected_dive)
return;
Q_EMIT currentDiveChanged(selectedDive);
}
void DiveListView::selectionChanged(const QItemSelection& selected, const QItemSelection& deselected)
{
QList<QModelIndex> parents;
Q_FOREACH(const QModelIndex& index, deselected.indexes()) {
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)) {
expand(index); // leave this - even if it looks like it shouldn't be here. looks like I've found a Qt bug.
// the subselection is removed, but the painting is not. this cleans the area.
}
} else if (!parents.contains(index.parent())) {
parents.push_back(index.parent());
}
}
Q_FOREACH(const QModelIndex& index, selected.indexes()) {
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)) {
QItemSelection selection;
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 if (!parents.contains(index.parent())) {
parents.push_back(index.parent());
}
}
Q_FOREACH(const QModelIndex& index, parents)
expand(index);
}