diff --git a/src/CanvasComponents/TextBoxCanvasComponent.cpp b/src/CanvasComponents/TextBoxCanvasComponent.cpp index 785bd85..e910aeb 100644 --- a/src/CanvasComponents/TextBoxCanvasComponent.cpp +++ b/src/CanvasComponents/TextBoxCanvasComponent.cpp @@ -61,6 +61,7 @@ void TextBoxCanvasComponent::load_file(cereal::PortableBinaryInputArchive& a, Ve std::unique_ptr TextBoxCanvasComponent::get_data_copy() const { auto toRet = std::make_unique(); toRet->d = d; + toRet->d.editing = false; *toRet->cursor = *cursor; toRet->textBox->set_rich_text_data(textBox->get_rich_text_data()); return toRet; diff --git a/src/DrawingProgram/Layers/DrawingProgramLayerManagerGUI.cpp b/src/DrawingProgram/Layers/DrawingProgramLayerManagerGUI.cpp index 596a766..0c359ea 100644 --- a/src/DrawingProgram/Layers/DrawingProgramLayerManagerGUI.cpp +++ b/src/DrawingProgram/Layers/DrawingProgramLayerManagerGUI.cpp @@ -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 toInsertParentID = undoMan.get_netid_from_undoid(parentUndoID); diff --git a/src/DrawingProgram/Tools/EditTool.cpp b/src/DrawingProgram/Tools/EditTool.cpp index 7c34387..5b2c520 100644 --- a/src/DrawingProgram/Tools/EditTool.cpp +++ b/src/DrawingProgram/Tools/EditTool.cpp @@ -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 initOldData, std::unique_ptr 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 toEditID = undoMan.get_netid_from_undoid(undoID); + if(!toEditID.has_value()) + return false; + auto objPtr = undoMan.world.netObjMan.get_obj_temporary_ref_from_id(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 toEditID = undoMan.get_netid_from_undoid(undoID); + if(!toEditID.has_value()) + return false; + auto objPtr = undoMan.world.netObjMan.get_obj_temporary_ref_from_id(toEditID.value()); + objPtr->get_comp().set_data_from(*newData); + objPtr->send_comp_update(undoMan.world.drawProg, true); + return true; + } + ~EditCanvasComponentWorldUndoAction() {} + + std::unique_ptr oldData; + std::unique_ptr newData; + WorldUndoManager::UndoObjectID undoID; + }; + + drawP.world.undo.push(std::make_unique(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() { } diff --git a/src/DrawingProgram/Tools/EditTool.hpp b/src/DrawingProgram/Tools/EditTool.hpp index e581164..13d9d28 100644 --- a/src/DrawingProgram/Tools/EditTool.hpp +++ b/src/DrawingProgram/Tools/EditTool.hpp @@ -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 oldData; }; diff --git a/src/DrawingProgram/Tools/EllipseDrawTool.cpp b/src/DrawingProgram/Tools/EllipseDrawTool.cpp index a2423f4..9d8842b 100644 --- a/src/DrawingProgram/Tools/EllipseDrawTool.cpp +++ b/src/DrawingProgram/Tools/EllipseDrawTool.cpp @@ -92,6 +92,7 @@ void EllipseDrawTool::commit() { NetworkingObjects::NetObjOwnerPtr& containerPtr = objInfoBeingEdited->obj; containerPtr->commit_update(drawP); containerPtr->send_comp_update(drawP, true); + drawP.layerMan.add_undo_place_component(objInfoBeingEdited); objInfoBeingEdited = nullptr; } } diff --git a/src/DrawingProgram/Tools/RectDrawTool.cpp b/src/DrawingProgram/Tools/RectDrawTool.cpp index b2cb95c..eba84f4 100644 --- a/src/DrawingProgram/Tools/RectDrawTool.cpp +++ b/src/DrawingProgram/Tools/RectDrawTool.cpp @@ -90,6 +90,7 @@ void RectDrawTool::commit() { NetworkingObjects::NetObjOwnerPtr& containerPtr = objInfoBeingEdited->obj; containerPtr->commit_update(drawP); containerPtr->send_comp_update(drawP, true); + drawP.layerMan.add_undo_place_component(objInfoBeingEdited); objInfoBeingEdited = nullptr; } } diff --git a/src/DrawingProgram/Tools/TextBoxTool.cpp b/src/DrawingProgram/Tools/TextBoxTool.cpp index 1ce3460..b4222f7 100644 --- a/src/DrawingProgram/Tools/TextBoxTool.cpp +++ b/src/DrawingProgram/Tools/TextBoxTool.cpp @@ -92,6 +92,7 @@ void TextBoxTool::commit() { NetworkingObjects::NetObjOwnerPtr& containerPtr = objInfoBeingEdited->obj; containerPtr->commit_update(drawP); containerPtr->send_comp_update(drawP, true); + drawP.layerMan.add_undo_place_component(objInfoBeingEdited); objInfoBeingEdited = nullptr; } }