From 18c7dab0ffe6947e5da1904b97c841a6a2ad4b7a Mon Sep 17 00:00:00 2001 From: Yousef Khadadeh Date: Sat, 3 Jan 2026 21:23:56 +0300 Subject: [PATCH] Added redo action to bookmark move --- .../Helpers/NetworkingObjects/NetObjID.hpp | 2 +- src/Bookmarks/BookmarkManager.cpp | 48 ++++++++++++++++++- 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/include/Helpers/NetworkingObjects/NetObjID.hpp b/include/Helpers/NetworkingObjects/NetObjID.hpp index d021d87..c649da6 100644 --- a/include/Helpers/NetworkingObjects/NetObjID.hpp +++ b/include/Helpers/NetworkingObjects/NetObjID.hpp @@ -10,7 +10,7 @@ namespace NetworkingObjects { template void serialize(Archive& a) { a(data[1], data[0]); } - std::string to_string() { + std::string to_string() const { std::stringstream ss; ss << "[" << data[1] << ", " << data[0] << "]"; return ss.str(); diff --git a/src/Bookmarks/BookmarkManager.cpp b/src/Bookmarks/BookmarkManager.cpp index 7aaaa4c..a241520 100644 --- a/src/Bookmarks/BookmarkManager.cpp +++ b/src/Bookmarks/BookmarkManager.cpp @@ -214,7 +214,53 @@ void BookmarkManager::setup_list_gui(const std::string& id) { return true; } bool redo(WorldUndoManager& undoMan) override { - return false; + std::unordered_map> toEraseMap; + NetObjTemporaryPtr> listPtr; + std::vector objsToInsert; + + { + for(auto& [undoID, indexUndoIDListPair] : undoEraseMap) { + std::optional netID = undoMan.get_netid_from_undoid(undoID); + if(!netID.has_value()) + return false; + if(!undoMan.fill_netid_list_from_undoid_list(toEraseMap[netID.value()], indexUndoIDListPair.second)) + return false; + } + } + + { + std::optional netID = undoMan.get_netid_from_undoid(insertParentUndoID); + if(!netID.has_value()) + return false; + listPtr = undoMan.world.netObjMan.get_obj_temporary_ref_from_id(netID.value())->get_folder_list(); + } + + { + if(!undoMan.fill_netid_list_from_undoid_list(objsToInsert, insertedUndoIDs)) + return false; + } + + undoMan.world.netObjMan.send_multi_update_messsage([&]() { + std::vector> toInsertObjPtrs; + + for(auto& [listToEraseFrom, setToErase] : toEraseMap) { + auto& listToEraseFromPtr = undoMan.world.netObjMan.get_obj_temporary_ref_from_id(listToEraseFrom)->get_folder_list(); + listToEraseFromPtr->erase_list(listToEraseFromPtr, listToEraseFromPtr->get_list(setToErase), &toInsertObjPtrs); + } + + std::vector, NetObjOwnerPtr>> toInsert; + auto insertIt = listPtr->at(insertPosition); + for(uint32_t i = 0; i < objsToInsert.size(); i++) { + auto it = std::find_if(toInsertObjPtrs.begin(), toInsertObjPtrs.end(), [id = objsToInsert[i]](NetObjOwnerPtr& objPtr) { + return objPtr.get_net_id() == id; + }); + toInsert.emplace_back(insertIt, std::move(*it)); + toInsert.back().second.reassign_ids(); + } + listPtr->insert_ordered_list_and_send_create(listPtr, toInsert); + }, NetObjManager::SendUpdateType::SEND_TO_ALL, nullptr); + + return true; } ~MoveBookmarksWorldUndoAction() {}