diff --git a/src/Bookmarks/BookmarkListItem.cpp b/src/Bookmarks/BookmarkListItem.cpp index f202b22..001b7e8 100644 --- a/src/Bookmarks/BookmarkListItem.cpp +++ b/src/Bookmarks/BookmarkListItem.cpp @@ -65,6 +65,22 @@ BookmarkCompleteUndoData BookmarkListItem::get_complete_undo_data(WorldUndoManag return toRet; } +void BookmarkListItem::set_list_callbacks(World& w) { + if(folderData) { + folderData->folderList->set_insert_callback([&](auto&) { + w.set_to_layout_gui_if_focus(); + }); + folderData->folderList->set_erase_callback([&](auto&) { + w.set_to_layout_gui_if_focus(); + }); + folderData->folderList->set_move_callback([&](auto&, uint32_t) { + w.set_to_layout_gui_if_focus(); + }); + for(auto& listItem : *folderData->folderList) + listItem.obj->set_list_callbacks(w); + } +} + void BookmarkListItem::reassign_netobj_ids_call() { if(folderData) folderData->folderList.reassign_ids(); @@ -136,7 +152,11 @@ void BookmarkListItem::register_class(World& w) { .readUpdateFuncServer = nullptr }); NetworkingObjects::register_ordered_list_class(w.netObjMan); - w.delayedUpdateObjectManager.register_class(w.netObjMan); + w.delayedUpdateObjectManager.register_class(w.netObjMan, NetworkingObjects::DelayUpdateSerializedClassManager::CustomConstructors{ + .postUpdateFunc = [&](NameData& o) { + w.set_to_layout_gui_if_focus(); + } + }); } void BookmarkListItem::write_constructor_data(const NetObjTemporaryPtr& o, cereal::PortableBinaryOutputArchive& a) { diff --git a/src/Bookmarks/BookmarkListItem.hpp b/src/Bookmarks/BookmarkListItem.hpp index b88491f..3353371 100644 --- a/src/Bookmarks/BookmarkListItem.hpp +++ b/src/Bookmarks/BookmarkListItem.hpp @@ -32,6 +32,7 @@ class BookmarkListItem { BookmarkListItem(); BookmarkListItem(World& w, const BookmarkCompleteUndoData& undoData); BookmarkListItem(NetworkingObjects::NetObjManager& netObjMan, const std::string& initName, bool isFolder, const BookmarkData& initBookmarkData); + void set_list_callbacks(World& w); bool is_folder() const; const BookmarkData& get_bookmark_data() const; const NetworkingObjects::NetObjOwnerPtr>& get_folder_list() const; diff --git a/src/Bookmarks/BookmarkManager.cpp b/src/Bookmarks/BookmarkManager.cpp index a8b2151..eb3904c 100644 --- a/src/Bookmarks/BookmarkManager.cpp +++ b/src/Bookmarks/BookmarkManager.cpp @@ -18,6 +18,12 @@ BookmarkManager::BookmarkManager(World& w): void BookmarkManager::server_init_no_file() { bookmarkListRoot = world.netObjMan.make_obj_from_ptr(new BookmarkListItem(world.netObjMan, "ROOT", true, {})); + bookmarkListRoot->set_list_callbacks(world); // Only need to call set_component_list_callbacks on root, and the rest will get the callbacks set as well +} + +void BookmarkManager::read_create_message(cereal::PortableBinaryInputArchive& a) { + bookmarkListRoot = world.netObjMan.read_create_message(a, nullptr); + bookmarkListRoot->set_list_callbacks(world); } void BookmarkManager::refresh_gui_data() { @@ -517,6 +523,7 @@ void BookmarkManager::load_file(cereal::PortableBinaryInputArchive& a, VersionNu if(version >= VersionNumber(0, 4, 0)) { bookmarkListRoot = world.netObjMan.make_obj_from_ptr(new BookmarkListItem()); bookmarkListRoot->load_file(a, version, *this); + bookmarkListRoot->set_list_callbacks(world); // Only need to call set_component_list_callbacks on root, and the rest will get the callbacks set as well } else { server_init_no_file(); diff --git a/src/Bookmarks/BookmarkManager.hpp b/src/Bookmarks/BookmarkManager.hpp index bb3f30d..a8b4bb8 100644 --- a/src/Bookmarks/BookmarkManager.hpp +++ b/src/Bookmarks/BookmarkManager.hpp @@ -12,6 +12,7 @@ class BookmarkManager { public: BookmarkManager(World& w); void server_init_no_file(); + void read_create_message(cereal::PortableBinaryInputArchive& a); void scale_up(const WorldScalar& scaleUpAmount); void setup_list_gui(); void refresh_gui_data(); diff --git a/src/CanvasTheme.cpp b/src/CanvasTheme.cpp index 52874cf..8b0f4d4 100644 --- a/src/CanvasTheme.cpp +++ b/src/CanvasTheme.cpp @@ -68,6 +68,7 @@ void CanvasTheme::set_tool_front_color(DrawingProgram& drawP) { else toolFrontColor = SkColor4f{1.0f, 1.0f, 1.0f, 1.0f}; drawP.drawCache.clear_own_cached_surfaces(); + world.set_to_layout_gui_if_focus(); } void CanvasTheme::register_class() { diff --git a/src/DrawingProgram/DrawingProgram.cpp b/src/DrawingProgram/DrawingProgram.cpp index ef28773..ae5d778 100644 --- a/src/DrawingProgram/DrawingProgram.cpp +++ b/src/DrawingProgram/DrawingProgram.cpp @@ -323,6 +323,7 @@ void DrawingProgram::process_transform_message(const std::vectorcoords = coords; objPtr->commit_transform(*this); } + world.set_to_layout_gui_if_focus(); } void DrawingProgram::send_transforms_for(const std::vector& objsToSendTransformsFor) { diff --git a/src/DrawingProgram/Layers/DrawingProgramLayerFolder.cpp b/src/DrawingProgram/Layers/DrawingProgramLayerFolder.cpp index 43b6203..037ef98 100644 --- a/src/DrawingProgram/Layers/DrawingProgramLayerFolder.cpp +++ b/src/DrawingProgram/Layers/DrawingProgramLayerFolder.cpp @@ -15,13 +15,16 @@ void DrawingProgramLayerFolder::set_component_list_callbacks(DrawingProgramLayer folderList->set_insert_callback([&](auto& c) { layerMan.drawP.drawCache.clear_own_cached_surfaces(); c->obj->set_component_list_callbacks(layerMan); + layerMan.drawP.world.set_to_layout_gui_if_focus(); }); folderList->set_erase_callback([&](auto& c) { layerMan.drawP.drawCache.clear_own_cached_surfaces(); c->obj->set_to_erase(); + layerMan.drawP.world.set_to_layout_gui_if_focus(); }); folderList->set_move_callback([&](auto& c, uint32_t oldPos) { layerMan.drawP.drawCache.clear_own_cached_surfaces(); + layerMan.drawP.world.set_to_layout_gui_if_focus(); }); for(auto& listItem : *folderList) listItem.obj->set_component_list_callbacks(layerMan); diff --git a/src/DrawingProgram/Layers/DrawingProgramLayerListItem.cpp b/src/DrawingProgram/Layers/DrawingProgramLayerListItem.cpp index e5adf17..12b147e 100644 --- a/src/DrawingProgram/Layers/DrawingProgramLayerListItem.cpp +++ b/src/DrawingProgram/Layers/DrawingProgramLayerListItem.cpp @@ -287,10 +287,15 @@ void DrawingProgramLayerListItem::register_class(World& w) { .readConstructorFuncServer = read_constructor_func, .readUpdateFuncServer = nullptr, }); - w.delayedUpdateObjectManager.register_class(w.netObjMan); + w.delayedUpdateObjectManager.register_class(w.netObjMan, NetworkingObjects::DelayUpdateSerializedClassManager::CustomConstructors{ + .postUpdateFunc = [&](NameData& o) { + w.set_to_layout_gui_if_focus(); + } + }); w.delayedUpdateObjectManager.register_class(w.netObjMan, NetworkingObjects::DelayUpdateSerializedClassManager::CustomConstructors{ .postUpdateFunc = [&](DisplayData& o) { w.drawProg.drawCache.clear_own_cached_surfaces(); + w.set_to_layout_gui_if_focus(); } }); } diff --git a/src/GridManager.cpp b/src/GridManager.cpp index 8572c57..e3f3952 100644 --- a/src/GridManager.cpp +++ b/src/GridManager.cpp @@ -9,6 +9,18 @@ GridManager::GridManager(World& w): void GridManager::server_init_no_file() { grids = world.netObjMan.make_obj>(); + set_grid_list_callbacks(); +} + +void GridManager::read_create_message(cereal::PortableBinaryInputArchive& a) { + grids = world.netObjMan.read_create_message>(a, nullptr); + set_grid_list_callbacks(); +} + +void GridManager::set_grid_list_callbacks() { + grids->set_insert_callback([&](auto&) { world.set_to_layout_gui_if_focus(); }); + grids->set_erase_callback([&](auto&) { world.set_to_layout_gui_if_focus(); }); + grids->set_move_callback([&](auto&, uint32_t) { world.set_to_layout_gui_if_focus(); }); } void GridManager::add_default_grid(const std::string& newName) { @@ -207,7 +219,7 @@ void GridManager::save_file(cereal::PortableBinaryOutputArchive& a) const { } void GridManager::load_file(cereal::PortableBinaryInputArchive& a, VersionNumber version) { - grids = world.netObjMan.make_obj>(); + server_init_no_file(); if(version >= VersionNumber(0, 4, 0)) { uint32_t gridSize; a(gridSize); diff --git a/src/GridManager.hpp b/src/GridManager.hpp index 691eded..71f6dfe 100644 --- a/src/GridManager.hpp +++ b/src/GridManager.hpp @@ -1,5 +1,6 @@ #pragma once #include "WorldGrid.hpp" +#include "cereal/archives/portable_binary.hpp" #include #include @@ -9,6 +10,8 @@ class GridManager { public: GridManager(World& w); void server_init_no_file(); + void read_create_message(cereal::PortableBinaryInputArchive& a); + void set_grid_list_callbacks(); void add_default_grid(const std::string& newName); diff --git a/src/MainProgram.cpp b/src/MainProgram.cpp index 61f2ec0..9e02a75 100755 --- a/src/MainProgram.cpp +++ b/src/MainProgram.cpp @@ -63,7 +63,6 @@ MainProgram::MainProgram(): Logger::get().add_log("CHAT", [&](const std::string& text) { *logFile << "[CHAT] " << text << std::endl; std::cout << "[CHAT] " << text << std::endl; - g.gui.set_to_layout(); }); } diff --git a/src/ResourceManager.cpp b/src/ResourceManager.cpp index d0c214d..ed154a5 100644 --- a/src/ResourceManager.cpp +++ b/src/ResourceManager.cpp @@ -13,6 +13,7 @@ #include "ResourceDisplay/FileResourceDisplay.hpp" #include #include +#include "MainProgram.hpp" ResourceManager::ResourceManager(World& initWorld): world(initWorld) @@ -25,6 +26,7 @@ void ResourceManager::init_client_callbacks() { // There is a scenario where the resource id and data messages can be sent twice for the same resource (a resource can be sent early before CLIENT_INITIAL_DATA is sent, and then resent with CLIENT_INITIAL_DATA), so check if resource already exists, and only keep track of the ID if the resource doesn't exist yet if(!world.netObjMan.get_obj_temporary_ref_from_id(idBeingRetrieved)) resourcesBeingRetrieved.emplace(idBeingRetrieved, std::weak_ptr()); + world.main.g.gui.set_to_layout(); }); world.netClient->add_recv_callback(SERVER_NEW_RESOURCE_DATA, [&](cereal::PortableBinaryInputArchive& message) { if(!resourcesBeingRetrieved.empty()) { // If the resource was sent for the second time, this will be empty, so we can ignore the message @@ -33,6 +35,7 @@ void ResourceManager::init_client_callbacks() { resourceList.emplace_back(world.netObjMan.make_obj_direct_with_specific_id(resourcesBeingRetrieved.begin()->first, newResource)); resourcesBeingRetrieved.clear(); } + world.main.g.gui.set_to_layout(); }); } diff --git a/src/World.cpp b/src/World.cpp index c66be7e..b4e8ac2 100644 --- a/src/World.cpp +++ b/src/World.cpp @@ -137,8 +137,8 @@ void World::init_client(const std::string& serverFullID) { NetworkingObjects::NetObjID clientDataObjID; message(fileDisplayName, clientDataObjID); set_name(fileDisplayName); - bMan.bookmarkListRoot = netObjMan.read_create_message(message, nullptr); - gridMan.grids = netObjMan.read_create_message>(message, nullptr); + bMan.read_create_message(message); + gridMan.read_create_message(message); drawProg.read_components_client(message); canvasTheme.read_create_message(message); clients = netObjMan.read_create_message>(message, nullptr); @@ -151,15 +151,13 @@ void World::init_client(const std::string& serverFullID) { #endif clientStillConnecting = false; - drawProg.world.main.g.gui.set_to_layout(); + set_to_layout_gui_if_focus(); }); netClient->add_recv_callback(CLIENT_UPDATE_NETWORK_OBJECT, [&](cereal::PortableBinaryInputArchive& message) { netObjMan.read_update_message(message, nullptr); - drawProg.world.main.g.gui.set_to_layout(); }); netClient->add_recv_callback(CLIENT_UPDATE_MANY_NETWORK_OBJECTS, [&](cereal::PortableBinaryInputArchive& message) { netObjMan.read_many_update_message(message, nullptr); - drawProg.world.main.g.gui.set_to_layout(); }); netClient->add_recv_callback(CLIENT_KEEP_ALIVE, [&](cereal::PortableBinaryInputArchive& message) { }); @@ -228,6 +226,11 @@ bool World::is_focus() { return main.world.get() == this; } +void World::set_to_layout_gui_if_focus() { + if(is_focus()) + main.g.gui.set_to_layout(); +} + void World::undo_with_checks() { if(!clientStillConnecting && !drawProg.prevent_undo_or_redo()) undo.undo(); @@ -349,6 +352,7 @@ void World::add_chat_message(const std::string& name, const std::string& message chatMessages.emplace_front(Toolbar::ChatMessage{name, message, type}); if(chatMessages.size() == CHAT_SIZE) chatMessages.pop_back(); + set_to_layout_gui_if_focus(); } void World::early_destroy() { diff --git a/src/World.hpp b/src/World.hpp index 4147f47..797689b 100644 --- a/src/World.hpp +++ b/src/World.hpp @@ -82,6 +82,7 @@ class World { bool should_ask_before_closing(); void set_has_unsaved_local_changes(bool newHasUnsavedLocalChangesVal); bool is_focus(); + void set_to_layout_gui_if_focus(); NetworkingObjects::DelayUpdateSerializedClassManager delayedUpdateObjectManager; diff --git a/src/WorldGrid.cpp b/src/WorldGrid.cpp index ca70d88..ffdf10a 100644 --- a/src/WorldGrid.cpp +++ b/src/WorldGrid.cpp @@ -179,6 +179,7 @@ void WorldGrid::register_class(World& w) { auto readWorldGrid = [&](WorldGrid& o, cereal::PortableBinaryInputArchive& a, const std::shared_ptr& c) { a(o); canvas_scale_up_check(o, w, c); + w.set_to_layout_gui_if_focus(); }; w.delayedUpdateObjectManager.register_class(w.netObjMan, NetworkingObjects::DelayUpdateSerializedClassManager::CustomConstructors{ .readConstructor = readWorldGrid,