diff --git a/src/Bookmarks/BookmarkManager.cpp b/src/Bookmarks/BookmarkManager.cpp index a241520..6432774 100644 --- a/src/Bookmarks/BookmarkManager.cpp +++ b/src/Bookmarks/BookmarkManager.cpp @@ -346,14 +346,13 @@ std::pair BookmarkManager::create_bookmark(BookmarkListItem* newItem) { class AddBookmarkWorldUndoAction : public WorldUndoAction { public: - AddBookmarkWorldUndoAction(const BookmarkCompleteUndoData& initBookmarkData, uint32_t newPos, WorldUndoManager::UndoObjectID initParentUndoID, WorldUndoManager::UndoObjectID initUndoID): - bookmarkData(initBookmarkData), + AddBookmarkWorldUndoAction(uint32_t newPos, WorldUndoManager::UndoObjectID initParentUndoID, WorldUndoManager::UndoObjectID initUndoID): pos(newPos), parentUndoID(initParentUndoID), undoID(initUndoID) {} std::string get_name() const override { - return bookmarkData.folderList ? "Add Bookmark Folder" : "Add Bookmark"; + return "Add Bookmark Item"; } bool undo(WorldUndoManager& undoMan) override { std::optional toEraseParentID = undoMan.get_netid_from_undoid(parentUndoID); @@ -364,7 +363,9 @@ NetworkingObjects::NetObjOrderedListIterator BookmarkManager:: return false; auto& bookmarkList = undoMan.world.netObjMan.get_obj_temporary_ref_from_id(toEraseParentID.value())->get_folder_list(); - bookmarkList->erase(bookmarkList, bookmarkList->get(toEraseID.value())); + auto it = bookmarkList->get(toEraseID.value()); + bookmarkData = std::make_unique(it->obj->get_complete_undo_data(undoMan)); + bookmarkList->erase(bookmarkList, it); return true; } bool redo(WorldUndoManager& undoMan) override { @@ -376,16 +377,18 @@ NetworkingObjects::NetObjOrderedListIterator BookmarkManager:: return false; auto& bookmarkList = undoMan.world.netObjMan.get_obj_temporary_ref_from_id(toInsertParentID.value())->get_folder_list(); - auto insertedIt = bookmarkList->emplace_direct(bookmarkList, bookmarkList->at(pos), undoMan.world, bookmarkData); + auto insertedIt = bookmarkList->emplace_direct(bookmarkList, bookmarkList->at(pos), undoMan.world, *bookmarkData); undoMan.register_new_netid_to_existing_undoid(undoID, insertedIt->obj.get_net_id()); + bookmarkData = nullptr; return true; } void scale_up(const WorldScalar& scaleAmount) override { - bookmarkData.scale_up(scaleAmount); + if(bookmarkData) + bookmarkData->scale_up(scaleAmount); } ~AddBookmarkWorldUndoAction() {} - BookmarkCompleteUndoData bookmarkData; + std::unique_ptr bookmarkData; uint32_t pos; WorldUndoManager::UndoObjectID parentUndoID; WorldUndoManager::UndoObjectID undoID; @@ -393,21 +396,21 @@ NetworkingObjects::NetObjOrderedListIterator BookmarkManager:: auto insertedBookmarkPair = create_in_proper_position(newItem); auto& it = insertedBookmarkPair.second; - world.undo.push(std::make_unique(it->obj->get_complete_undo_data(world.undo), it->pos, world.undo.get_undoid_from_netid(insertedBookmarkPair.first), world.undo.get_undoid_from_netid(it->obj.get_net_id()))); + world.undo.push(std::make_unique(it->pos, world.undo.get_undoid_from_netid(insertedBookmarkPair.first), world.undo.get_undoid_from_netid(it->obj.get_net_id()))); return it; } void BookmarkManager::remove_bookmark(const NetworkingObjects::NetObjID& parentID, const NetworkingObjects::NetObjID& objectID) { class DeleteBookmarkWorldUndoAction : public WorldUndoAction { public: - DeleteBookmarkWorldUndoAction(const BookmarkCompleteUndoData& initBookmarkData, uint32_t newPos, WorldUndoManager::UndoObjectID initParentUndoID, WorldUndoManager::UndoObjectID initUndoID): - bookmarkData(initBookmarkData), + DeleteBookmarkWorldUndoAction(std::unique_ptr initBookmarkData, uint32_t newPos, WorldUndoManager::UndoObjectID initParentUndoID, WorldUndoManager::UndoObjectID initUndoID): + bookmarkData(std::move(initBookmarkData)), pos(newPos), parentUndoID(initParentUndoID), undoID(initUndoID) {} std::string get_name() const override { - return bookmarkData.folderList ? "Delete Bookmark Folder" : "Delete Bookmark"; + return "Delete Bookmark Item"; } bool undo(WorldUndoManager& undoMan) override { std::optional toInsertParentID = undoMan.get_netid_from_undoid(parentUndoID); @@ -418,8 +421,9 @@ void BookmarkManager::remove_bookmark(const NetworkingObjects::NetObjID& parentI return false; auto& bookmarkList = undoMan.world.netObjMan.get_obj_temporary_ref_from_id(toInsertParentID.value())->get_folder_list(); - auto insertedIt = bookmarkList->emplace_direct(bookmarkList, bookmarkList->at(pos), undoMan.world, bookmarkData); + auto insertedIt = bookmarkList->emplace_direct(bookmarkList, bookmarkList->at(pos), undoMan.world, *bookmarkData); undoMan.register_new_netid_to_existing_undoid(undoID, insertedIt->obj.get_net_id()); + bookmarkData = nullptr; return true; } bool redo(WorldUndoManager& undoMan) override { @@ -431,15 +435,18 @@ void BookmarkManager::remove_bookmark(const NetworkingObjects::NetObjID& parentI return false; auto& bookmarkList = undoMan.world.netObjMan.get_obj_temporary_ref_from_id(toEraseParentID.value())->get_folder_list(); - bookmarkList->erase(bookmarkList, bookmarkList->get(toEraseID.value())); + auto it = bookmarkList->get(toEraseID.value()); + bookmarkData = std::make_unique(it->obj->get_complete_undo_data(undoMan)); + bookmarkList->erase(bookmarkList, it); return true; } void scale_up(const WorldScalar& scaleAmount) override { - bookmarkData.scale_up(scaleAmount); + if(bookmarkData) + bookmarkData->scale_up(scaleAmount); } ~DeleteBookmarkWorldUndoAction() {} - BookmarkCompleteUndoData bookmarkData; + std::unique_ptr bookmarkData; uint32_t pos; WorldUndoManager::UndoObjectID parentUndoID; WorldUndoManager::UndoObjectID undoID; @@ -447,7 +454,7 @@ void BookmarkManager::remove_bookmark(const NetworkingObjects::NetObjID& parentI auto& folderList = world.netObjMan.get_obj_temporary_ref_from_id(parentID)->get_folder_list(); auto it = folderList->get(objectID); - world.undo.push(std::make_unique(it->obj->get_complete_undo_data(world.undo), it->pos, world.undo.get_undoid_from_netid(parentID), world.undo.get_undoid_from_netid(objectID))); + world.undo.push(std::make_unique(std::make_unique(it->obj->get_complete_undo_data(world.undo)), it->pos, world.undo.get_undoid_from_netid(parentID), world.undo.get_undoid_from_netid(objectID))); folderList->erase(folderList, it); } @@ -482,34 +489,32 @@ void BookmarkManager::load_file(cereal::PortableBinaryInputArchive& a, VersionNu void BookmarkManager::editing_bookmark_check() { class EditBookmarkWorldUndoAction : public WorldUndoAction { public: - EditBookmarkWorldUndoAction(const std::string& initNameOld, const std::string& initNameNew, WorldUndoManager::UndoObjectID initUndoID): - nameOld(initNameOld), - nameNew(initNameNew), + EditBookmarkWorldUndoAction(const std::string& initName, WorldUndoManager::UndoObjectID initUndoID): + nameData(initName), undoID(initUndoID) {} std::string get_name() const override { return "Edit Bookmark"; } bool undo(WorldUndoManager& undoMan) override { - std::optional toModifyID = undoMan.get_netid_from_undoid(undoID); - if(!toModifyID.has_value()) - return false; - auto objPtr = undoMan.world.netObjMan.get_obj_temporary_ref_from_id(toModifyID.value()); - objPtr->set_name(undoMan.world.delayedUpdateObjectManager, nameOld); - return true; + return undo_redo(undoMan); } bool redo(WorldUndoManager& undoMan) override { + return undo_redo(undoMan); + } + bool undo_redo(WorldUndoManager& undoMan) { std::optional toModifyID = undoMan.get_netid_from_undoid(undoID); if(!toModifyID.has_value()) return false; auto objPtr = undoMan.world.netObjMan.get_obj_temporary_ref_from_id(toModifyID.value()); - objPtr->set_name(undoMan.world.delayedUpdateObjectManager, nameNew); + std::string newNameData = objPtr->get_name(); + objPtr->set_name(undoMan.world.delayedUpdateObjectManager, nameData); + nameData = newNameData; return true; } ~EditBookmarkWorldUndoAction() {} - std::string nameOld; - std::string nameNew; + std::string nameData; WorldUndoManager::UndoObjectID undoID; }; @@ -519,7 +524,7 @@ void BookmarkManager::editing_bookmark_check() { if(tempPtr) { const std::string& currentNameData = tempPtr->get_name(); if(currentNameData != editingBookmarkName.value()) - world.undo.push(std::make_unique(editingBookmarkName.value(), currentNameData, world.undo.get_undoid_from_netid(oldNetObjID))); + world.undo.push(std::make_unique(editingBookmarkName.value(), world.undo.get_undoid_from_netid(oldNetObjID))); } } editingBookmarkName = std::nullopt; diff --git a/src/DrawingProgram/Layers/DrawingProgramLayerManager.cpp b/src/DrawingProgram/Layers/DrawingProgramLayerManager.cpp index 2edf5b8..6b2fed6 100644 --- a/src/DrawingProgram/Layers/DrawingProgramLayerManager.cpp +++ b/src/DrawingProgram/Layers/DrawingProgramLayerManager.cpp @@ -185,10 +185,12 @@ void DrawingProgramLayerManager::add_undo_place_component(CanvasComponentContain auto compList = undoMan.world.netObjMan.get_obj_temporary_ref_from_id>(toEraseCompListID.value()); auto insertedIt = compList->emplace_direct(compList, compList->at(pos), undoMan.world.netObjMan, *copyData); undoMan.register_new_netid_to_existing_undoid(undoID, insertedIt->obj.get_net_id()); + copyData = nullptr; return true; } void scale_up(const WorldScalar& scaleAmount) override { - copyData->scale_up(scaleAmount); + if(copyData) + copyData->scale_up(scaleAmount); } ~AddCanvasComponentWorldUndoAction() {} @@ -260,6 +262,7 @@ void DrawingProgramLayerManager::add_undo_erase_components(const std::unordered_ undoMan.register_new_netid_to_existing_undoid(insertData.undoID->at(i), toInsert[i].second.get_net_id()); } parentListPtr->insert_ordered_list_and_send_create(parentListPtr, toInsert); + insertData.copyData->clear(); } }, NetworkingObjects::NetObjManager::SendUpdateType::SEND_TO_ALL, nullptr); @@ -279,6 +282,8 @@ void DrawingProgramLayerManager::add_undo_erase_components(const std::unordered_ if(!undoMan.fill_netid_list_from_undoid_list(netIDList, eData.undoID)) return false; eraseData = parentListPtr->get_list(netIDList); + for(auto& it : eraseData) + eData.copyData.emplace_back(it->obj->get_data_copy()); } } @@ -352,6 +357,8 @@ void DrawingProgramLayerManager::add_undo_place_components(DrawingProgramLayerLi if(!undoMan.fill_netid_list_from_undoid_list(netIDList, undoPlaceData.undoID)) return false; eraseData = parentListPtr->get_list(netIDList); + for(auto& it : eraseData) + undoPlaceData.copyData.emplace_back(it->obj->get_data_copy()); } parentListPtr->erase_list(parentListPtr, eraseData); @@ -381,6 +388,7 @@ void DrawingProgramLayerManager::add_undo_place_components(DrawingProgramLayerLi } parentListPtr->insert_ordered_list_and_send_create(parentListPtr, toInsert); + undoPlaceData.copyData.clear(); return true; } void scale_up(const WorldScalar& scaleAmount) override { @@ -399,7 +407,6 @@ void DrawingProgramLayerManager::add_undo_place_components(DrawingProgramLayerLi uint32_t i = 0; for(auto& comp : placeList) { undoData.undoID.emplace_back(undoMan.get_undoid_from_netid(comp->obj.get_net_id())); - undoData.copyData.emplace_back(comp->obj->get_data_copy()); undoData.pos.emplace_back(comp->pos - i); ++i; } diff --git a/src/DrawingProgram/Layers/DrawingProgramLayerManagerGUI.cpp b/src/DrawingProgram/Layers/DrawingProgramLayerManagerGUI.cpp index 2b1d9ad..af6b74a 100644 --- a/src/DrawingProgram/Layers/DrawingProgramLayerManagerGUI.cpp +++ b/src/DrawingProgram/Layers/DrawingProgramLayerManagerGUI.cpp @@ -384,14 +384,14 @@ NetworkingObjects::NetObjOrderedListIterator Drawin auto& world = layerMan.drawP.world; class AddLayerWorldUndoAction : public WorldUndoAction { public: - AddLayerWorldUndoAction(DrawingProgramLayerListItemUndoData initLayerData, uint32_t newPos, WorldUndoManager::UndoObjectID initParentUndoID, WorldUndoManager::UndoObjectID initUndoID): + AddLayerWorldUndoAction(std::unique_ptr initLayerData, uint32_t newPos, WorldUndoManager::UndoObjectID initParentUndoID, WorldUndoManager::UndoObjectID initUndoID): layerData(std::move(initLayerData)), pos(newPos), parentUndoID(initParentUndoID), undoID(initUndoID) {} std::string get_name() const override { - return layerData.folderData ? "Add Layer Folder" : "Add Layer"; + return "Add Layer Item"; } bool undo(WorldUndoManager& undoMan) override { std::optional toEraseParentID = undoMan.get_netid_from_undoid(parentUndoID); @@ -402,7 +402,9 @@ NetworkingObjects::NetObjOrderedListIterator Drawin return false; auto& layerList = undoMan.world.netObjMan.get_obj_temporary_ref_from_id(toEraseParentID.value())->get_folder().folderList; - layerList->erase(layerList, layerList->get(toEraseID.value())); + auto it = layerList->get(toEraseID.value()); + layerData = std::make_unique(it->obj->get_undo_data(undoMan)); + layerList->erase(layerList, it); return true; } bool redo(WorldUndoManager& undoMan) override { @@ -414,16 +416,18 @@ NetworkingObjects::NetObjOrderedListIterator Drawin return false; auto& layerList = undoMan.world.netObjMan.get_obj_temporary_ref_from_id(toInsertParentID.value())->get_folder().folderList; - auto insertedIt = layerList->emplace_direct(layerList, layerList->at(pos), undoMan.world, layerData); + auto insertedIt = layerList->emplace_direct(layerList, layerList->at(pos), undoMan.world, *layerData); undoMan.register_new_netid_to_existing_undoid(undoID, insertedIt->obj.get_net_id()); + layerData = nullptr; return true; } void scale_up(const WorldScalar& scaleAmount) override { - layerData.scale_up(scaleAmount); + if(layerData) + layerData->scale_up(scaleAmount); } ~AddLayerWorldUndoAction() {} - DrawingProgramLayerListItemUndoData layerData; + std::unique_ptr layerData; uint32_t pos; WorldUndoManager::UndoObjectID parentUndoID; WorldUndoManager::UndoObjectID undoID; @@ -431,7 +435,7 @@ NetworkingObjects::NetObjOrderedListIterator Drawin auto insertedLayerPair = create_in_proper_position(newItem); auto& it = insertedLayerPair.second; - world.undo.push(std::make_unique(it->obj->get_undo_data(world.undo), it->pos, world.undo.get_undoid_from_netid(insertedLayerPair.first), world.undo.get_undoid_from_netid(it->obj.get_net_id()))); + world.undo.push(std::make_unique(std::make_unique(it->obj->get_undo_data(world.undo)), it->pos, world.undo.get_undoid_from_netid(insertedLayerPair.first), world.undo.get_undoid_from_netid(it->obj.get_net_id()))); return it; } @@ -439,14 +443,14 @@ void DrawingProgramLayerManagerGUI::remove_layer(const NetworkingObjects::NetObj auto& world = layerMan.drawP.world; class DeleteLayerWorldUndoAction : public WorldUndoAction { public: - DeleteLayerWorldUndoAction(DrawingProgramLayerListItemUndoData initLayerData, uint32_t newPos, WorldUndoManager::UndoObjectID initParentUndoID, WorldUndoManager::UndoObjectID initUndoID): + DeleteLayerWorldUndoAction(std::unique_ptr initLayerData, uint32_t newPos, WorldUndoManager::UndoObjectID initParentUndoID, WorldUndoManager::UndoObjectID initUndoID): layerData(std::move(initLayerData)), pos(newPos), parentUndoID(initParentUndoID), undoID(initUndoID) {} std::string get_name() const override { - return layerData.folderData ? "Delete Layer Folder" : "Delete Layer"; + return "Delete Layer Item"; } bool undo(WorldUndoManager& undoMan) override { std::optional toInsertParentID = undoMan.get_netid_from_undoid(parentUndoID); @@ -457,8 +461,9 @@ void DrawingProgramLayerManagerGUI::remove_layer(const NetworkingObjects::NetObj return false; auto& layerList = undoMan.world.netObjMan.get_obj_temporary_ref_from_id(toInsertParentID.value())->get_folder().folderList; - auto insertedIt = layerList->emplace_direct(layerList, layerList->at(pos), undoMan.world, layerData); + auto insertedIt = layerList->emplace_direct(layerList, layerList->at(pos), undoMan.world, *layerData); undoMan.register_new_netid_to_existing_undoid(undoID, insertedIt->obj.get_net_id()); + layerData = nullptr; return true; } bool redo(WorldUndoManager& undoMan) override { @@ -470,15 +475,18 @@ void DrawingProgramLayerManagerGUI::remove_layer(const NetworkingObjects::NetObj return false; auto& layerList = undoMan.world.netObjMan.get_obj_temporary_ref_from_id(toEraseParentID.value())->get_folder().folderList; - layerList->erase(layerList, layerList->get(toEraseID.value())); + auto it = layerList->get(toEraseID.value()); + layerData = std::make_unique(it->obj->get_undo_data(undoMan)); + layerList->erase(layerList, it); return true; } void scale_up(const WorldScalar& scaleAmount) override { - layerData.scale_up(scaleAmount); + if(layerData) + layerData->scale_up(scaleAmount); } ~DeleteLayerWorldUndoAction() {} - DrawingProgramLayerListItemUndoData layerData; + std::unique_ptr layerData; uint32_t pos; WorldUndoManager::UndoObjectID parentUndoID; WorldUndoManager::UndoObjectID undoID; @@ -486,7 +494,7 @@ void DrawingProgramLayerManagerGUI::remove_layer(const NetworkingObjects::NetObj auto& folderList = world.netObjMan.get_obj_temporary_ref_from_id(parentID)->get_folder().folderList; auto it = folderList->get(objectID); - world.undo.push(std::make_unique(it->obj->get_undo_data(world.undo), it->pos, world.undo.get_undoid_from_netid(parentID), world.undo.get_undoid_from_netid(objectID))); + world.undo.push(std::make_unique(std::make_unique(it->obj->get_undo_data(world.undo)), it->pos, world.undo.get_undoid_from_netid(parentID), world.undo.get_undoid_from_netid(objectID))); folderList->erase(folderList, it); } @@ -494,34 +502,32 @@ void DrawingProgramLayerManagerGUI::editing_layer_check() { auto& world = layerMan.drawP.world; class EditLayerWorldUndoAction : public WorldUndoAction { public: - EditLayerWorldUndoAction(const DrawingProgramLayerListItemMetaInfo& initDataOld, const DrawingProgramLayerListItemMetaInfo& initDataNew, WorldUndoManager::UndoObjectID initUndoID): - dataOld(initDataOld), - dataNew(initDataNew), + EditLayerWorldUndoAction(std::unique_ptr initData, WorldUndoManager::UndoObjectID initUndoID): + data(std::move(initData)), undoID(initUndoID) {} std::string get_name() const override { return "Edit Layer"; } bool undo(WorldUndoManager& undoMan) override { - std::optional toModifyID = undoMan.get_netid_from_undoid(undoID); - if(!toModifyID.has_value()) - return false; - auto objPtr = undoMan.world.netObjMan.get_obj_temporary_ref_from_id(toModifyID.value()); - objPtr->set_metainfo(undoMan.world.drawProg.layerMan, dataOld); - return true; + return undo_redo(undoMan); } bool redo(WorldUndoManager& undoMan) override { + return undo_redo(undoMan); + } + bool undo_redo(WorldUndoManager& undoMan) { std::optional toModifyID = undoMan.get_netid_from_undoid(undoID); if(!toModifyID.has_value()) return false; auto objPtr = undoMan.world.netObjMan.get_obj_temporary_ref_from_id(toModifyID.value()); - objPtr->set_metainfo(undoMan.world.drawProg.layerMan, dataNew); + auto newData = std::make_unique(objPtr->get_metainfo()); + objPtr->set_metainfo(undoMan.world.drawProg.layerMan, *data); + data = std::move(newData); return true; } ~EditLayerWorldUndoAction() {} - DrawingProgramLayerListItemMetaInfo dataOld; - DrawingProgramLayerListItemMetaInfo dataNew; + std::unique_ptr data; WorldUndoManager::UndoObjectID undoID; }; @@ -531,7 +537,7 @@ void DrawingProgramLayerManagerGUI::editing_layer_check() { if(tempPtr) { const DrawingProgramLayerListItemMetaInfo& currentMetaData = tempPtr->get_metainfo(); if(currentMetaData != editingData.value()) - world.undo.push(std::make_unique(editingData.value(), currentMetaData, world.undo.get_undoid_from_netid(oldNetObjID))); + world.undo.push(std::make_unique(std::make_unique(editingData.value()), world.undo.get_undoid_from_netid(oldNetObjID))); } } editingData = std::nullopt; diff --git a/src/DrawingProgram/Tools/EditTool.cpp b/src/DrawingProgram/Tools/EditTool.cpp index 9542418..c2ad763 100644 --- a/src/DrawingProgram/Tools/EditTool.cpp +++ b/src/DrawingProgram/Tools/EditTool.cpp @@ -69,18 +69,12 @@ void EditTool::switch_tool(DrawingProgramToolType newTool) { 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()); - std::unique_ptr newData = objPtr->get_comp().get_data_copy(); - objPtr->get_comp().set_data_from(*data); - data = std::move(newData); - objPtr->commit_update(undoMan.world.drawProg); - objPtr->send_comp_update(undoMan.world.drawProg, true); - return true; + return undo_redo(undoMan); } bool redo(WorldUndoManager& undoMan) override { + return undo_redo(undoMan); + } + bool undo_redo(WorldUndoManager& undoMan) { std::optional toEditID = undoMan.get_netid_from_undoid(undoID); if(!toEditID.has_value()) return false; diff --git a/src/GridManager.cpp b/src/GridManager.cpp index 773e7d9..8572c57 100644 --- a/src/GridManager.cpp +++ b/src/GridManager.cpp @@ -22,8 +22,8 @@ void GridManager::add_default_grid(const std::string& newName) { class AddGridWorldUndoAction : public WorldUndoAction { public: - AddGridWorldUndoAction(const WorldGrid& initGridData, uint32_t newPos, WorldUndoManager::UndoObjectID initUndoID): - gridData(initGridData), + AddGridWorldUndoAction(std::unique_ptr initGridData, uint32_t newPos, WorldUndoManager::UndoObjectID initUndoID): + gridData(std::move(initGridData)), pos(newPos), undoID(initUndoID) {} @@ -35,7 +35,9 @@ void GridManager::add_default_grid(const std::string& newName) { if(!toEraseID.has_value()) return false; auto& gridList = undoMan.world.gridMan.grids; - gridList->erase(gridList, gridList->get(toEraseID.value())); + auto it = gridList->get(toEraseID.value()); + gridData = std::make_unique(*it->obj); + gridList->erase(gridList, it); return true; } bool redo(WorldUndoManager& undoMan) override { @@ -43,21 +45,23 @@ void GridManager::add_default_grid(const std::string& newName) { if(toInsertID.has_value()) return false; auto& gridList = undoMan.world.gridMan.grids; - auto insertedIt = gridList->emplace_direct(gridList, gridList->at(pos), gridData); + auto insertedIt = gridList->emplace_direct(gridList, gridList->at(pos), *gridData); undoMan.register_new_netid_to_existing_undoid(undoID, insertedIt->obj.get_net_id()); + gridData = nullptr; return true; } void scale_up(const WorldScalar& scaleAmount) override { - gridData.scale_up(scaleAmount); + if(gridData) + gridData->scale_up(scaleAmount); } ~AddGridWorldUndoAction() {} - WorldGrid gridData; + std::unique_ptr gridData; uint32_t pos; WorldUndoManager::UndoObjectID undoID; }; - world.undo.push(std::make_unique(g, it->pos, world.undo.get_undoid_from_netid(it->obj.get_net_id()))); + world.undo.push(std::make_unique(std::make_unique(*it->obj), it->pos, world.undo.get_undoid_from_netid(it->obj.get_net_id()))); } } @@ -65,8 +69,8 @@ void GridManager::remove_grid(uint32_t indexToRemove) { if(grids) { class DeleteGridWorldUndoAction : public WorldUndoAction { public: - DeleteGridWorldUndoAction(const WorldGrid& initGridData, uint32_t newPos, WorldUndoManager::UndoObjectID initUndoID): - gridData(initGridData), + DeleteGridWorldUndoAction(std::unique_ptr initGridData, uint32_t newPos, WorldUndoManager::UndoObjectID initUndoID): + gridData(std::move(initGridData)), pos(newPos), undoID(initUndoID) {} @@ -78,8 +82,9 @@ void GridManager::remove_grid(uint32_t indexToRemove) { if(toInsertID.has_value()) return false; auto& gridList = undoMan.world.gridMan.grids; - auto insertedIt = gridList->emplace_direct(gridList, gridList->at(pos), gridData); + auto insertedIt = gridList->emplace_direct(gridList, gridList->at(pos), *gridData); undoMan.register_new_netid_to_existing_undoid(undoID, insertedIt->obj.get_net_id()); + gridData = nullptr; return true; } bool redo(WorldUndoManager& undoMan) override { @@ -87,21 +92,24 @@ void GridManager::remove_grid(uint32_t indexToRemove) { if(!toEraseID.has_value()) return false; auto& gridList = undoMan.world.gridMan.grids; - gridList->erase(gridList, gridList->get(toEraseID.value())); + auto it = gridList->get(toEraseID.value()); + gridData = std::make_unique(*it->obj); + gridList->erase(gridList, it); return true; } void scale_up(const WorldScalar& scaleAmount) override { - gridData.scale_up(scaleAmount); + if(gridData) + gridData->scale_up(scaleAmount); } ~DeleteGridWorldUndoAction() {} - WorldGrid gridData; + std::unique_ptr gridData; uint32_t pos; WorldUndoManager::UndoObjectID undoID; }; auto it = grids->at(indexToRemove); - world.undo.push(std::make_unique(*it->obj, it->pos, world.undo.get_undoid_from_netid(it->obj.get_net_id()))); + world.undo.push(std::make_unique(std::make_unique(*it->obj), it->pos, world.undo.get_undoid_from_netid(it->obj.get_net_id()))); grids->erase(grids, it); } } @@ -109,44 +117,40 @@ void GridManager::remove_grid(uint32_t indexToRemove) { void GridManager::finalize_grid_modify(const NetworkingObjects::NetObjTemporaryPtr& wGrid, const WorldGrid& oldGridData) { class EditGridWorldUndoAction : public WorldUndoAction { public: - EditGridWorldUndoAction(const WorldGrid& initGridDataOld, const WorldGrid& initGridDataNew, WorldUndoManager::UndoObjectID initUndoID): - gridDataOld(initGridDataOld), - gridDataNew(initGridDataNew), + EditGridWorldUndoAction(std::unique_ptr initGridData, WorldUndoManager::UndoObjectID initUndoID): + gridData(std::move(initGridData)), undoID(initUndoID) {} std::string get_name() const override { return "Edit Grid"; } bool undo(WorldUndoManager& undoMan) override { - std::optional toEditID = undoMan.get_netid_from_undoid(undoID); - if(!toEditID.has_value()) - return false; - auto gridPtr = undoMan.world.netObjMan.get_obj_temporary_ref_from_id(toEditID.value()); - *gridPtr = gridDataOld; - undoMan.world.delayedUpdateObjectManager.send_update_to_all(gridPtr, true); - return true; + return undo_redo(undoMan); } bool redo(WorldUndoManager& undoMan) override { + return undo_redo(undoMan); + } + bool undo_redo(WorldUndoManager& undoMan) { std::optional toEditID = undoMan.get_netid_from_undoid(undoID); if(!toEditID.has_value()) return false; auto gridPtr = undoMan.world.netObjMan.get_obj_temporary_ref_from_id(toEditID.value()); - *gridPtr = gridDataNew; + auto newGrid = std::make_unique(*gridPtr); + *gridPtr = *gridData; + gridData = std::move(newGrid); undoMan.world.delayedUpdateObjectManager.send_update_to_all(gridPtr, true); return true; } void scale_up(const WorldScalar& scaleAmount) override { - gridDataOld.scale_up(scaleAmount); - gridDataNew.scale_up(scaleAmount); + gridData->scale_up(scaleAmount); } ~EditGridWorldUndoAction() {} - WorldGrid gridDataOld; - WorldGrid gridDataNew; + std::unique_ptr gridData; WorldUndoManager::UndoObjectID undoID; }; - world.undo.push(std::make_unique(oldGridData, *wGrid, world.undo.get_undoid_from_netid(wGrid.get_net_id()))); + world.undo.push(std::make_unique(std::make_unique(oldGridData), world.undo.get_undoid_from_netid(wGrid.get_net_id()))); world.delayedUpdateObjectManager.send_update_to_all(wGrid, true); }