Fixed undo problem with eraser
This commit is contained in:
parent
121a6b05aa
commit
4363fe9f9d
5 changed files with 62 additions and 9 deletions
|
|
@ -51,3 +51,41 @@ bool EditCanvasComponentWorldUndoAction::undo_redo(WorldUndoManager& undoMan) {
|
|||
}
|
||||
|
||||
EditCanvasComponentWorldUndoAction::~EditCanvasComponentWorldUndoAction() {}
|
||||
|
||||
|
||||
|
||||
|
||||
EditTransformCanvasComponentWorldUndoAction::EditTransformCanvasComponentWorldUndoAction(std::unique_ptr<CanvasComponent> initData, const CoordSpaceHelper& initCoords, WorldUndoManager::UndoObjectID initUndoID):
|
||||
data(std::move(initData)),
|
||||
coords(initCoords),
|
||||
undoID(initUndoID)
|
||||
{}
|
||||
|
||||
std::string EditTransformCanvasComponentWorldUndoAction::get_name() const {
|
||||
return "Edit Canvas Component With Transform";
|
||||
}
|
||||
|
||||
bool EditTransformCanvasComponentWorldUndoAction::undo(WorldUndoManager& undoMan) {
|
||||
return undo_redo(undoMan);
|
||||
}
|
||||
|
||||
bool EditTransformCanvasComponentWorldUndoAction::redo(WorldUndoManager& undoMan) {
|
||||
return undo_redo(undoMan);
|
||||
}
|
||||
|
||||
bool EditTransformCanvasComponentWorldUndoAction::undo_redo(WorldUndoManager& undoMan) {
|
||||
std::optional<NetworkingObjects::NetObjID> toEditID = undoMan.get_netid_from_undoid(undoID);
|
||||
if(!toEditID.has_value())
|
||||
return false;
|
||||
auto objPtr = undoMan.world.netObjMan.get_obj_temporary_ref_from_id<CanvasComponentContainer>(toEditID.value());
|
||||
std::unique_ptr<CanvasComponent> newData = objPtr->get_comp().get_data_copy();
|
||||
objPtr->get_comp().set_data_from(*data);
|
||||
data = std::move(newData);
|
||||
std::swap(coords, objPtr->coords);
|
||||
undoMan.world.drawProg.send_transforms_for({&(*objPtr->objInfo)});
|
||||
objPtr->commit_update(undoMan.world.drawProg);
|
||||
objPtr->send_comp_update(undoMan.world.drawProg, true);
|
||||
return true;
|
||||
}
|
||||
|
||||
EditTransformCanvasComponentWorldUndoAction::~EditTransformCanvasComponentWorldUndoAction() {}
|
||||
|
|
|
|||
|
|
@ -31,3 +31,17 @@ class EditCanvasComponentWorldUndoAction : public WorldUndoAction {
|
|||
std::unique_ptr<CanvasComponent> data;
|
||||
WorldUndoManager::UndoObjectID undoID;
|
||||
};
|
||||
|
||||
class EditTransformCanvasComponentWorldUndoAction : public WorldUndoAction {
|
||||
public:
|
||||
EditTransformCanvasComponentWorldUndoAction(std::unique_ptr<CanvasComponent> initData, const CoordSpaceHelper& initCoords, WorldUndoManager::UndoObjectID initUndoID);
|
||||
std::string get_name() const override;
|
||||
bool undo(WorldUndoManager& undoMan) override;
|
||||
bool redo(WorldUndoManager& undoMan) override;
|
||||
bool undo_redo(WorldUndoManager& undoMan);
|
||||
~EditTransformCanvasComponentWorldUndoAction();
|
||||
|
||||
std::unique_ptr<CanvasComponent> data;
|
||||
CoordSpaceHelper coords;
|
||||
WorldUndoManager::UndoObjectID undoID;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -139,7 +139,7 @@ void EraserTool::erase_on_path() {
|
|||
if(drawP.layerMan.component_passes_layer_selector(c, drawP.controls.layerSelector)) {
|
||||
auto it = updatedComponents.find(c);
|
||||
if(it != updatedComponents.end()) {
|
||||
c->obj->get_comp().set_data_from(*(it->second));
|
||||
c->obj->get_comp().set_data_from(*it->second->obj);
|
||||
updatedComponents.erase(it);
|
||||
}
|
||||
erasedComponents.emplace(c);
|
||||
|
|
@ -154,7 +154,7 @@ void EraserTool::erase_on_path() {
|
|||
drawP.drawCache.node_loop_erase_if_components(bvhNode, [&](auto c) {
|
||||
if(drawP.world.main.toolConfig.eraser.eraseDetail) {
|
||||
if(drawP.layerMan.component_passes_layer_selector(c, drawP.controls.layerSelector)) {
|
||||
auto dataCopy = c->obj->get_comp().get_data_copy();
|
||||
auto dataCopy = c->obj->get_data_copy();
|
||||
CanvasComponentEraseDetailResult result = c->obj->collides_with_erase_detail(genData.coords, eraseScaleToCheckAgainst, erasePath);
|
||||
switch(result) {
|
||||
case CanvasComponentEraseDetailResult::NO_CHANGE:
|
||||
|
|
@ -173,11 +173,11 @@ void EraserTool::erase_on_path() {
|
|||
case CanvasComponentEraseDetailResult::REMOVED:
|
||||
auto it = updatedComponents.find(c);
|
||||
if(it != updatedComponents.end()) {
|
||||
c->obj->get_comp().set_data_from(*(it->second));
|
||||
c->obj->get_comp().set_data_from(*it->second->obj);
|
||||
updatedComponents.erase(it);
|
||||
}
|
||||
else
|
||||
c->obj->get_comp().set_data_from(*dataCopy);
|
||||
c->obj->get_comp().set_data_from(*dataCopy->obj);
|
||||
erasedComponents.emplace(c);
|
||||
drawP.drawCache.invalidate_cache_at_optional_aabb(c->obj->get_world_bounds());
|
||||
return true;
|
||||
|
|
@ -223,7 +223,7 @@ void EraserTool::commit_erase() {
|
|||
newObjectsToPlace[comp->obj->parentLayer].emplace_back(std::next(comp->obj->objInfo), c);
|
||||
placedNewObject = true;
|
||||
erasedComponents.emplace(comp);
|
||||
comp->obj->get_comp().set_data_from(*oldData);
|
||||
comp->obj->get_comp().set_data_from(*oldData->obj);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
|
@ -248,10 +248,10 @@ void EraserTool::commit_erase() {
|
|||
comp->obj->send_comp_update(drawP, true);
|
||||
if(first) {
|
||||
first = false;
|
||||
drawP.world.undo.push(std::make_unique<EditCanvasComponentWorldUndoAction>(std::move(oldData), drawP.world.undo.get_undoid_from_netid(comp->obj.get_net_id())));
|
||||
drawP.world.undo.push(std::make_unique<EditTransformCanvasComponentWorldUndoAction>(std::move(oldData->obj), oldData->coords, drawP.world.undo.get_undoid_from_netid(comp->obj.get_net_id())));
|
||||
}
|
||||
else
|
||||
drawP.world.undo.push_on_last(std::make_unique<EditCanvasComponentWorldUndoAction>(std::move(oldData), drawP.world.undo.get_undoid_from_netid(comp->obj.get_net_id())));
|
||||
drawP.world.undo.push_on_last(std::make_unique<EditTransformCanvasComponentWorldUndoAction>(std::move(oldData->obj), oldData->coords, drawP.world.undo.get_undoid_from_netid(comp->obj.get_net_id())));
|
||||
}
|
||||
}, NetworkingObjects::NetObjManager::SendUpdateType::SEND_TO_ALL, nullptr);
|
||||
erasedComponents.clear();
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ class EraserTool : public DrawingProgramToolBase {
|
|||
virtual void input_mouse_motion_callback(const InputManager::MouseMotionCallbackArgs& motion) override;
|
||||
virtual void input_pen_axis_callback(const InputManager::PenAxisCallbackArgs& axis) override;
|
||||
|
||||
std::unordered_map<CanvasComponentContainer::ObjInfo*, std::unique_ptr<CanvasComponent>> updatedComponents;
|
||||
std::unordered_map<CanvasComponentContainer::ObjInfo*, std::unique_ptr<CanvasComponentContainer::CopyData>> updatedComponents;
|
||||
std::unordered_set<CanvasComponentContainer::ObjInfo*> erasedComponents; // Pointers will be erased from this set if theyre erased in the main list (done by callback)
|
||||
private:
|
||||
SkPath erasePath;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue