summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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
-rw-r--r--core/equipment.c16
-rw-r--r--core/equipment.h1
-rw-r--r--desktop-widgets/tab-widgets/TabDiveEquipment.cpp10
-rw-r--r--qt-models/weightmodel.cpp12
-rw-r--r--qt-models/weightmodel.h1
9 files changed, 111 insertions, 18 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
diff --git a/core/equipment.c b/core/equipment.c
index 39505a39d..bd1a0b4e3 100644
--- a/core/equipment.c
+++ b/core/equipment.c
@@ -111,12 +111,24 @@ void add_weightsystem_description(const weightsystem_t *weightsystem)
}
}
+weightsystem_t clone_weightsystem(weightsystem_t ws)
+{
+ weightsystem_t res = { ws.weight, copy_string(ws.description) };
+ return res;
+}
+
/* Add a clone of a weightsystem to the end of a weightsystem table.
* Cloned in means that the description-string is copied. */
void add_cloned_weightsystem(struct weightsystem_table *t, weightsystem_t ws)
{
- weightsystem_t w_clone = { ws.weight, copy_string(ws.description) };
- add_to_weightsystem_table(t, t->nr, w_clone);
+ add_to_weightsystem_table(t, t->nr, clone_weightsystem(ws));
+}
+
+/* Add a clone of a weightsystem to the end of a weightsystem table.
+ * Cloned in means that the description-string is copied. */
+void add_cloned_weightsystem_at(struct weightsystem_table *t, weightsystem_t ws)
+{
+ add_to_weightsystem_table(t, t->nr, clone_weightsystem(ws));
}
/* Add a clone of a cylinder to the end of a cylinder table.
diff --git a/core/equipment.h b/core/equipment.h
index 86e23f9f8..687e794a5 100644
--- a/core/equipment.h
+++ b/core/equipment.h
@@ -67,6 +67,7 @@ struct weightsystem_table {
extern int cylinderuse_from_text(const char *text);
extern void copy_weights(const struct weightsystem_table *s, struct weightsystem_table *d);
+extern weightsystem_t clone_weightsystem(weightsystem_t ws);
extern void copy_cylinder_types(const struct dive *s, struct dive *d);
extern void add_cloned_weightsystem(struct weightsystem_table *t, weightsystem_t ws);
extern cylinder_t *add_empty_cylinder(struct cylinder_table *t);
diff --git a/desktop-widgets/tab-widgets/TabDiveEquipment.cpp b/desktop-widgets/tab-widgets/TabDiveEquipment.cpp
index cb7182e02..4baca44b2 100644
--- a/desktop-widgets/tab-widgets/TabDiveEquipment.cpp
+++ b/desktop-widgets/tab-widgets/TabDiveEquipment.cpp
@@ -35,7 +35,6 @@ TabDiveEquipment::TabDiveEquipment(QWidget *parent) : TabBase(parent),
connect(&diveListNotifier, &DiveListNotifier::divesChanged, this, &TabDiveEquipment::divesChanged);
connect(ui.cylinders, &TableView::itemClicked, cylindersModel, &CylindersModel::remove);
connect(ui.cylinders, &TableView::itemClicked, this, &TabDiveEquipment::editCylinderWidget);
- connect(ui.weights, &TableView::itemClicked, weightModel, &WeightModel::remove);
connect(ui.weights, &TableView::itemClicked, this, &TabDiveEquipment::editWeightWidget);
// Current display of things on Gnome3 looks like shit, so
@@ -177,10 +176,15 @@ void TabDiveEquipment::editCylinderWidget(const QModelIndex &index)
void TabDiveEquipment::editWeightWidget(const QModelIndex &index)
{
- MainWindow::instance()->mainTab->enableEdition();
+ if (!index.isValid())
+ return;
- if (index.isValid() && index.column() != WeightModel::REMOVE)
+ if (index.column() == WeightModel::REMOVE) {
+ divesEdited(Command::removeWeight(index.row(), false));
+ } else {
+ MainWindow::instance()->mainTab->enableEdition();
ui.weights->edit(index);
+ }
}
// tricky little macro to edit all the selected dives
diff --git a/qt-models/weightmodel.cpp b/qt-models/weightmodel.cpp
index ceac7617c..ff0b5c87a 100644
--- a/qt-models/weightmodel.cpp
+++ b/qt-models/weightmodel.cpp
@@ -29,17 +29,6 @@ weightsystem_t *WeightModel::weightSystemAt(const QModelIndex &index)
return &d->weightsystems.weightsystems[index.row()];
}
-void WeightModel::remove(QModelIndex index)
-{
- if (index.column() != REMOVE || !d)
- return;
- beginRemoveRows(QModelIndex(), index.row(), index.row());
- rows--;
- remove_weightsystem(d, index.row());
- changed = true;
- endRemoveRows();
-}
-
void WeightModel::clear()
{
updateDive(nullptr);
@@ -96,7 +85,6 @@ void WeightModel::passInData(const QModelIndex &index, const QVariant &value)
}
}
-
bool WeightModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
QString vString = value.toString();
diff --git a/qt-models/weightmodel.h b/qt-models/weightmodel.h
index bb2c63778..a61217379 100644
--- a/qt-models/weightmodel.h
+++ b/qt-models/weightmodel.h
@@ -30,7 +30,6 @@ public:
public
slots:
- void remove(QModelIndex index);
void weightsystemsReset(const QVector<dive *> &dives);
void weightAdded(dive *d, int pos);
void weightRemoved(dive *d, int pos);