mirror of
https://github.com/subsurface/subsurface.git
synced 2025-01-31 23:43:24 +00:00
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:
parent
76a5a38f5e
commit
147a36647c
8 changed files with 76 additions and 14 deletions
|
@ -268,6 +268,11 @@ void editProfile(dive *d)
|
||||||
execute(new ReplanDive(d, true));
|
execute(new ReplanDive(d, true));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int addWeight(bool currentDiveOnly)
|
||||||
|
{
|
||||||
|
return execute_edit(new AddWeight(currentDiveOnly));
|
||||||
|
}
|
||||||
|
|
||||||
// Trip editing related commands
|
// Trip editing related commands
|
||||||
void editTripLocation(dive_trip *trip, const QString &s)
|
void editTripLocation(dive_trip *trip, const QString &s)
|
||||||
{
|
{
|
||||||
|
|
|
@ -81,6 +81,7 @@ int editDiveMaster(const QStringList &newList, bool currentDiveOnly);
|
||||||
void pasteDives(const dive *d, dive_components what);
|
void pasteDives(const dive *d, dive_components what);
|
||||||
void replanDive(dive *d); // dive computer(s) and cylinder(s) will be reset!
|
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!
|
void editProfile(dive *d); // dive computer(s) and cylinder(s) will be reset!
|
||||||
|
int addWeight(bool currentDiveOnly);
|
||||||
|
|
||||||
// 5) Trip editing commands
|
// 5) Trip editing commands
|
||||||
|
|
||||||
|
|
|
@ -953,4 +953,36 @@ void ReplanDive::redo()
|
||||||
undo();
|
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
|
} // namespace Command
|
||||||
|
|
|
@ -330,6 +330,15 @@ private:
|
||||||
bool workToBeDone() override;
|
bool workToBeDone() override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class AddWeight : public EditDivesBase {
|
||||||
|
public:
|
||||||
|
AddWeight(bool currentDiveOnly);
|
||||||
|
private:
|
||||||
|
void undo() override;
|
||||||
|
void redo() override;
|
||||||
|
bool workToBeDone() override;
|
||||||
|
};
|
||||||
|
|
||||||
} // namespace Command
|
} // namespace Command
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -86,6 +86,8 @@ signals:
|
||||||
|
|
||||||
void cylindersReset(const QVector<dive *> &dives);
|
void cylindersReset(const QVector<dive *> &dives);
|
||||||
void weightsystemsReset(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
|
// Trip edited signal
|
||||||
void tripChanged(dive_trip *trip, TripField field);
|
void tripChanged(dive_trip *trip, TripField field);
|
||||||
|
|
|
@ -158,8 +158,7 @@ void TabDiveEquipment::addCylinder_clicked()
|
||||||
|
|
||||||
void TabDiveEquipment::addWeight_clicked()
|
void TabDiveEquipment::addWeight_clicked()
|
||||||
{
|
{
|
||||||
MainWindow::instance()->mainTab->enableEdition();
|
divesEdited(Command::addWeight(false));
|
||||||
weightModel->add();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void TabDiveEquipment::editCylinderWidget(const QModelIndex &index)
|
void TabDiveEquipment::editCylinderWidget(const QModelIndex &index)
|
||||||
|
|
|
@ -15,6 +15,8 @@ WeightModel::WeightModel(QObject *parent) : CleanerTableModel(parent),
|
||||||
//enum Column {REMOVE, TYPE, WEIGHT};
|
//enum Column {REMOVE, TYPE, WEIGHT};
|
||||||
setHeaderDataStrings(QStringList() << tr("") << tr("Type") << tr("Weight"));
|
setHeaderDataStrings(QStringList() << tr("") << tr("Type") << tr("Weight"));
|
||||||
connect(&diveListNotifier, &DiveListNotifier::weightsystemsReset, this, &WeightModel::weightsystemsReset);
|
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)
|
weightsystem_t *WeightModel::weightSystemAt(const QModelIndex &index)
|
||||||
|
@ -146,17 +148,6 @@ int WeightModel::rowCount(const QModelIndex&) const
|
||||||
return rows;
|
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)
|
void WeightModel::updateDive(dive *dIn)
|
||||||
{
|
{
|
||||||
beginResetModel();
|
beginResetModel();
|
||||||
|
@ -175,3 +166,25 @@ void WeightModel::weightsystemsReset(const QVector<dive *> &dives)
|
||||||
// And update the model..
|
// And update the model..
|
||||||
updateDive(d);
|
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();
|
||||||
|
}
|
||||||
|
|
|
@ -23,7 +23,6 @@ public:
|
||||||
bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;
|
bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;
|
||||||
|
|
||||||
void passInData(const QModelIndex &index, const QVariant &value);
|
void passInData(const QModelIndex &index, const QVariant &value);
|
||||||
void add();
|
|
||||||
void clear();
|
void clear();
|
||||||
void updateDive(dive *d);
|
void updateDive(dive *d);
|
||||||
weightsystem_t *weightSystemAt(const QModelIndex &index);
|
weightsystem_t *weightSystemAt(const QModelIndex &index);
|
||||||
|
@ -33,6 +32,8 @@ public
|
||||||
slots:
|
slots:
|
||||||
void remove(QModelIndex index);
|
void remove(QModelIndex index);
|
||||||
void weightsystemsReset(const QVector<dive *> &dives);
|
void weightsystemsReset(const QVector<dive *> &dives);
|
||||||
|
void weightAdded(dive *d, int pos);
|
||||||
|
void weightRemoved(dive *d, int pos);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
dive *d;
|
dive *d;
|
||||||
|
|
Loading…
Add table
Reference in a new issue