summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Dirk Hohndel <dirk@hohndel.org>2013-09-23 21:57:28 -0700
committerGravatar Dirk Hohndel <dirk@hohndel.org>2013-09-23 21:57:28 -0700
commitbe418458dbf4299ef289b2790ac36e3efa3b5261 (patch)
tree6867b015b11d323407955c5845b1461faec8bc18
parentc6140c6e21aeff4c6e27e67bee407a1c3f552b18 (diff)
downloadsubsurface-be418458dbf4299ef289b2790ac36e3efa3b5261.tar.gz
Add "merge selected dives" to dive list popup menu
This is fairly straight forward. What I dislike is the check for the magic number of "14 indeces". I'm sure there's a better way to tell if more than one dive is selected... Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
-rw-r--r--divelist.c18
-rw-r--r--divelist.h2
-rw-r--r--qt-ui/divelistview.cpp18
-rw-r--r--qt-ui/divelistview.h1
4 files changed, 30 insertions, 9 deletions
diff --git a/divelist.c b/divelist.c
index 6e3fc598e..baf0428e0 100644
--- a/divelist.c
+++ b/divelist.c
@@ -25,7 +25,7 @@
* void clear_trip_indexes(void)
* void delete_single_dive(int idx)
* void add_single_dive(int idx, struct dive *dive)
- * void merge_dive_index(int i, struct dive *a)
+ * void merge_two_dives(struct dive *a, struct dive *b)
* void select_dive(int idx)
* void deselect_dive(int idx)
* void mark_divelist_changed(int changed)
@@ -916,22 +916,24 @@ void add_single_dive(int idx, struct dive *dive)
}
}
-void merge_dive_index(int i, struct dive *a)
+struct dive *merge_two_dives(struct dive *a, struct dive *b)
{
- struct dive *b = get_dive(i+1);
struct dive *res;
+ int i,j;
+ if (!a || !b)
+ return NULL;
+ i = get_index_for_dive(a);
+ j = get_index_for_dive(b);
res = merge_dives(a, b, b->when - a->when, FALSE);
if (!res)
- return;
+ return NULL;
add_single_dive(i, res);
delete_single_dive(i+1);
- delete_single_dive(i+1);
-#if USE_GTK_UI
- dive_list_update_dives();
-#endif
+ delete_single_dive(j);
mark_divelist_changed(TRUE);
+ return res;
}
void select_dive(int idx)
diff --git a/divelist.h b/divelist.h
index ef90c4283..1485dd97b 100644
--- a/divelist.h
+++ b/divelist.h
@@ -43,7 +43,7 @@ extern dive_trip_t *find_matching_trip(timestamp_t when);
extern void remove_dive_from_trip(struct dive *dive);
extern dive_trip_t *create_and_hookup_trip_from_dive(struct dive *dive);
extern void autogroup_dives(void);
-extern void merge_dive_index(int i, struct dive *a);
+extern struct dive *merge_two_dives(struct dive *a, struct dive *b);
extern void select_dive(int idx);
extern void deselect_dive(int idx);
diff --git a/qt-ui/divelistview.cpp b/qt-ui/divelistview.cpp
index 639e988fd..a1436bf2d 100644
--- a/qt-ui/divelistview.cpp
+++ b/qt-ui/divelistview.cpp
@@ -290,6 +290,22 @@ void DiveListView::selectionChanged(const QItemSelection& selected, const QItemS
Q_EMIT currentDiveChanged(selected_dive);
}
+void DiveListView::mergeDives()
+{
+ int i;
+ struct dive *dive, *maindive = NULL;
+
+ for_each_dive(i, dive) {
+ if (dive->selected) {
+ if (!maindive)
+ maindive = dive;
+ else
+ maindive = merge_two_dives(maindive, dive);
+ }
+ }
+ mainWindow()->refreshDisplay();
+}
+
void DiveListView::merge_trip(const QModelIndex &a, int offset)
{
int i = a.row() + offset;
@@ -384,6 +400,8 @@ void DiveListView::contextMenuEvent(QContextMenuEvent *event)
}
if (d)
popup.addAction(tr("delete dive"), this, SLOT(deleteDive()));
+ if (selectionModel()->selection().indexes().count() > 14)
+ popup.addAction(tr("merge selected dives"), this, SLOT(mergeDives()));
// "collapse all" really closes all trips,
// "collapse" keeps the trip with the selected dive open
QAction * actionTaken = popup.exec(event->globalPos());
diff --git a/qt-ui/divelistview.h b/qt-ui/divelistview.h
index 1faa3613a..1287349f4 100644
--- a/qt-ui/divelistview.h
+++ b/qt-ui/divelistview.h
@@ -42,6 +42,7 @@ public slots:
void fixMessyQtModelBehaviour();
void mergeTripAbove();
void mergeTripBelow();
+ void mergeDives();
signals:
void currentDiveChanged(int divenr);