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>
This commit is contained in:
Dirk Hohndel 2013-09-23 21:57:28 -07:00
parent c6140c6e21
commit be418458db
4 changed files with 30 additions and 9 deletions

View file

@ -25,7 +25,7 @@
* void clear_trip_indexes(void) * void clear_trip_indexes(void)
* void delete_single_dive(int idx) * void delete_single_dive(int idx)
* void add_single_dive(int idx, struct dive *dive) * 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 select_dive(int idx)
* void deselect_dive(int idx) * void deselect_dive(int idx)
* void mark_divelist_changed(int changed) * 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; 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); res = merge_dives(a, b, b->when - a->when, FALSE);
if (!res) if (!res)
return; return NULL;
add_single_dive(i, res); add_single_dive(i, res);
delete_single_dive(i+1); delete_single_dive(i+1);
delete_single_dive(i+1); delete_single_dive(j);
#if USE_GTK_UI
dive_list_update_dives();
#endif
mark_divelist_changed(TRUE); mark_divelist_changed(TRUE);
return res;
} }
void select_dive(int idx) void select_dive(int idx)

View file

@ -43,7 +43,7 @@ extern dive_trip_t *find_matching_trip(timestamp_t when);
extern void remove_dive_from_trip(struct dive *dive); extern void remove_dive_from_trip(struct dive *dive);
extern dive_trip_t *create_and_hookup_trip_from_dive(struct dive *dive); extern dive_trip_t *create_and_hookup_trip_from_dive(struct dive *dive);
extern void autogroup_dives(void); 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 select_dive(int idx);
extern void deselect_dive(int idx); extern void deselect_dive(int idx);

View file

@ -290,6 +290,22 @@ void DiveListView::selectionChanged(const QItemSelection& selected, const QItemS
Q_EMIT currentDiveChanged(selected_dive); 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) void DiveListView::merge_trip(const QModelIndex &a, int offset)
{ {
int i = a.row() + offset; int i = a.row() + offset;
@ -384,6 +400,8 @@ void DiveListView::contextMenuEvent(QContextMenuEvent *event)
} }
if (d) if (d)
popup.addAction(tr("delete dive"), this, SLOT(deleteDive())); 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 all" really closes all trips,
// "collapse" keeps the trip with the selected dive open // "collapse" keeps the trip with the selected dive open
QAction * actionTaken = popup.exec(event->globalPos()); QAction * actionTaken = popup.exec(event->globalPos());

View file

@ -42,6 +42,7 @@ public slots:
void fixMessyQtModelBehaviour(); void fixMessyQtModelBehaviour();
void mergeTripAbove(); void mergeTripAbove();
void mergeTripBelow(); void mergeTripBelow();
void mergeDives();
signals: signals:
void currentDiveChanged(int divenr); void currentDiveChanged(int divenr);