Undo: make adding of weights an undoable action

Introduce an AddWeight undo command. This is modelled after the
numerous dive-edit undo commands. The redo and undo actions are
connected to the WeightModel via two new signals, weightAdded
and weightRemoved.

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
Berthold Stoeger 2019-11-02 21:19:29 +01:00 committed by Dirk Hohndel
parent 76a5a38f5e
commit 147a36647c
8 changed files with 76 additions and 14 deletions

View file

@ -268,6 +268,11 @@ void editProfile(dive *d)
execute(new ReplanDive(d, true));
}
int addWeight(bool currentDiveOnly)
{
return execute_edit(new AddWeight(currentDiveOnly));
}
// Trip editing related commands
void editTripLocation(dive_trip *trip, const QString &s)
{

View file

@ -81,6 +81,7 @@ int editDiveMaster(const QStringList &newList, bool currentDiveOnly);
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);
// 5) Trip editing commands

View file

@ -953,4 +953,36 @@ void ReplanDive::redo()
undo();
}
// ***** Add Weight *****
AddWeight::AddWeight(bool currentDiveOnly) :
EditDivesBase(currentDiveOnly)
{
//: remove the part in parentheses for %n = 1
setText(tr("Add weight (%n dive(s))", "", dives.size()));
}
bool AddWeight::workToBeDone()
{
return true;
}
void AddWeight::undo()
{
for (dive *d: dives) {
if (d->weightsystems.nr <= 0)
continue;
remove_weightsystem(d, d->weightsystems.nr - 1);
emit diveListNotifier.weightRemoved(d, d->weightsystems.nr);
}
}
void AddWeight::redo()
{
weightsystem_t ws { {0}, "" };
for (dive *d: dives) {
add_cloned_weightsystem(&d->weightsystems, ws);
emit diveListNotifier.weightAdded(d, d->weightsystems.nr - 1);
}
}
} // namespace Command

View file

@ -330,6 +330,15 @@ private:
bool workToBeDone() override;
};
class AddWeight : public EditDivesBase {
public:
AddWeight(bool currentDiveOnly);
private:
void undo() override;
void redo() override;
bool workToBeDone() override;
};
} // namespace Command
#endif

View file

@ -86,6 +86,8 @@ signals:
void cylindersReset(const QVector<dive *> &dives);
void weightsystemsReset(const QVector<dive *> &dives);
void weightAdded(dive *d, int pos);
void weightRemoved(dive *d, int pos);
// Trip edited signal
void tripChanged(dive_trip *trip, TripField field);

View file

@ -158,8 +158,7 @@ void TabDiveEquipment::addCylinder_clicked()
void TabDiveEquipment::addWeight_clicked()
{
MainWindow::instance()->mainTab->enableEdition();
weightModel->add();
divesEdited(Command::addWeight(false));
}
void TabDiveEquipment::editCylinderWidget(const QModelIndex &index)

View file

@ -15,6 +15,8 @@ WeightModel::WeightModel(QObject *parent) : CleanerTableModel(parent),
//enum Column {REMOVE, TYPE, WEIGHT};
setHeaderDataStrings(QStringList() << tr("") << tr("Type") << tr("Weight"));
connect(&diveListNotifier, &DiveListNotifier::weightsystemsReset, this, &WeightModel::weightsystemsReset);
connect(&diveListNotifier, &DiveListNotifier::weightAdded, this, &WeightModel::weightAdded);
connect(&diveListNotifier, &DiveListNotifier::weightRemoved, this, &WeightModel::weightRemoved);
}
weightsystem_t *WeightModel::weightSystemAt(const QModelIndex &index)
@ -146,17 +148,6 @@ int WeightModel::rowCount(const QModelIndex&) const
return rows;
}
void WeightModel::add()
{
int row = rows;
weightsystem_t ws { {0}, "" };
beginInsertRows(QModelIndex(), row, row);
add_cloned_weightsystem(&d->weightsystems, ws);
rows++;
changed = true;
endInsertRows();
}
void WeightModel::updateDive(dive *dIn)
{
beginResetModel();
@ -175,3 +166,25 @@ void WeightModel::weightsystemsReset(const QVector<dive *> &dives)
// And update the model..
updateDive(d);
}
void WeightModel::weightAdded(struct dive *changed, int pos)
{
if (d != changed)
return;
// The last row was already inserted by the undo command. Just inform the model.
beginInsertRows(QModelIndex(), pos, pos);
rows++;
endInsertRows();
}
void WeightModel::weightRemoved(struct dive *changed, int pos)
{
if (d != changed)
return;
// The row was already deleted by the undo command. Just inform the model.
beginRemoveRows(QModelIndex(), pos, pos);
rows--;
endRemoveRows();
}

View file

@ -23,7 +23,6 @@ public:
bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;
void passInData(const QModelIndex &index, const QVariant &value);
void add();
void clear();
void updateDive(dive *d);
weightsystem_t *weightSystemAt(const QModelIndex &index);
@ -33,6 +32,8 @@ public
slots:
void remove(QModelIndex index);
void weightsystemsReset(const QVector<dive *> &dives);
void weightAdded(dive *d, int pos);
void weightRemoved(dive *d, int pos);
private:
dive *d;