From 5ce5b05521ee8d939fa4f2951eeec8021177ccdf Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Wed, 26 Jun 2013 19:16:40 -1000 Subject: Qt: Implement trip merging logic So during my Maui trip, I had a short hiatus in diving, causing subsurface to start a new trip for the last day of diving. I could have just started the old gtk branch to fix it up, but decided that I might as well try to implement the "merge trip" logic in the Qt branch instead. This is the end result of that. Signed-off-by: Linus Torvalds Signed-off-by: Dirk Hohndel --- qt-ui/divelistview.cpp | 35 +++++++++++++++++++++++++++++++++++ qt-ui/divelistview.h | 3 +++ qt-ui/models.cpp | 3 +++ qt-ui/models.h | 2 +- 4 files changed, 42 insertions(+), 1 deletion(-) (limited to 'qt-ui') diff --git a/qt-ui/divelistview.cpp b/qt-ui/divelistview.cpp index 480decd2d..4b856f601 100644 --- a/qt-ui/divelistview.cpp +++ b/qt-ui/divelistview.cpp @@ -298,6 +298,36 @@ void DiveListView::selectionChanged(const QItemSelection& selected, const QItemS Q_EMIT currentDiveChanged(selected_dive); } +void DiveListView::merge_trip(const QModelIndex &a, int offset) +{ + int i = a.row() + offset; + QModelIndex b = a.sibling(i,0); + + dive_trip_t *trip_a = (dive_trip_t *) a.data(DiveTripModel::TRIP_ROLE).value(); + dive_trip_t *trip_b = (dive_trip_t *) b.data(DiveTripModel::TRIP_ROLE).value(); + + if (trip_a == trip_b || !trip_a || !trip_b) + return; + + if (!trip_a->location) + trip_a->location = strdup(trip_b->location); + if (!trip_a->notes) + trip_a->notes = strdup(trip_b->notes); + while (trip_b->dives) + add_dive_to_trip(trip_b->dives, trip_a); + reload(currentLayout, false); +} + +void DiveListView::mergeTripAbove() +{ + merge_trip(contextMenuIndex, -1); +} + +void DiveListView::mergeTripBelow() +{ + merge_trip(contextMenuIndex, +1); +} + void DiveListView::removeFromTrip() { struct dive *d = (struct dive *) contextMenuIndex.data(DiveTripModel::DIVE_ROLE).value(); @@ -336,6 +366,7 @@ void DiveListView::contextMenuEvent(QContextMenuEvent *event) // let's remember where we are contextMenuIndex = indexAt(event->pos()); struct dive *d = (struct dive *) contextMenuIndex.data(DiveTripModel::DIVE_ROLE).value(); + dive_trip_t *trip = (dive_trip_t *) contextMenuIndex.data(DiveTripModel::TRIP_ROLE).value(); QMenu popup(this); if (currentLayout == DiveTripModel::TREE) { popup.addAction(tr("expand all"), this, SLOT(expandAll())); @@ -344,6 +375,10 @@ void DiveListView::contextMenuEvent(QContextMenuEvent *event) if (d) { popup.addAction(tr("remove dive from trip"), this, SLOT(removeFromTrip())); } + if (trip) { + popup.addAction(tr("Merge trip with trip above"), this, SLOT(mergeTripAbove())); + popup.addAction(tr("Merge trip with trip below"), this, SLOT(mergeTripBelow())); + } } if (d) popup.addAction(tr("delete dive"), this, SLOT(deleteDive())); diff --git a/qt-ui/divelistview.h b/qt-ui/divelistview.h index 3aee19128..1faa3613a 100644 --- a/qt-ui/divelistview.h +++ b/qt-ui/divelistview.h @@ -40,6 +40,8 @@ public slots: void deleteDive(); void testSlot(); void fixMessyQtModelBehaviour(); + void mergeTripAbove(); + void mergeTripBelow(); signals: void currentDiveChanged(int divenr); @@ -50,6 +52,7 @@ private: DiveTripModel::Layout currentLayout; QLineEdit *searchBox; QModelIndex contextMenuIndex; + void merge_trip(const QModelIndex &a, const int offset); }; #endif // DIVELISTVIEW_H diff --git a/qt-ui/models.cpp b/qt-ui/models.cpp index 0288e7107..1fd5f74cb 100644 --- a/qt-ui/models.cpp +++ b/qt-ui/models.cpp @@ -909,6 +909,9 @@ QVariant TripItem::data(int column, int role) const { QVariant ret; + if (role == DiveTripModel::TRIP_ROLE) + return QVariant::fromValue(trip); + if (role == DiveTripModel::SORT_ROLE) return (qulonglong)trip->when; diff --git a/qt-ui/models.h b/qt-ui/models.h index f6fb3f5c0..ec15174f6 100644 --- a/qt-ui/models.h +++ b/qt-ui/models.h @@ -162,7 +162,7 @@ public: enum Column {NR, DATE, RATING, DEPTH, DURATION, TEMPERATURE, TOTALWEIGHT, SUIT, CYLINDER, NITROX, SAC, OTU, MAXCNS, LOCATION, COLUMNS }; - enum ExtraRoles{STAR_ROLE = Qt::UserRole + 1, DIVE_ROLE, SORT_ROLE}; + enum ExtraRoles{STAR_ROLE = Qt::UserRole + 1, DIVE_ROLE, TRIP_ROLE, SORT_ROLE}; enum Layout{TREE, LIST, CURRENT}; Qt::ItemFlags flags(const QModelIndex &index) const; -- cgit v1.2.3-70-g09d2