summaryrefslogtreecommitdiffstats
path: root/commands
diff options
context:
space:
mode:
authorGravatar Berthold Stoeger <bstoeger@mail.tuwien.ac.at>2019-11-24 13:26:29 +0100
committerGravatar bstoeger <32835590+bstoeger@users.noreply.github.com>2019-12-04 13:00:23 +0100
commit7787bfbf9e39595d98c459e4af121f3174762c7d (patch)
tree6791a300e342ad9b87edcb4781f56f9712e411f3 /commands
parentd0b3a06e036cf5523cf03c22ec698742bd01048a (diff)
downloadsubsurface-7787bfbf9e39595d98c459e4af121f3174762c7d.tar.gz
Selection: move commands/command_private.* to core/selection.*
The file command_private.cpp had functions concerning selections only. To make these functions accessible from outside the undo machinery, turn it into a part of the core-library. Currently, only C++ functions are exported. We might think about also exporting a C interface. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
Diffstat (limited to 'commands')
-rw-r--r--commands/CMakeLists.txt2
-rw-r--r--commands/command_divelist.cpp2
-rw-r--r--commands/command_divesite.cpp1
-rw-r--r--commands/command_edit.cpp2
-rw-r--r--commands/command_edit_trip.cpp2
-rw-r--r--commands/command_private.cpp108
-rw-r--r--commands/command_private.h25
7 files changed, 3 insertions, 139 deletions
diff --git a/commands/CMakeLists.txt b/commands/CMakeLists.txt
index 76ad42603..dcf7f3892 100644
--- a/commands/CMakeLists.txt
+++ b/commands/CMakeLists.txt
@@ -14,8 +14,6 @@ set(SUBSURFACE_GENERIC_COMMANDS_SRCS
command_edit.h
command_edit_trip.cpp
command_edit_trip.h
- command_private.cpp
- command_private.h
)
if (SUBSURFACE_TARGET_EXECUTABLE MATCHES "DesktopExecutable")
add_library(subsurface_commands_desktop STATIC ${SUBSURFACE_GENERIC_COMMANDS_SRCS})
diff --git a/commands/command_divelist.cpp b/commands/command_divelist.cpp
index 4fabac9fc..12e1c9309 100644
--- a/commands/command_divelist.cpp
+++ b/commands/command_divelist.cpp
@@ -1,10 +1,10 @@
// SPDX-License-Identifier: GPL-2.0
#include "command_divelist.h"
-#include "command_private.h"
#include "core/divelist.h"
#include "core/display.h" // for amount_selected
#include "core/qthelper.h"
+#include "core/selection.h"
#include "core/subsurface-qt/DiveListNotifier.h"
#include "qt-models/filtermodels.h"
#include "../profile-widget/profilewidget2.h"
diff --git a/commands/command_divesite.cpp b/commands/command_divesite.cpp
index b5fb46f91..45d0abcaf 100644
--- a/commands/command_divesite.cpp
+++ b/commands/command_divesite.cpp
@@ -1,7 +1,6 @@
// SPDX-License-Identifier: GPL-2.0
#include "command_divesite.h"
-#include "command_private.h"
#include "core/divesite.h"
#include "core/subsurface-qt/DiveListNotifier.h"
#include "core/qthelper.h"
diff --git a/commands/command_edit.cpp b/commands/command_edit.cpp
index 7f4726a6b..5e02ed80e 100644
--- a/commands/command_edit.cpp
+++ b/commands/command_edit.cpp
@@ -1,9 +1,9 @@
// SPDX-License-Identifier: GPL-2.0
#include "command_edit.h"
-#include "command_private.h"
#include "core/divelist.h"
#include "core/qthelper.h" // for copy_qstring
+#include "core/selection.h"
#include "core/subsurface-string.h"
#include "core/tag.h"
diff --git a/commands/command_edit_trip.cpp b/commands/command_edit_trip.cpp
index b25e3fcc5..c0f512907 100644
--- a/commands/command_edit_trip.cpp
+++ b/commands/command_edit_trip.cpp
@@ -1,8 +1,8 @@
// SPDX-License-Identifier: GPL-2.0
#include "command_edit_trip.h"
-#include "command_private.h"
#include "core/qthelper.h"
+#include "core/selection.h"
namespace Command {
diff --git a/commands/command_private.cpp b/commands/command_private.cpp
deleted file mode 100644
index 714ffd9b6..000000000
--- a/commands/command_private.cpp
+++ /dev/null
@@ -1,108 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-// Helper functions for the undo-commands
-
-#include "command_private.h"
-#include "core/divelist.h"
-#include "core/display.h" // for amount_selected
-#include "core/subsurface-qt/DiveListNotifier.h"
-
-namespace Command {
-
-// Set the current dive either from a list of selected dives,
-// or a newly selected dive. In both cases, try to select the
-// dive that is newer that is newer than the given date.
-// This mimics the old behavior when the current dive changed.
-static void setClosestCurrentDive(timestamp_t when, const std::vector<dive *> &selection)
-{
- // Start from back until we get the first dive that is before
- // the supposed-to-be selected dive. (Note: this mimics the
- // old behavior when the current dive changed).
- for (auto it = selection.rbegin(); it < selection.rend(); ++it) {
- if ((*it)->when > when && !(*it)->hidden_by_filter) {
- current_dive = *it;
- return;
- }
- }
-
- // We didn't find a more recent selected dive -> try to
- // find *any* visible selected dive.
- for (dive *d: selection) {
- if (!d->hidden_by_filter) {
- current_dive = d;
- return;
- }
- }
-
- // No selected dive is visible! Take the closest dive. Note, this might
- // return null, but that just means unsetting the current dive (as no
- // dive is visible anyway).
- current_dive = find_next_visible_dive(when);
-}
-
-// Reset the selection to the dives of the "selection" vector and send the appropriate signals.
-// Set the current dive to "currentDive". "currentDive" must be an element of "selection" (or
-// null if "seletion" is empty). Return true if the selection or current dive changed.
-void setSelection(const std::vector<dive *> &selection, dive *currentDive)
-{
- // To do so, generate vectors of dives to be selected and deselected.
- // We send signals batched by trip, so keep track of trip/dive pairs.
- QVector<dive *> divesToSelect;
- divesToSelect.reserve(selection.size());
-
- // TODO: We might want to keep track of selected dives in a more efficient way!
- int i;
- dive *d;
- amount_selected = 0; // We recalculate amount_selected
- for_each_dive(i, d) {
- // We only modify dives that are currently visible.
- if (d->hidden_by_filter) {
- d->selected = false; // Note, not necessary, just to be sure
- // that we get amount_selected right
- continue;
- }
-
- // Search the dive in the list of selected dives.
- // TODO: By sorting the list in the same way as the backend, this could be made more efficient.
- bool newState = std::find(selection.begin(), selection.end(), d) != selection.end();
-
- if (newState) {
- ++amount_selected;
- divesToSelect.push_back(d);
- }
- // TODO: Instead of using select_dive() and deselect_dive(), we set selected directly.
- // The reason is that deselect() automatically sets a new current dive, which we
- // don't want, as we set it later anyway.
- // There is other parts of the C++ code that touches the innards directly, but
- // ultimately this should be pushed down to C.
- d->selected = newState;
- }
-
- // We cannot simply change the current dive to the given dive.
- // It might be hidden by a filter and thus not be selected.
- current_dive = currentDive;
- if (current_dive && !currentDive->selected) {
- // Current not visible -> find a different dive.
- setClosestCurrentDive(currentDive->when, selection);
- }
-
- // Send the new selection
- emit diveListNotifier.divesSelected(divesToSelect, current_dive);
-}
-
-// Turn current selection into a vector.
-// TODO: This could be made much more efficient if we kept a sorted list of selected dives!
-std::vector<dive *> getDiveSelection()
-{
- std::vector<dive *> res;
- res.reserve(amount_selected);
-
- int i;
- dive *d;
- for_each_dive(i, d) {
- if (d->selected)
- res.push_back(d);
- }
- return res;
-}
-
-} // namespace Command
diff --git a/commands/command_private.h b/commands/command_private.h
deleted file mode 100644
index 280654a93..000000000
--- a/commands/command_private.h
+++ /dev/null
@@ -1,25 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-// Private definitions for the command-objects
-
-#ifndef COMMAND_PRIVATE_H
-#define COMMAND_PRIVATE_H
-
-#include "core/dive.h"
-
-#include <vector>
-#include <utility>
-#include <QVector>
-
-namespace Command {
-
-// Reset the selection to the dives of the "selection" vector and send the appropriate signals.
-// Set the current dive to "currentDive". "currentDive" must be an element of "selection" (or
-// null if "seletion" is empty). Return true if the selection or current dive changed.
-void setSelection(const std::vector<dive *> &selection, dive *currentDive);
-
-// Get currently selectd dives
-std::vector<dive *> getDiveSelection();
-
-} // namespace Command
-
-#endif // COMMAND_PRIVATE_H