aboutsummaryrefslogtreecommitdiffstats
path: root/qt-ui
diff options
context:
space:
mode:
Diffstat (limited to 'qt-ui')
-rw-r--r--qt-ui/divelistview.cpp35
-rw-r--r--qt-ui/divelistview.h3
-rw-r--r--qt-ui/models.cpp3
-rw-r--r--qt-ui/models.h2
4 files changed, 42 insertions, 1 deletions
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<void*>();
+ dive_trip_t *trip_b = (dive_trip_t *) b.data(DiveTripModel::TRIP_ROLE).value<void*>();
+
+ 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<void*>();
@@ -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<void*>();
+ dive_trip_t *trip = (dive_trip_t *) contextMenuIndex.data(DiveTripModel::TRIP_ROLE).value<void*>();
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<void*>(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;