mirror of
https://github.com/subsurface/subsurface.git
synced 2025-01-19 06:15:26 +00:00
Add some helper functions
First step towards getting the "add to trip" logic in the divelist context menu to be consistent and correct. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
parent
2a88a72f1a
commit
ba1c4fcec1
3 changed files with 52 additions and 15 deletions
38
divelist.c
38
divelist.c
|
@ -578,6 +578,44 @@ void find_new_trip_start_time(dive_trip_t *trip)
|
|||
trip->when = when;
|
||||
}
|
||||
|
||||
/* check if we have a trip right before / after this dive */
|
||||
bool is_trip_before_after(struct dive *dive, bool before)
|
||||
{
|
||||
int idx = get_idx_by_uniq_id(dive->id);
|
||||
if (before) {
|
||||
if (idx > 0 && get_dive(idx - 1)->divetrip)
|
||||
return true;
|
||||
} else {
|
||||
if (idx < dive_table.nr - 1 && get_dive(idx + 1)->divetrip)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
struct dive *first_selected_dive()
|
||||
{
|
||||
int idx;
|
||||
struct dive *d;
|
||||
|
||||
for_each_dive (idx, d) {
|
||||
if (d->selected)
|
||||
return d;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct dive *last_selected_dive()
|
||||
{
|
||||
int idx;
|
||||
struct dive *d, *ret = NULL;
|
||||
|
||||
for_each_dive (idx, d) {
|
||||
if (d->selected)
|
||||
ret = d;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
void remove_dive_from_trip(struct dive *dive, short was_autogen)
|
||||
{
|
||||
struct dive *next, **pprev;
|
||||
|
|
|
@ -30,7 +30,10 @@ extern struct dive *merge_two_dives(struct dive *a, struct dive *b);
|
|||
extern bool consecutive_selected();
|
||||
extern void select_dive(int idx);
|
||||
extern void deselect_dive(int idx);
|
||||
void find_new_trip_start_time(dive_trip_t *trip);
|
||||
extern void find_new_trip_start_time(dive_trip_t *trip);
|
||||
extern struct dive *first_selected_dive();
|
||||
extern struct dive *last_selected_dive();
|
||||
extern bool is_trip_before_after(struct dive *dive, bool before);
|
||||
|
||||
#ifdef DEBUG_TRIP
|
||||
extern void dump_selection(void);
|
||||
|
|
|
@ -634,18 +634,10 @@ void DiveListView::addToTrip(bool below)
|
|||
|
||||
if (d->selected) { // we are right-clicking on one of possibly many selected dive(s)
|
||||
// find the top selected dive, depending on the list order
|
||||
if (delta == 1) {
|
||||
for_each_dive (idx, d) {
|
||||
if (d->selected)
|
||||
pd = d;
|
||||
}
|
||||
d = pd; // this way we have the chronologically last
|
||||
} else {
|
||||
for_each_dive (idx, d) {
|
||||
if (d->selected)
|
||||
break; // now that's the chronologically first
|
||||
}
|
||||
}
|
||||
if (delta == 1)
|
||||
d = last_selected_dive();
|
||||
else
|
||||
d = first_selected_dive();
|
||||
}
|
||||
// now find the trip "above" in the dive list
|
||||
if ((pd = get_dive(get_divenr(d) + delta)) != NULL) {
|
||||
|
@ -757,8 +749,12 @@ void DiveListView::contextMenuEvent(QContextMenuEvent *event)
|
|||
if (d) {
|
||||
popup.addAction(tr("remove dive(s) from trip"), this, SLOT(removeFromTrip()));
|
||||
popup.addAction(tr("create new trip above"), this, SLOT(newTripAbove()));
|
||||
popup.addAction(tr("add dive(s) to trip immediately above"), this, SLOT(addToTripAbove()));
|
||||
popup.addAction(tr("add dive(s) to trip immediately below"), this, SLOT(addToTripBelow()));
|
||||
if (!d->divetrip) {
|
||||
if (is_trip_before_after(d, (currentOrder == Qt::AscendingOrder)))
|
||||
popup.addAction(tr("add dive(s) to trip immediately above"), this, SLOT(addToTripAbove()));
|
||||
if (is_trip_before_after(d, (currentOrder == Qt::DescendingOrder)))
|
||||
popup.addAction(tr("add dive(s) to trip immediately below"), this, SLOT(addToTripBelow()));
|
||||
}
|
||||
}
|
||||
if (trip) {
|
||||
popup.addAction(tr("merge trip with trip above"), this, SLOT(mergeTripAbove()));
|
||||
|
|
Loading…
Add table
Reference in a new issue