mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
Trying to make the DiveList selection behave correctly
And rip out all the code that Dirk put there to do that. Signed-off-by: Tomaz Canabrava <tcanabrava@kde.org> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
parent
a6d9f27445
commit
ee7f579242
5 changed files with 73 additions and 201 deletions
|
@ -9,9 +9,66 @@
|
||||||
#include "modeldelegates.h"
|
#include "modeldelegates.h"
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include <QHeaderView>
|
#include <QHeaderView>
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QKeyEvent>
|
||||||
|
|
||||||
DiveListView::DiveListView(QWidget *parent) : QTreeView(parent)
|
|
||||||
|
DiveListView::DiveListView(QWidget *parent) : QTreeView(parent), mouseClickSelection(false)
|
||||||
{
|
{
|
||||||
setUniformRowHeights(true);
|
setUniformRowHeights(true);
|
||||||
setItemDelegateForColumn(TreeItemDT::RATING, new StarWidgetsDelegate());
|
setItemDelegateForColumn(TreeItemDT::RATING, new StarWidgetsDelegate());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
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::selectionChanged(const QItemSelection& selected, const QItemSelection& deselected)
|
||||||
|
{
|
||||||
|
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) { // is's a trip!
|
||||||
|
if (model->rowCount(index)) {
|
||||||
|
expand(index); // leave this - even if it looks like it shouldn't be here. looks like I'v found a Qt bug.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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) { // is's a trip!
|
||||||
|
if (model->rowCount(index)) {
|
||||||
|
expand(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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
expand(index.parent());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,17 @@ class DiveListView : public QTreeView
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
DiveListView(QWidget *parent = 0);
|
DiveListView(QWidget *parent = 0);
|
||||||
|
|
||||||
|
void selectionChanged(const QItemSelection& selected, const QItemSelection& deselected);
|
||||||
|
void setModel(QAbstractItemModel* model);
|
||||||
|
|
||||||
|
void mousePressEvent(QMouseEvent* event);
|
||||||
|
void mouseReleaseEvent(QMouseEvent* event);
|
||||||
|
|
||||||
|
void setSelection(const QRect& rect, QItemSelectionModel::SelectionFlags command);
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool mouseClickSelection;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // DIVELISTVIEW_H
|
#endif // DIVELISTVIEW_H
|
||||||
|
|
|
@ -36,24 +36,12 @@ MainWindow::MainWindow() : ui(new Ui::MainWindow()),
|
||||||
sortModel->setSourceModel(model);
|
sortModel->setSourceModel(model);
|
||||||
ui->ListWidget->setModel(sortModel);
|
ui->ListWidget->setModel(sortModel);
|
||||||
setWindowIcon(QIcon(":subsurface-icon"));
|
setWindowIcon(QIcon(":subsurface-icon"));
|
||||||
connect(ui->ListWidget->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
|
|
||||||
this, SLOT(dive_selection_changed(QItemSelection,QItemSelection)));
|
|
||||||
QModelIndex firstDiveOrTrip = sortModel->index(0,0);
|
QModelIndex firstDiveOrTrip = sortModel->index(0,0);
|
||||||
if (sortModel->index(0,0, firstDiveOrTrip).isValid())
|
if (sortModel->index(0,0, firstDiveOrTrip).isValid())
|
||||||
ui->ListWidget->setCurrentIndex(sortModel->index(0,0, firstDiveOrTrip));
|
ui->ListWidget->setCurrentIndex(sortModel->index(0,0, firstDiveOrTrip));
|
||||||
else
|
else
|
||||||
ui->ListWidget->setCurrentIndex(firstDiveOrTrip);
|
ui->ListWidget->setCurrentIndex(firstDiveOrTrip);
|
||||||
|
|
||||||
#if 0
|
|
||||||
QAction *actionNextDive = new QAction(this);
|
|
||||||
addAction(actionNextDive);
|
|
||||||
actionNextDive->setShortcut(Qt::Key_Down);
|
|
||||||
connect(actionNextDive, SIGNAL(triggered()), this, SLOT(nextDive_triggered()));
|
|
||||||
QAction *actionPreviousDive = new QAction(this);
|
|
||||||
addAction(actionPreviousDive);
|
|
||||||
actionPreviousDive->setShortcut(Qt::Key_Up);
|
|
||||||
connect(actionPreviousDive, SIGNAL(triggered()), this, SLOT(previousDive_triggered()));
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::redrawProfile()
|
void MainWindow::redrawProfile()
|
||||||
|
@ -61,98 +49,6 @@ void MainWindow::redrawProfile()
|
||||||
ui->ProfileWidget->plot(get_dive(selected_dive));
|
ui->ProfileWidget->plot(get_dive(selected_dive));
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
void MainWindow::nextDive_triggered()
|
|
||||||
{
|
|
||||||
// Get the current Selection:
|
|
||||||
QItemSelectionModel *m = ui->ListWidget->selectionModel();
|
|
||||||
QModelIndexList selection = m->selectedRows();
|
|
||||||
|
|
||||||
if (!selection.size())
|
|
||||||
return;
|
|
||||||
|
|
||||||
// check if it's a dive or trip:
|
|
||||||
QModelIndex index = selection.first();
|
|
||||||
struct dive *d = (struct dive*) index.data(TreeItemDT::DIVE_ROLE).value<void*>();
|
|
||||||
const QAbstractItemModel *model = index.model();
|
|
||||||
|
|
||||||
QItemSelectionModel::SelectionFlags flags = (QItemSelectionModel::Select | QItemSelectionModel::Rows);
|
|
||||||
|
|
||||||
if (d) {
|
|
||||||
// it's a dive.
|
|
||||||
QModelIndex trip = index.parent();
|
|
||||||
|
|
||||||
// checks if it's the last dive on a trip list:
|
|
||||||
if (index.row() == model->rowCount(trip) - 1) {
|
|
||||||
// selects a trip.
|
|
||||||
QModelIndex nexttrip = model->index(trip.row()+1, trip.column(), trip.parent());
|
|
||||||
if (nexttrip.isValid()) {
|
|
||||||
m->clear();
|
|
||||||
m->select(nexttrip, flags);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
m->clear();
|
|
||||||
m->select(model->index(index.row()+1, index.column(), index.parent()), flags);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// it's a trip (and we have no empty trips, so there is a first child)
|
|
||||||
QModelIndex child = index.child(0,0);
|
|
||||||
m->select(model->index(0, index.column(), index), flags);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::previousDive_triggered()
|
|
||||||
{
|
|
||||||
// Get the current Selection:
|
|
||||||
QItemSelectionModel *m = ui->ListWidget->selectionModel();
|
|
||||||
QModelIndexList selection = m->selectedRows();
|
|
||||||
|
|
||||||
if (!selection.size())
|
|
||||||
return;
|
|
||||||
|
|
||||||
// check if it's a dive or trip:
|
|
||||||
QModelIndex index = selection.first();
|
|
||||||
struct dive *d = (struct dive*) index.data(TreeItemDT::DIVE_ROLE).value<void*>();
|
|
||||||
const QAbstractItemModel *model = index.model();
|
|
||||||
|
|
||||||
QItemSelectionModel::SelectionFlags flags = (QItemSelectionModel::Select | QItemSelectionModel::Rows);
|
|
||||||
|
|
||||||
if (d) {
|
|
||||||
// it's a dive.
|
|
||||||
QModelIndex trip = index.parent();
|
|
||||||
|
|
||||||
// checks if it's the first dive on a trip list:
|
|
||||||
if (index.row() == 0) {
|
|
||||||
if (trip.isValid()) {
|
|
||||||
// select the trip this dive is in
|
|
||||||
m->clear();
|
|
||||||
m->select(model->index(trip.row(), trip.column(), trip.parent()),flags);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// select the previous dive
|
|
||||||
m->clear();
|
|
||||||
m->select(model->index(index.row() - 1, index.column(), index.parent()), flags);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// it's a trip.
|
|
||||||
if (index.row() != 0) {
|
|
||||||
QModelIndex prevtrip = index.sibling(index.row() - 1, 0);
|
|
||||||
if (!prevtrip.isValid())
|
|
||||||
return;
|
|
||||||
int cnt = prevtrip.model()->rowCount();
|
|
||||||
QModelIndex child = prevtrip.child(prevtrip.model()->rowCount() - 1, 0);
|
|
||||||
/* I don't understand why this gives me incorrect rowCount... */
|
|
||||||
while(!child.isValid() && cnt > 0)
|
|
||||||
child = prevtrip.child(--cnt, 0);
|
|
||||||
if (!child.isValid())
|
|
||||||
return;
|
|
||||||
m->clear();
|
|
||||||
m->select(model->index(child.row(), index.column(), prevtrip), flags);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void MainWindow::on_actionNew_triggered()
|
void MainWindow::on_actionNew_triggered()
|
||||||
{
|
{
|
||||||
qDebug("actionNew");
|
qDebug("actionNew");
|
||||||
|
@ -188,88 +84,6 @@ void MainWindow::on_actionOpen_triggered()
|
||||||
ui->ListWidget->sortByColumn(0, Qt::DescendingOrder);
|
ui->ListWidget->sortByColumn(0, Qt::DescendingOrder);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::dive_selection_changed(const QItemSelection& newSelection, const QItemSelection& oldSelection)
|
|
||||||
{
|
|
||||||
int cnt, i;
|
|
||||||
/* first deselect the dives that are no longer selected */
|
|
||||||
Q_FOREACH(const QModelIndex& deselect, oldSelection.indexes()) {
|
|
||||||
struct dive *d = (struct dive*) deselect.data(TreeItemDT::DIVE_ROLE).value<void*>();
|
|
||||||
if (!d) {
|
|
||||||
// this is a trip - if just the trip is deselected but not its children,
|
|
||||||
// then we manually need to deselect its children
|
|
||||||
const QAbstractItemModel *model = deselect.model();
|
|
||||||
cnt = model->rowCount(deselect);
|
|
||||||
if (cnt == 0)
|
|
||||||
continue;
|
|
||||||
for (i = 0; i < cnt; i++) {
|
|
||||||
QModelIndex child = deselect.child(i,0);
|
|
||||||
if (oldSelection.contains(child))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
// if none of the dives were in the deselect list (so the user only ctrl-clicked
|
|
||||||
// on the trip header) then manually deselect all the dives
|
|
||||||
if (i == model->rowCount(deselect)) {
|
|
||||||
QItemSelectionModel::SelectionFlags flags = (QItemSelectionModel::Deselect |
|
|
||||||
QItemSelectionModel::Rows);
|
|
||||||
QItemSelection removedDives = QItemSelection();
|
|
||||||
removedDives.select(deselect.child(0,0), deselect.child(i - 1,0));
|
|
||||||
ui->ListWidget->selectionModel()->select(removedDives,flags);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!d || !d->selected)
|
|
||||||
continue;
|
|
||||||
deselect_dive(get_divenr(d));
|
|
||||||
}
|
|
||||||
/* then select the newly selected dives */
|
|
||||||
bool needToScroll = TRUE;
|
|
||||||
Q_FOREACH(const QModelIndex& select, newSelection.indexes()) {
|
|
||||||
struct dive *d = (struct dive*) select.data(TreeItemDT::DIVE_ROLE).value<void*>();
|
|
||||||
if (!d) {
|
|
||||||
// this is a trip
|
|
||||||
const QAbstractItemModel *model = select.model();
|
|
||||||
cnt = model->rowCount(select);
|
|
||||||
if (cnt == 0)
|
|
||||||
continue;
|
|
||||||
for (i = 0; i < cnt; i++) {
|
|
||||||
QModelIndex child = select.child(i,0);
|
|
||||||
if (newSelection.contains(child))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
// if just the trip header was clicked and none of its children,
|
|
||||||
// select all of them
|
|
||||||
if (i == model->rowCount(select)) {
|
|
||||||
if (needToScroll) {
|
|
||||||
// make sure the trip header is visible
|
|
||||||
needToScroll = FALSE;
|
|
||||||
ui->ListWidget->scrollTo(select, QAbstractItemView::PositionAtCenter);
|
|
||||||
}
|
|
||||||
QItemSelectionModel::SelectionFlags flags = (QItemSelectionModel::Select |
|
|
||||||
QItemSelectionModel::Rows);
|
|
||||||
QItemSelection addedDives = QItemSelection();
|
|
||||||
addedDives.select(select.child(0,0), select.child(i - 1,0));
|
|
||||||
ui->ListWidget->selectionModel()->select(addedDives,flags);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!d || d->selected)
|
|
||||||
continue;
|
|
||||||
select_dive(get_divenr(d));
|
|
||||||
if (needToScroll) {
|
|
||||||
// make sure at least one of them is visible in the list
|
|
||||||
// and if this is the first dive of a trip, make the trip visible, too
|
|
||||||
needToScroll = FALSE;
|
|
||||||
if (select.row() == 0 && d->divetrip && select.parent().isValid())
|
|
||||||
ui->ListWidget->scrollTo(select.parent(), QAbstractItemView::PositionAtCenter);
|
|
||||||
else
|
|
||||||
ui->ListWidget->scrollTo(select, QAbstractItemView::PositionAtCenter);
|
|
||||||
} else {
|
|
||||||
// but all selected dives should be in expanded trips
|
|
||||||
ui->ListWidget->expand(select.parent());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
redrawProfile();
|
|
||||||
ui->InfoWidget->updateDiveInfo(selected_dive);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::on_actionSave_triggered()
|
void MainWindow::on_actionSave_triggered()
|
||||||
{
|
{
|
||||||
qDebug("actionSave");
|
qDebug("actionSave");
|
||||||
|
|
|
@ -69,15 +69,6 @@ private Q_SLOTS:
|
||||||
void on_actionAboutSubsurface_triggered();
|
void on_actionAboutSubsurface_triggered();
|
||||||
void on_actionUserManual_triggered();
|
void on_actionUserManual_triggered();
|
||||||
|
|
||||||
#if 0
|
|
||||||
/* keyboard actions */
|
|
||||||
void nextDive_triggered();
|
|
||||||
void previousDive_triggered();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void dive_selection_changed(const QItemSelection& newSelection,
|
|
||||||
const QItemSelection& oldSelection);
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void closeEvent(QCloseEvent *);
|
void closeEvent(QCloseEvent *);
|
||||||
|
|
||||||
|
|
|
@ -660,15 +660,14 @@ int DiveTripModel::rowCount(const QModelIndex& parent) const
|
||||||
{
|
{
|
||||||
TreeItemDT* parentItem;
|
TreeItemDT* parentItem;
|
||||||
|
|
||||||
if (parent.column() > 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (!parent.isValid())
|
if (!parent.isValid())
|
||||||
parentItem = rootItem;
|
parentItem = rootItem;
|
||||||
else
|
else
|
||||||
parentItem = static_cast<TreeItemDT*>(parent.internalPointer());
|
parentItem = static_cast<TreeItemDT*>(parent.internalPointer());
|
||||||
|
|
||||||
return parentItem->childs.count();
|
int amount = parentItem->childs.count();
|
||||||
|
|
||||||
|
return amount;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DiveTripModel::setupModelData()
|
void DiveTripModel::setupModelData()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue