Some network messages relayout GUI

This commit is contained in:
Yousef Khadadeh 2026-04-09 12:00:36 +03:00
parent 4aa810fe43
commit 99c2657434
15 changed files with 71 additions and 9 deletions

View file

@ -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<BookmarkListItem>(w.netObjMan);
w.delayedUpdateObjectManager.register_class<NameData>(w.netObjMan);
w.delayedUpdateObjectManager.register_class<NameData>(w.netObjMan, NetworkingObjects::DelayUpdateSerializedClassManager::CustomConstructors<NameData>{
.postUpdateFunc = [&](NameData& o) {
w.set_to_layout_gui_if_focus();
}
});
}
void BookmarkListItem::write_constructor_data(const NetObjTemporaryPtr<BookmarkListItem>& o, cereal::PortableBinaryOutputArchive& a) {

View file

@ -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<NetworkingObjects::NetObjOrderedList<BookmarkListItem>>& get_folder_list() const;

View file

@ -18,6 +18,12 @@ BookmarkManager::BookmarkManager(World& w):
void BookmarkManager::server_init_no_file() {
bookmarkListRoot = world.netObjMan.make_obj_from_ptr<BookmarkListItem>(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<BookmarkListItem>(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<BookmarkListItem>(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();

View file

@ -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();

View file

@ -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() {

View file

@ -323,6 +323,7 @@ void DrawingProgram::process_transform_message(const std::vector<std::pair<Netwo
objPtr->coords = coords;
objPtr->commit_transform(*this);
}
world.set_to_layout_gui_if_focus();
}
void DrawingProgram::send_transforms_for(const std::vector<CanvasComponentContainer::ObjInfo*>& objsToSendTransformsFor) {

View file

@ -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);

View file

@ -287,10 +287,15 @@ void DrawingProgramLayerListItem::register_class(World& w) {
.readConstructorFuncServer = read_constructor_func,
.readUpdateFuncServer = nullptr,
});
w.delayedUpdateObjectManager.register_class<NameData>(w.netObjMan);
w.delayedUpdateObjectManager.register_class<NameData>(w.netObjMan, NetworkingObjects::DelayUpdateSerializedClassManager::CustomConstructors<NameData>{
.postUpdateFunc = [&](NameData& o) {
w.set_to_layout_gui_if_focus();
}
});
w.delayedUpdateObjectManager.register_class<DisplayData>(w.netObjMan, NetworkingObjects::DelayUpdateSerializedClassManager::CustomConstructors<DisplayData>{
.postUpdateFunc = [&](DisplayData& o) {
w.drawProg.drawCache.clear_own_cached_surfaces();
w.set_to_layout_gui_if_focus();
}
});
}

View file

@ -9,6 +9,18 @@ GridManager::GridManager(World& w):
void GridManager::server_init_no_file() {
grids = world.netObjMan.make_obj<NetworkingObjects::NetObjOrderedList<WorldGrid>>();
set_grid_list_callbacks();
}
void GridManager::read_create_message(cereal::PortableBinaryInputArchive& a) {
grids = world.netObjMan.read_create_message<NetworkingObjects::NetObjOrderedList<WorldGrid>>(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<NetworkingObjects::NetObjOrderedList<WorldGrid>>();
server_init_no_file();
if(version >= VersionNumber(0, 4, 0)) {
uint32_t gridSize;
a(gridSize);

View file

@ -1,5 +1,6 @@
#pragma once
#include "WorldGrid.hpp"
#include "cereal/archives/portable_binary.hpp"
#include <Helpers/NetworkingObjects/NetObjOrderedList.hpp>
#include <Helpers/NetworkingObjects/NetObjOwnerPtr.hpp>
@ -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);

View file

@ -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();
});
}

View file

@ -13,6 +13,7 @@
#include "ResourceDisplay/FileResourceDisplay.hpp"
#include <cereal/archives/portable_binary.hpp>
#include <cereal/types/unordered_map.hpp>
#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<ResourceData>(idBeingRetrieved))
resourcesBeingRetrieved.emplace(idBeingRetrieved, std::weak_ptr<NetServer::ClientData>());
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<ResourceData>(resourcesBeingRetrieved.begin()->first, newResource));
resourcesBeingRetrieved.clear();
}
world.main.g.gui.set_to_layout();
});
}

View file

@ -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<BookmarkListItem>(message, nullptr);
gridMan.grids = netObjMan.read_create_message<NetworkingObjects::NetObjOrderedList<WorldGrid>>(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<NetworkingObjects::NetObjUnorderedSet<ClientData>>(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() {

View file

@ -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;

View file

@ -179,6 +179,7 @@ void WorldGrid::register_class(World& w) {
auto readWorldGrid = [&](WorldGrid& o, cereal::PortableBinaryInputArchive& a, const std::shared_ptr<NetServer::ClientData>& c) {
a(o);
canvas_scale_up_check(o, w, c);
w.set_to_layout_gui_if_focus();
};
w.delayedUpdateObjectManager.register_class<WorldGrid>(w.netObjMan, NetworkingObjects::DelayUpdateSerializedClassManager::CustomConstructors<WorldGrid>{
.readConstructor = readWorldGrid,