aboutsummaryrefslogtreecommitdiffstats
path: root/commands
diff options
context:
space:
mode:
Diffstat (limited to 'commands')
-rw-r--r--commands/command.cpp5
-rw-r--r--commands/command.h1
-rw-r--r--commands/command_edit.cpp71
-rw-r--r--commands/command_edit.h12
4 files changed, 89 insertions, 0 deletions
diff --git a/commands/command.cpp b/commands/command.cpp
index 8f3dcc703..9417eec0e 100644
--- a/commands/command.cpp
+++ b/commands/command.cpp
@@ -273,6 +273,11 @@ int addWeight(bool currentDiveOnly)
return execute_edit(new AddWeight(currentDiveOnly));
}
+int removeWeight(int index, bool currentDiveOnly)
+{
+ return execute_edit(new RemoveWeight(index, currentDiveOnly));
+}
+
// Trip editing related commands
void editTripLocation(dive_trip *trip, const QString &s)
{
diff --git a/commands/command.h b/commands/command.h
index 85a37534e..5c60ac316 100644
--- a/commands/command.h
+++ b/commands/command.h
@@ -82,6 +82,7 @@ void pasteDives(const dive *d, dive_components what);
void replanDive(dive *d); // dive computer(s) and cylinder(s) will be reset!
void editProfile(dive *d); // dive computer(s) and cylinder(s) will be reset!
int addWeight(bool currentDiveOnly);
+int removeWeight(int index, bool currentDiveOnly);
// 5) Trip editing commands
diff --git a/commands/command_edit.cpp b/commands/command_edit.cpp
index 541eac61a..bfa02a55d 100644
--- a/commands/command_edit.cpp
+++ b/commands/command_edit.cpp
@@ -985,4 +985,75 @@ void AddWeight::redo()
}
}
+static int find_weightsystem_index(const struct dive *d, weightsystem_t ws)
+{
+ for (int idx = 0; idx < d->weightsystems.nr; ++idx) {
+ if (same_weightsystem(d->weightsystems.weightsystems[idx], ws))
+ return idx;
+ }
+ return -1;
+}
+
+RemoveWeight::RemoveWeight(int index, bool currentDiveOnly) :
+ EditDivesBase(currentDiveOnly),
+ ws{ {0}, nullptr }
+{
+ // Get the old weightsystem, bail if index is invalid
+ if (!current || index < 0 || index >= current->weightsystems.nr) {
+ dives.clear();
+ return;
+ }
+ ws = clone_weightsystem(current->weightsystems.weightsystems[index]);
+
+ // Deleting a weightsystem from multiple dives is semantically ill-defined.
+ // What we will do is trying to delete the same weightsystem if it exists.
+ // For that purpose, we will determine the indices of the same weightsystem.
+ std::vector<dive *> divesNew;
+ divesNew.reserve(dives.size());
+ indexes.reserve(dives.size());
+
+ for (dive *d: dives) {
+ if (d == current) {
+ divesNew.push_back(d);
+ indexes.push_back(index);
+ continue;
+ }
+ int idx = find_weightsystem_index(d, ws);
+ if (idx >= 0) {
+ divesNew.push_back(d);
+ indexes.push_back(idx);
+ }
+ }
+ dives = std::move(divesNew);
+
+ //: remove the part in parentheses for %n = 1
+ setText(tr("Remove weight (%n dive(s))", "", dives.size()));
+}
+
+RemoveWeight::~RemoveWeight()
+{
+ free((void *)ws.description);
+}
+
+bool RemoveWeight::workToBeDone()
+{
+ return !dives.empty();
+}
+
+void RemoveWeight::undo()
+{
+ for (size_t i = 0; i < dives.size(); ++i) {
+ add_to_weightsystem_table(&dives[i]->weightsystems, indexes[i], clone_weightsystem(ws));
+ emit diveListNotifier.weightAdded(dives[i], indexes[i]);
+ }
+}
+
+void RemoveWeight::redo()
+{
+ for (size_t i = 0; i < dives.size(); ++i) {
+ remove_weightsystem(dives[i], indexes[i]);
+ emit diveListNotifier.weightRemoved(dives[i], indexes[i]);
+ }
+}
+
} // namespace Command
diff --git a/commands/command_edit.h b/commands/command_edit.h
index ecf745070..c23f06094 100644
--- a/commands/command_edit.h
+++ b/commands/command_edit.h
@@ -339,6 +339,18 @@ private:
bool workToBeDone() override;
};
+class RemoveWeight : public EditDivesBase {
+public:
+ RemoveWeight(int index, bool currentDiveOnly);
+ ~RemoveWeight();
+private:
+ weightsystem_t ws;
+ std::vector<int> indexes; // An index for each dive in the dives vector.
+ void undo() override;
+ void redo() override;
+ bool workToBeDone() override;
+};
+
} // namespace Command
#endif