aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--qt-ui/divelistview.cpp59
-rw-r--r--qt-ui/divelistview.h11
-rw-r--r--qt-ui/mainwindow.cpp188
-rw-r--r--qt-ui/mainwindow.h9
-rw-r--r--qt-ui/models.cpp7
5 files changed, 73 insertions, 201 deletions
diff --git a/qt-ui/divelistview.cpp b/qt-ui/divelistview.cpp
index 0bf0b35ba..af0ef8b0c 100644
--- a/qt-ui/divelistview.cpp
+++ b/qt-ui/divelistview.cpp
@@ -9,9 +9,66 @@
#include "modeldelegates.h"
#include <QApplication>
#include <QHeaderView>
+#include <QDebug>
+#include <QKeyEvent>
-DiveListView::DiveListView(QWidget *parent) : QTreeView(parent)
+
+DiveListView::DiveListView(QWidget *parent) : QTreeView(parent), mouseClickSelection(false)
{
setUniformRowHeights(true);
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());
+ }
+ }
}
diff --git a/qt-ui/divelistview.h b/qt-ui/divelistview.h
index be9774c5c..9cccd39ae 100644
--- a/qt-ui/divelistview.h
+++ b/qt-ui/divelistview.h
@@ -20,6 +20,17 @@ class DiveListView : public QTreeView
{
public:
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
diff --git a/qt-ui/mainwindow.cpp b/qt-ui/mainwindow.cpp
index 3766e2187..58cb86286 100644
--- a/qt-ui/mainwindow.cpp
+++ b/qt-ui/mainwindow.cpp
@@ -36,24 +36,12 @@ MainWindow::MainWindow() : ui(new Ui::MainWindow()),
sortModel->setSourceModel(model);
ui->ListWidget->setModel(sortModel);
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);
if (sortModel->index(0,0, firstDiveOrTrip).isValid())
ui->ListWidget->setCurrentIndex(sortModel->index(0,0, firstDiveOrTrip));
else
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()
@@ -61,98 +49,6 @@ void MainWindow::redrawProfile()
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()
{
qDebug("actionNew");
@@ -188,88 +84,6 @@ void MainWindow::on_actionOpen_triggered()
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()
{
qDebug("actionSave");
diff --git a/qt-ui/mainwindow.h b/qt-ui/mainwindow.h
index 124f70f33..084818319 100644
--- a/qt-ui/mainwindow.h
+++ b/qt-ui/mainwindow.h
@@ -69,15 +69,6 @@ private Q_SLOTS:
void on_actionAboutSubsurface_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:
void closeEvent(QCloseEvent *);
diff --git a/qt-ui/models.cpp b/qt-ui/models.cpp
index 90143b912..68ab402cd 100644
--- a/qt-ui/models.cpp
+++ b/qt-ui/models.cpp
@@ -660,15 +660,14 @@ int DiveTripModel::rowCount(const QModelIndex& parent) const
{
TreeItemDT* parentItem;
- if (parent.column() > 0)
- return 0;
-
if (!parent.isValid())
parentItem = rootItem;
else
parentItem = static_cast<TreeItemDT*>(parent.internalPointer());
- return parentItem->childs.count();
+ int amount = parentItem->childs.count();
+
+ return amount;
}
void DiveTripModel::setupModelData()