mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
Each of these calls recalculates the current dive and divecomputer. Instead, collect the dives to be selected/deselected and (de)select them at once. This needs some code refactoring in the core, because we need a function that 1) doesn't send a signal by itself. 2) doesn't clear the trip-selection. This contains some reorganization of the selection functions signatures: The filter code is the only caller that keeps the selected dive and the only caller that cares about whether the current dive changed. So let only the function that keeps the selected dive return whether the current dive changed. It's all very fragile. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
69 lines
2.4 KiB
C++
69 lines
2.4 KiB
C++
// SPDX-License-Identifier: GPL-2.0
|
|
// Selection related functions
|
|
|
|
#ifndef SELECTION_H
|
|
#define SELECTION_H
|
|
|
|
struct dive;
|
|
|
|
extern int amount_selected;
|
|
extern unsigned int dc_number;
|
|
extern struct dive *current_dive;
|
|
|
|
/*** C and C++ functions ***/
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
extern void select_dive(struct dive *dive);
|
|
extern void deselect_dive(struct dive *dive);
|
|
extern struct dive *first_selected_dive(void);
|
|
extern struct dive *last_selected_dive(void);
|
|
extern bool consecutive_selected(void);
|
|
extern void select_newest_visible_dive();
|
|
extern void select_single_dive(struct dive *d); // wrapper for setSelection() with a single dive. NULL clears the selection.
|
|
extern void select_trip(struct dive_trip *trip);
|
|
extern void deselect_trip(struct dive_trip *trip);
|
|
extern struct dive_trip *single_selected_trip(); // returns trip if exactly one trip is selected, NULL otherwise.
|
|
extern void clear_selection(void);
|
|
|
|
#if DEBUG_SELECTION_TRACKING
|
|
extern void dump_selection(void);
|
|
#endif
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
/*** C++-only functions ***/
|
|
|
|
#ifdef __cplusplus
|
|
#include <vector>
|
|
#include <QVector>
|
|
|
|
// Reset the selection to the dives of the "selection" vector and send the appropriate signals.
|
|
// Set the current dive to "currentDive" and the current dive computer to "currentDc".
|
|
// "currentDive" must be an element of "selection" (or null if "seletion" is empty).
|
|
// If "currentDc" is negative, an attempt will be made to keep the current computer number.
|
|
// Returns the list of selected dives
|
|
QVector<dive *> setSelectionCore(const std::vector<dive *> &selection, dive *currentDive, int currentDc);
|
|
|
|
// As above, but sends a signal to inform the frontend of the changed selection.
|
|
// Returns true if the current dive changed.
|
|
void setSelection(const std::vector<dive *> &selection, dive *currentDive, int currentDc);
|
|
|
|
// Set selection, but try to keep the current dive. If current dive is not in selection,
|
|
// find the nearest current dive in the selection
|
|
// Returns true if the current dive changed.
|
|
// Does not send a signal.
|
|
bool setSelectionKeepCurrent(const std::vector<dive *> &selection);
|
|
|
|
// Get currently selected dives
|
|
std::vector<dive *> getDiveSelection();
|
|
bool diveInSelection(const std::vector<dive *> &selection, const dive *d);
|
|
void updateSelection(std::vector<dive *> &selection, const std::vector<dive *> &add, const std::vector<dive *> &remove);
|
|
|
|
#endif // __cplusplus
|
|
|
|
#endif // SELECTION_H
|