11 if (!field || !field->containsCell(
x,
y))
return false;
12 for (
auto &change : changes_) {
13 if (change.x ==
x && change.y ==
y) { change.after = after;
return true; }
15 const int before = field->readInt(
x,
y);
16 if (before == after)
return false;
17 changes_.push_back({
x,
y, before, after});
23 if (!field || changes_.empty())
return false;
24 for (std::size_t i = 0; i < changes_.size(); ++i) {
25 if (field->writeInt(changes_[i].x, changes_[i].y, changes_[i].after) == FieldWriteStatus::Rejected) {
28 (void)field->writeInt(changes_[i].x, changes_[i].y, changes_[i].before);
38 for (
auto it = changes_.rbegin(); it != changes_.rend(); ++it) (
void)field->writeInt(it->x, it->y, it->before);
41 return std::make_unique<IntFieldEditCommand>(*
this);
45 if (!later || later->target_ != target_)
return false;
46 for (
const auto &incoming : later->changes_) {
48 for (
auto &
current : changes_) {
55 if (!merged) changes_.push_back(incoming);
65 if (!field || !field->containsCell(
x,
y))
return false;
66 for (
auto &change : changes_) {
67 if (change.x ==
x && change.y ==
y) { change.after = after;
return true; }
69 const float before = field->readScalar(
x,
y);
70 if (before == after)
return false;
71 changes_.push_back({
x,
y, before, after});
77 if (!field || changes_.empty())
return false;
78 for (std::size_t i = 0; i < changes_.size(); ++i) {
79 if (field->writeScalar(changes_[i].x, changes_[i].y, changes_[i].after) == FieldWriteStatus::Rejected) {
82 (void)field->writeScalar(changes_[i].x, changes_[i].y, changes_[i].before);
92 for (
auto it = changes_.rbegin(); it != changes_.rend(); ++it)
93 static_cast<void>(field->writeScalar(it->x, it->y, it->before));
96 return std::make_unique<ScalarFieldEditCommand>(*
this);
100 if (!later || later->target_ != target_)
return false;
101 for (
const auto &incoming : later->changes_) {
103 for (
auto &
current : changes_) {
105 current.after = incoming.after;
110 if (!merged) changes_.push_back(incoming);
IEditableTarget public API.
C * query()
Queries query.
IIntFieldTarget public API.
IScalarFieldTarget public API.
Reversible unit accepted by the editor transaction manager.
Reversible edits to any target exposing IIntFieldTarget.
IntFieldEditCommand(std::string name, IEditableTarget *target)
Int field edit command.
std::unique_ptr< IEditCommand > clone() const override
Deep copy. @ownership Caller deletes.
void revert() override
Revert.
bool record(int x, int y, int after)
Record.
bool apply() override
Applies .
bool mergeWith(const IEditCommand &later) override
Merge with.
Reversible edits to any target exposing IScalarFieldTarget.
std::unique_ptr< IEditCommand > clone() const override
Deep copy. @ownership Caller deletes.
bool mergeWith(const IEditCommand &later) override
Merge with.
ScalarFieldEditCommand(std::string name, IEditableTarget *target)
Scalar field edit command.
void revert() override
Revert.
bool apply() override
Applies .
bool record(int x, int y, float after)
Record.
void include(int x, int y)
Include.