From c6f84de37c33ef66f479d1adcffea6eab903c674 Mon Sep 17 00:00:00 2001 From: Tomaz Canabrava Date: Tue, 28 May 2013 16:56:58 -0300 Subject: [PATCH 1/3] Adds the code to make the dive list behave like tree or list This code adds the possibility to make the DiveList behave like a Tree or a List, depending on what layout is set. Signed-off-by: Tomaz Canabrava --- qt-ui/divelistview.cpp | 6 +++++- qt-ui/models.cpp | 27 +++++++++++++++++++++++++-- qt-ui/models.h | 5 +++++ 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/qt-ui/divelistview.cpp b/qt-ui/divelistview.cpp index 4957e3374..d53fce5f5 100644 --- a/qt-ui/divelistview.cpp +++ b/qt-ui/divelistview.cpp @@ -22,6 +22,7 @@ DiveListView::DiveListView(QWidget *parent) : QTreeView(parent), mouseClickSelec setItemDelegateForColumn(TreeItemDT::RATING, new StarWidgetsDelegate()); QSortFilterProxyModel *model = new QSortFilterProxyModel(this); setModel(model); + setSortingEnabled(false); header()->setContextMenuPolicy(Qt::ActionsContextMenu); } @@ -31,7 +32,10 @@ void DiveListView::reload() QAbstractItemModel *oldModel = m->sourceModel(); if (oldModel) oldModel->deleteLater(); - m->setSourceModel(new DiveTripModel(this)); + DiveTripModel *tripModel = new DiveTripModel(this); + tripModel->setLayout(DiveTripModel::LIST); + + m->setSourceModel(tripModel); sortByColumn(0, Qt::DescendingOrder); QModelIndex firstDiveOrTrip = m->index(0,0); if (firstDiveOrTrip.isValid()) { diff --git a/qt-ui/models.cpp b/qt-ui/models.cpp index 38ef8938c..98a84d7f9 100644 --- a/qt-ui/models.cpp +++ b/qt-ui/models.cpp @@ -1003,7 +1003,6 @@ DiveTripModel::DiveTripModel(QObject* parent) : QAbstractItemModel(parent) { rootItem = new TreeItemDT(); - setupModelData(); } DiveTripModel::~DiveTripModel() @@ -1096,6 +1095,11 @@ void DiveTripModel::setupModelData() { int i = dive_table.nr; + if (rowCount()){ + beginRemoveRows(QModelIndex(), 0, rowCount()-1); + endRemoveRows(); + } + while (--i >= 0) { struct dive* dive = get_dive(i); update_cylinder_related_info(dive); @@ -1104,11 +1108,14 @@ void DiveTripModel::setupModelData() DiveItem* diveItem = new DiveItem(); diveItem->dive = dive; - if (!trip) { + if (!trip || currentLayout == LIST) { diveItem->parent = rootItem; rootItem->children.push_back(diveItem); continue; } + if (currentLayout == LIST) + continue; + if (!trips.keys().contains(trip)) { TripItem* tripItem = new TripItem(); tripItem->trip = trip; @@ -1121,4 +1128,20 @@ void DiveTripModel::setupModelData() TripItem* tripItem = trips[trip]; tripItem->children.push_back(diveItem); } + + if (rowCount()){ + beginInsertRows(QModelIndex(), 0, rowCount()-1); + endInsertRows(); + } +} + +DiveTripModel::Layout DiveTripModel::layout() const +{ + return currentLayout; +} + +void DiveTripModel::setLayout(DiveTripModel::Layout layout) +{ + currentLayout = layout; + setupModelData(); } diff --git a/qt-ui/models.h b/qt-ui/models.h index f51566c1b..b4eb8d953 100644 --- a/qt-ui/models.h +++ b/qt-ui/models.h @@ -144,6 +144,8 @@ class DiveTripModel : public QAbstractItemModel Q_OBJECT public: + enum Layout{TREE, LIST}; + DiveTripModel(QObject *parent = 0); ~DiveTripModel(); @@ -155,11 +157,14 @@ public: /*reimp*/ QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const; /*reimp*/ QModelIndex parent(const QModelIndex &child) const; + Layout layout() const; + void setLayout(Layout layout); private: void setupModelData(); TreeItemDT *rootItem; QMap trips; + Layout currentLayout; }; #endif From 4019fdaa24eb96a615632b8374e22434ec4069c2 Mon Sep 17 00:00:00 2001 From: Tomaz Canabrava Date: Tue, 28 May 2013 17:07:43 -0300 Subject: [PATCH 2/3] Switch between Tree / list on column - click. This patch adds support for switching Tree / List while clicking on a column header. This triggers a sad-painting bug on the list - I guess I'll have to fix it too. I'd apreciate some help on it, tougth. next: keep the selection. Signed-off-by: Tomaz Canabrava --- qt-ui/divelistview.cpp | 14 ++++++++++++-- qt-ui/divelistview.h | 4 +++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/qt-ui/divelistview.cpp b/qt-ui/divelistview.cpp index d53fce5f5..8852eda3e 100644 --- a/qt-ui/divelistview.cpp +++ b/qt-ui/divelistview.cpp @@ -24,16 +24,26 @@ DiveListView::DiveListView(QWidget *parent) : QTreeView(parent), mouseClickSelec setModel(model); setSortingEnabled(false); header()->setContextMenuPolicy(Qt::ActionsContextMenu); + connect(header(), SIGNAL(sectionClicked(int)), this, SLOT(headerClicked(int))); } -void DiveListView::reload() +void DiveListView::headerClicked(int i ) +{ + if (i == (int) TreeItemDT::NR){ + reload(DiveTripModel::TREE); + }else{ + reload(DiveTripModel::LIST); + } +} + +void DiveListView::reload(DiveTripModel::Layout layout) { QSortFilterProxyModel *m = qobject_cast(model()); QAbstractItemModel *oldModel = m->sourceModel(); if (oldModel) oldModel->deleteLater(); DiveTripModel *tripModel = new DiveTripModel(this); - tripModel->setLayout(DiveTripModel::LIST); + tripModel->setLayout(layout); m->setSourceModel(tripModel); sortByColumn(0, Qt::DescendingOrder); diff --git a/qt-ui/divelistview.h b/qt-ui/divelistview.h index c1a33db51..99154d4ac 100644 --- a/qt-ui/divelistview.h +++ b/qt-ui/divelistview.h @@ -15,6 +15,7 @@ */ #include +#include "models.h" class DiveListView : public QTreeView { @@ -28,11 +29,12 @@ public: void keyPressEvent(QKeyEvent* event); void keyReleaseEvent(QKeyEvent*); void setSelection(const QRect& rect, QItemSelectionModel::SelectionFlags command); - void reload(); + void reload(DiveTripModel::Layout layout = DiveTripModel::TREE); public slots: void toggleColumnVisibilityByIndex(); void reloadHeaderActions(); + void headerClicked(int); Q_SIGNALS: void currentDiveChanged(int divenr); From 5a994b08f6323680fe8362f129f097c9c2aaef2e Mon Sep 17 00:00:00 2001 From: Tomaz Canabrava Date: Tue, 28 May 2013 17:46:40 -0300 Subject: [PATCH 3/3] Saves the selection to select it later. Signed-off-by: Tomaz Canabrava --- qt-ui/divelistview.cpp | 25 ++++++++++++++++++++++++- qt-ui/mainwindow.ui | 4 ++-- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/qt-ui/divelistview.cpp b/qt-ui/divelistview.cpp index 8852eda3e..948bfa57a 100644 --- a/qt-ui/divelistview.cpp +++ b/qt-ui/divelistview.cpp @@ -24,20 +24,43 @@ DiveListView::DiveListView(QWidget *parent) : QTreeView(parent), mouseClickSelec setModel(model); setSortingEnabled(false); header()->setContextMenuPolicy(Qt::ActionsContextMenu); - connect(header(), SIGNAL(sectionClicked(int)), this, SLOT(headerClicked(int))); } void DiveListView::headerClicked(int i ) { + QModelIndexList oldSelection = selectionModel()->selectedRows(); + QList currentSelectedDives; + Q_FOREACH(const QModelIndex& index , oldSelection){ + struct dive *d = (struct dive *) index.data(TreeItemDT::DIVE_ROLE).value(); + if (d){ + currentSelectedDives.push_back(d); + } + } + if (i == (int) TreeItemDT::NR){ reload(DiveTripModel::TREE); }else{ reload(DiveTripModel::LIST); } + + QModelIndexList newSelection; + QItemSelection newSelection2; + + Q_FOREACH(struct dive *d, currentSelectedDives){ + QModelIndexList match = model()->match(model()->index(0,0), TreeItemDT::DIVE_ROLE, QVariant::fromValue(d), 1, Qt::MatchRecursive); + if (match.count() == 0){ + qDebug() << "Well, this shouldn't happen."; + }else{ + newSelection << match.first(); + } + } } void DiveListView::reload(DiveTripModel::Layout layout) { + header()->setClickable(true); + connect(header(), SIGNAL(sectionPressed(int)), this, SLOT(headerClicked(int)), Qt::UniqueConnection); + QSortFilterProxyModel *m = qobject_cast(model()); QAbstractItemModel *oldModel = m->sourceModel(); if (oldModel) diff --git a/qt-ui/mainwindow.ui b/qt-ui/mainwindow.ui index 3f9726785..c72e36eb4 100644 --- a/qt-ui/mainwindow.ui +++ b/qt-ui/mainwindow.ui @@ -73,7 +73,7 @@ true - true + false true @@ -103,7 +103,7 @@ 0 0 763 - 25 + 20