Added component edit undo/redo
This commit is contained in:
parent
279801623d
commit
1400033bd0
7 changed files with 50 additions and 1 deletions
|
|
@ -61,6 +61,7 @@ void TextBoxCanvasComponent::load_file(cereal::PortableBinaryInputArchive& a, Ve
|
|||
std::unique_ptr<CanvasComponent> TextBoxCanvasComponent::get_data_copy() const {
|
||||
auto toRet = std::make_unique<TextBoxCanvasComponent>();
|
||||
toRet->d = d;
|
||||
toRet->d.editing = false;
|
||||
*toRet->cursor = *cursor;
|
||||
toRet->textBox->set_rich_text_data(textBox->get_rich_text_data());
|
||||
return toRet;
|
||||
|
|
|
|||
|
|
@ -442,7 +442,7 @@ void DrawingProgramLayerManagerGUI::remove_layer(const NetworkingObjects::NetObj
|
|||
undoID(initUndoID)
|
||||
{}
|
||||
std::string get_name() const override {
|
||||
return layerData.layerData ? "Delete Layer Folder" : "Delete Layer";
|
||||
return layerData.folderData ? "Delete Layer Folder" : "Delete Layer";
|
||||
}
|
||||
bool undo(WorldUndoManager& undoMan) override {
|
||||
std::optional<NetworkingObjects::NetObjID> toInsertParentID = undoMan.get_netid_from_undoid(parentUndoID);
|
||||
|
|
|
|||
|
|
@ -57,6 +57,45 @@ void EditTool::switch_tool(DrawingProgramToolType newTool) {
|
|||
compEditTool->commit_edit_updates(objInfoBeingEdited, prevData);
|
||||
objInfoBeingEdited->obj->commit_update(drawP);
|
||||
objInfoBeingEdited->obj->send_comp_update(drawP, true);
|
||||
|
||||
class EditCanvasComponentWorldUndoAction : public WorldUndoAction {
|
||||
public:
|
||||
EditCanvasComponentWorldUndoAction(std::unique_ptr<CanvasComponent> initOldData, std::unique_ptr<CanvasComponent> initNewData, WorldUndoManager::UndoObjectID initUndoID):
|
||||
oldData(std::move(initOldData)),
|
||||
newData(std::move(initNewData)),
|
||||
undoID(initUndoID)
|
||||
{}
|
||||
std::string get_name() const override {
|
||||
return "Edit Canvas Component";
|
||||
}
|
||||
bool undo(WorldUndoManager& undoMan) override {
|
||||
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());
|
||||
objPtr->get_comp().set_data_from(*oldData);
|
||||
objPtr->send_comp_update(undoMan.world.drawProg, true);
|
||||
return true;
|
||||
}
|
||||
bool redo(WorldUndoManager& undoMan) override {
|
||||
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());
|
||||
objPtr->get_comp().set_data_from(*newData);
|
||||
objPtr->send_comp_update(undoMan.world.drawProg, true);
|
||||
return true;
|
||||
}
|
||||
~EditCanvasComponentWorldUndoAction() {}
|
||||
|
||||
std::unique_ptr<CanvasComponent> oldData;
|
||||
std::unique_ptr<CanvasComponent> newData;
|
||||
WorldUndoManager::UndoObjectID undoID;
|
||||
};
|
||||
|
||||
drawP.world.undo.push(std::make_unique<EditCanvasComponentWorldUndoAction>(std::move(oldData), objInfoBeingEdited->obj->get_comp().get_data_copy(), drawP.world.undo.get_undoid_from_netid(objInfoBeingEdited->obj.get_net_id())));
|
||||
|
||||
oldData = nullptr;
|
||||
objInfoBeingEdited = nullptr;
|
||||
}
|
||||
pointHandles.clear();
|
||||
|
|
@ -92,6 +131,7 @@ void EditTool::edit_start(CanvasComponentContainer::ObjInfo* comp) {
|
|||
}
|
||||
if(isEditing) {
|
||||
objInfoBeingEdited = comp;
|
||||
oldData = comp->obj->get_comp().get_data_copy();
|
||||
compEditTool->edit_start(*this, objInfoBeingEdited, prevData);
|
||||
}
|
||||
}
|
||||
|
|
@ -189,3 +229,5 @@ void EditTool::draw(SkCanvas* canvas, const DrawData& drawData) {
|
|||
drawP.draw_drag_circle(canvas, drawData.cam.c.to_space((objInfoBeingEdited->obj->coords.from_space(*h.p))), {0.1f, 0.9f, 0.9f, 1.0f}, drawData);
|
||||
}
|
||||
}
|
||||
|
||||
EditTool::~EditTool() { }
|
||||
|
|
|
|||
|
|
@ -24,6 +24,7 @@ class EditTool : public DrawingProgramToolBase {
|
|||
virtual void switch_tool(DrawingProgramToolType newTool) override;
|
||||
virtual void draw(SkCanvas* canvas, const DrawData& drawData) override;
|
||||
virtual bool prevent_undo_or_redo() override;
|
||||
~EditTool();
|
||||
|
||||
void add_point_handle(const HandleData& handle);
|
||||
void edit_start(CanvasComponentContainer::ObjInfo* comp);
|
||||
|
|
@ -34,4 +35,6 @@ class EditTool : public DrawingProgramToolBase {
|
|||
CanvasComponentContainer::ObjInfo* objInfoBeingEdited = nullptr;
|
||||
HandleData* pointDragging = nullptr;
|
||||
std::any prevData;
|
||||
|
||||
std::unique_ptr<CanvasComponent> oldData;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -92,6 +92,7 @@ void EllipseDrawTool::commit() {
|
|||
NetworkingObjects::NetObjOwnerPtr<CanvasComponentContainer>& containerPtr = objInfoBeingEdited->obj;
|
||||
containerPtr->commit_update(drawP);
|
||||
containerPtr->send_comp_update(drawP, true);
|
||||
drawP.layerMan.add_undo_place_component(objInfoBeingEdited);
|
||||
objInfoBeingEdited = nullptr;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -90,6 +90,7 @@ void RectDrawTool::commit() {
|
|||
NetworkingObjects::NetObjOwnerPtr<CanvasComponentContainer>& containerPtr = objInfoBeingEdited->obj;
|
||||
containerPtr->commit_update(drawP);
|
||||
containerPtr->send_comp_update(drawP, true);
|
||||
drawP.layerMan.add_undo_place_component(objInfoBeingEdited);
|
||||
objInfoBeingEdited = nullptr;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -92,6 +92,7 @@ void TextBoxTool::commit() {
|
|||
NetworkingObjects::NetObjOwnerPtr<CanvasComponentContainer>& containerPtr = objInfoBeingEdited->obj;
|
||||
containerPtr->commit_update(drawP);
|
||||
containerPtr->send_comp_update(drawP, true);
|
||||
drawP.layerMan.add_undo_place_component(objInfoBeingEdited);
|
||||
objInfoBeingEdited = nullptr;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue