Decreased memory usage taken by undo actions
This commit is contained in:
parent
aa9bb19fd5
commit
a9c7278102
5 changed files with 114 additions and 98 deletions
|
|
@ -346,14 +346,13 @@ std::pair<NetworkingObjects::NetObjID, NetworkingObjects::NetObjOrderedListItera
|
|||
NetworkingObjects::NetObjOrderedListIterator<BookmarkListItem> 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<NetworkingObjects::NetObjID> toEraseParentID = undoMan.get_netid_from_undoid(parentUndoID);
|
||||
|
|
@ -364,7 +363,9 @@ NetworkingObjects::NetObjOrderedListIterator<BookmarkListItem> BookmarkManager::
|
|||
return false;
|
||||
|
||||
auto& bookmarkList = undoMan.world.netObjMan.get_obj_temporary_ref_from_id<BookmarkListItem>(toEraseParentID.value())->get_folder_list();
|
||||
bookmarkList->erase(bookmarkList, bookmarkList->get(toEraseID.value()));
|
||||
auto it = bookmarkList->get(toEraseID.value());
|
||||
bookmarkData = std::make_unique<BookmarkCompleteUndoData>(it->obj->get_complete_undo_data(undoMan));
|
||||
bookmarkList->erase(bookmarkList, it);
|
||||
return true;
|
||||
}
|
||||
bool redo(WorldUndoManager& undoMan) override {
|
||||
|
|
@ -376,16 +377,18 @@ NetworkingObjects::NetObjOrderedListIterator<BookmarkListItem> BookmarkManager::
|
|||
return false;
|
||||
|
||||
auto& bookmarkList = undoMan.world.netObjMan.get_obj_temporary_ref_from_id<BookmarkListItem>(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<BookmarkCompleteUndoData> bookmarkData;
|
||||
uint32_t pos;
|
||||
WorldUndoManager::UndoObjectID parentUndoID;
|
||||
WorldUndoManager::UndoObjectID undoID;
|
||||
|
|
@ -393,21 +396,21 @@ NetworkingObjects::NetObjOrderedListIterator<BookmarkListItem> BookmarkManager::
|
|||
|
||||
auto insertedBookmarkPair = create_in_proper_position(newItem);
|
||||
auto& it = insertedBookmarkPair.second;
|
||||
world.undo.push(std::make_unique<AddBookmarkWorldUndoAction>(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<AddBookmarkWorldUndoAction>(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<BookmarkCompleteUndoData> 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<NetworkingObjects::NetObjID> 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<BookmarkListItem>(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<BookmarkListItem>(toEraseParentID.value())->get_folder_list();
|
||||
bookmarkList->erase(bookmarkList, bookmarkList->get(toEraseID.value()));
|
||||
auto it = bookmarkList->get(toEraseID.value());
|
||||
bookmarkData = std::make_unique<BookmarkCompleteUndoData>(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<BookmarkCompleteUndoData> 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<BookmarkListItem>(parentID)->get_folder_list();
|
||||
auto it = folderList->get(objectID);
|
||||
world.undo.push(std::make_unique<DeleteBookmarkWorldUndoAction>(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<DeleteBookmarkWorldUndoAction>(std::make_unique<BookmarkCompleteUndoData>(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<NetworkingObjects::NetObjID> toModifyID = undoMan.get_netid_from_undoid(undoID);
|
||||
if(!toModifyID.has_value())
|
||||
return false;
|
||||
auto objPtr = undoMan.world.netObjMan.get_obj_temporary_ref_from_id<BookmarkListItem>(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<NetworkingObjects::NetObjID> toModifyID = undoMan.get_netid_from_undoid(undoID);
|
||||
if(!toModifyID.has_value())
|
||||
return false;
|
||||
auto objPtr = undoMan.world.netObjMan.get_obj_temporary_ref_from_id<BookmarkListItem>(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<EditBookmarkWorldUndoAction>(editingBookmarkName.value(), currentNameData, world.undo.get_undoid_from_netid(oldNetObjID)));
|
||||
world.undo.push(std::make_unique<EditBookmarkWorldUndoAction>(editingBookmarkName.value(), world.undo.get_undoid_from_netid(oldNetObjID)));
|
||||
}
|
||||
}
|
||||
editingBookmarkName = std::nullopt;
|
||||
|
|
|
|||
|
|
@ -185,10 +185,12 @@ void DrawingProgramLayerManager::add_undo_place_component(CanvasComponentContain
|
|||
auto compList = undoMan.world.netObjMan.get_obj_temporary_ref_from_id<NetObjOrderedList<CanvasComponentContainer>>(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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -384,14 +384,14 @@ NetworkingObjects::NetObjOrderedListIterator<DrawingProgramLayerListItem> 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<DrawingProgramLayerListItemUndoData> 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<NetworkingObjects::NetObjID> toEraseParentID = undoMan.get_netid_from_undoid(parentUndoID);
|
||||
|
|
@ -402,7 +402,9 @@ NetworkingObjects::NetObjOrderedListIterator<DrawingProgramLayerListItem> Drawin
|
|||
return false;
|
||||
|
||||
auto& layerList = undoMan.world.netObjMan.get_obj_temporary_ref_from_id<DrawingProgramLayerListItem>(toEraseParentID.value())->get_folder().folderList;
|
||||
layerList->erase(layerList, layerList->get(toEraseID.value()));
|
||||
auto it = layerList->get(toEraseID.value());
|
||||
layerData = std::make_unique<DrawingProgramLayerListItemUndoData>(it->obj->get_undo_data(undoMan));
|
||||
layerList->erase(layerList, it);
|
||||
return true;
|
||||
}
|
||||
bool redo(WorldUndoManager& undoMan) override {
|
||||
|
|
@ -414,16 +416,18 @@ NetworkingObjects::NetObjOrderedListIterator<DrawingProgramLayerListItem> Drawin
|
|||
return false;
|
||||
|
||||
auto& layerList = undoMan.world.netObjMan.get_obj_temporary_ref_from_id<DrawingProgramLayerListItem>(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<DrawingProgramLayerListItemUndoData> layerData;
|
||||
uint32_t pos;
|
||||
WorldUndoManager::UndoObjectID parentUndoID;
|
||||
WorldUndoManager::UndoObjectID undoID;
|
||||
|
|
@ -431,7 +435,7 @@ NetworkingObjects::NetObjOrderedListIterator<DrawingProgramLayerListItem> Drawin
|
|||
|
||||
auto insertedLayerPair = create_in_proper_position(newItem);
|
||||
auto& it = insertedLayerPair.second;
|
||||
world.undo.push(std::make_unique<AddLayerWorldUndoAction>(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<AddLayerWorldUndoAction>(std::make_unique<DrawingProgramLayerListItemUndoData>(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<DrawingProgramLayerListItemUndoData> 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<NetworkingObjects::NetObjID> 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<DrawingProgramLayerListItem>(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<DrawingProgramLayerListItem>(toEraseParentID.value())->get_folder().folderList;
|
||||
layerList->erase(layerList, layerList->get(toEraseID.value()));
|
||||
auto it = layerList->get(toEraseID.value());
|
||||
layerData = std::make_unique<DrawingProgramLayerListItemUndoData>(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<DrawingProgramLayerListItemUndoData> 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<DrawingProgramLayerListItem>(parentID)->get_folder().folderList;
|
||||
auto it = folderList->get(objectID);
|
||||
world.undo.push(std::make_unique<DeleteLayerWorldUndoAction>(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<DeleteLayerWorldUndoAction>(std::make_unique<DrawingProgramLayerListItemUndoData>(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<DrawingProgramLayerListItemMetaInfo> 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<NetworkingObjects::NetObjID> toModifyID = undoMan.get_netid_from_undoid(undoID);
|
||||
if(!toModifyID.has_value())
|
||||
return false;
|
||||
auto objPtr = undoMan.world.netObjMan.get_obj_temporary_ref_from_id<DrawingProgramLayerListItem>(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<NetworkingObjects::NetObjID> toModifyID = undoMan.get_netid_from_undoid(undoID);
|
||||
if(!toModifyID.has_value())
|
||||
return false;
|
||||
auto objPtr = undoMan.world.netObjMan.get_obj_temporary_ref_from_id<DrawingProgramLayerListItem>(toModifyID.value());
|
||||
objPtr->set_metainfo(undoMan.world.drawProg.layerMan, dataNew);
|
||||
auto newData = std::make_unique<DrawingProgramLayerListItemMetaInfo>(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<DrawingProgramLayerListItemMetaInfo> 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<EditLayerWorldUndoAction>(editingData.value(), currentMetaData, world.undo.get_undoid_from_netid(oldNetObjID)));
|
||||
world.undo.push(std::make_unique<EditLayerWorldUndoAction>(std::make_unique<DrawingProgramLayerListItemMetaInfo>(editingData.value()), world.undo.get_undoid_from_netid(oldNetObjID)));
|
||||
}
|
||||
}
|
||||
editingData = std::nullopt;
|
||||
|
|
|
|||
|
|
@ -69,18 +69,12 @@ void EditTool::switch_tool(DrawingProgramToolType newTool) {
|
|||
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());
|
||||
std::unique_ptr<CanvasComponent> 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<NetworkingObjects::NetObjID> toEditID = undoMan.get_netid_from_undoid(undoID);
|
||||
if(!toEditID.has_value())
|
||||
return false;
|
||||
|
|
|
|||
|
|
@ -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<WorldGrid> 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<WorldGrid>(*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<WorldGrid> gridData;
|
||||
uint32_t pos;
|
||||
WorldUndoManager::UndoObjectID undoID;
|
||||
};
|
||||
|
||||
world.undo.push(std::make_unique<AddGridWorldUndoAction>(g, it->pos, world.undo.get_undoid_from_netid(it->obj.get_net_id())));
|
||||
world.undo.push(std::make_unique<AddGridWorldUndoAction>(std::make_unique<WorldGrid>(*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<WorldGrid> 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<WorldGrid>(*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<WorldGrid> gridData;
|
||||
uint32_t pos;
|
||||
WorldUndoManager::UndoObjectID undoID;
|
||||
};
|
||||
|
||||
auto it = grids->at(indexToRemove);
|
||||
world.undo.push(std::make_unique<DeleteGridWorldUndoAction>(*it->obj, it->pos, world.undo.get_undoid_from_netid(it->obj.get_net_id())));
|
||||
world.undo.push(std::make_unique<DeleteGridWorldUndoAction>(std::make_unique<WorldGrid>(*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<WorldGrid>& 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<WorldGrid> 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<NetworkingObjects::NetObjID> toEditID = undoMan.get_netid_from_undoid(undoID);
|
||||
if(!toEditID.has_value())
|
||||
return false;
|
||||
auto gridPtr = undoMan.world.netObjMan.get_obj_temporary_ref_from_id<WorldGrid>(toEditID.value());
|
||||
*gridPtr = gridDataOld;
|
||||
undoMan.world.delayedUpdateObjectManager.send_update_to_all<WorldGrid>(gridPtr, true);
|
||||
return true;
|
||||
return undo_redo(undoMan);
|
||||
}
|
||||
bool redo(WorldUndoManager& undoMan) override {
|
||||
return undo_redo(undoMan);
|
||||
}
|
||||
bool undo_redo(WorldUndoManager& undoMan) {
|
||||
std::optional<NetworkingObjects::NetObjID> toEditID = undoMan.get_netid_from_undoid(undoID);
|
||||
if(!toEditID.has_value())
|
||||
return false;
|
||||
auto gridPtr = undoMan.world.netObjMan.get_obj_temporary_ref_from_id<WorldGrid>(toEditID.value());
|
||||
*gridPtr = gridDataNew;
|
||||
auto newGrid = std::make_unique<WorldGrid>(*gridPtr);
|
||||
*gridPtr = *gridData;
|
||||
gridData = std::move(newGrid);
|
||||
undoMan.world.delayedUpdateObjectManager.send_update_to_all<WorldGrid>(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<WorldGrid> gridData;
|
||||
WorldUndoManager::UndoObjectID undoID;
|
||||
};
|
||||
|
||||
world.undo.push(std::make_unique<EditGridWorldUndoAction>(oldGridData, *wGrid, world.undo.get_undoid_from_netid(wGrid.get_net_id())));
|
||||
world.undo.push(std::make_unique<EditGridWorldUndoAction>(std::make_unique<WorldGrid>(oldGridData), world.undo.get_undoid_from_netid(wGrid.get_net_id())));
|
||||
world.delayedUpdateObjectManager.send_update_to_all<WorldGrid>(wGrid, true);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue