#include "DrawingProgramLayerListItem.hpp" #include "DrawingProgramLayerFolder.hpp" #include #include "DrawingProgramLayer.hpp" #include "../../World.hpp" #include "SerializedBlendMode.hpp" using namespace NetworkingObjects; DrawingProgramLayerListItem::DrawingProgramLayerListItem() {} DrawingProgramLayerListItem::DrawingProgramLayerListItem(NetworkingObjects::NetObjManager& netObjMan, const std::string& initName, bool isFolder) { if(isFolder) { folderData = std::make_unique(); folderData->folderList = netObjMan.make_obj>(); } else { layerData = std::make_unique(); layerData->components = netObjMan.make_obj(); } nameData = netObjMan.make_obj(); nameData->name = initName; displayData = netObjMan.make_obj(); } void DrawingProgramLayerListItem::reassign_netobj_ids_call() { if(folderData) folderData->folderList.reassign_ids(); else layerData->components.reassign_ids(); nameData.reassign_ids(); displayData.reassign_ids(); } void DrawingProgramLayerListItem::set_component_list_callbacks(DrawingProgramLayerManager &layerMan) { if(folderData) folderData->set_component_list_callbacks(layerMan); else layerData->set_component_list_callbacks(*this, layerMan); } void DrawingProgramLayerListItem::commit_update_dont_invalidate_cache(DrawingProgramLayerManager& layerMan) { if(folderData) folderData->commit_update_dont_invalidate_cache(layerMan); else layerData->commit_update_dont_invalidate_cache(layerMan); } void DrawingProgramLayerListItem::get_flattened_component_list(std::vector& objList) const { if(folderData) folderData->get_flattened_component_list(objList); else layerData->get_flattened_component_list(objList); } void DrawingProgramLayerListItem::get_flattened_layer_list(std::vector& objList) { if(folderData) { for(auto& c : folderData->folderList->get_data()) c->obj->get_flattened_layer_list(objList); } else objList.emplace_back(this); } uint32_t DrawingProgramLayerListItem::get_component_count() const { if(folderData) { uint32_t toRet = 0; for(auto& c : folderData->folderList->get_data()) toRet += c->obj->get_component_count(); return toRet; } else return layerData->components->size(); } bool DrawingProgramLayerListItem::is_folder() const { return folderData != nullptr; } DrawingProgramLayerFolder& DrawingProgramLayerListItem::get_folder() const { return *folderData; } DrawingProgramLayer& DrawingProgramLayerListItem::get_layer() const { return *layerData; } void DrawingProgramLayerListItem::draw(SkCanvas* canvas, const DrawData& drawData) const { if(displayData->visible) { SkPaint layerPaint; layerPaint.setAlphaf(displayData->alpha); layerPaint.setBlendMode(serialized_blend_mode_to_sk_blend_mode(displayData->blendMode)); canvas->saveLayer(nullptr, &layerPaint); if(folderData) folderData->draw(canvas, drawData); else layerData->draw(canvas, drawData); canvas->restore(); } } void DrawingProgramLayerListItem::set_name(NetworkingObjects::DelayUpdateSerializedClassManager& delayedNetObjMan, const std::string& newName) const { if(nameData && nameData->name != newName) { nameData->name = newName; delayedNetObjMan.send_update_to_all(nameData, false); } } const std::string& DrawingProgramLayerListItem::get_name() const { return nameData->name; } void DrawingProgramLayerListItem::set_alpha(DrawingProgramLayerManager& layerMan, float newAlpha) const { if(displayData && displayData->alpha != newAlpha) { displayData->alpha = newAlpha; layerMan.drawP.drawCache.clear_own_cached_surfaces(); layerMan.drawP.world.delayedUpdateObjectManager.send_update_to_all(displayData, false); } } float DrawingProgramLayerListItem::get_alpha() const { return displayData->alpha; } void DrawingProgramLayerListItem::set_visible(DrawingProgramLayerManager& layerMan, bool newVisible) const { if(displayData && displayData->visible != newVisible) { displayData->visible = newVisible; layerMan.drawP.drawCache.clear_own_cached_surfaces(); layerMan.drawP.world.delayedUpdateObjectManager.send_update_to_all(displayData, false); } } bool DrawingProgramLayerListItem::get_visible() const { return displayData->visible; } void DrawingProgramLayerListItem::set_blend_mode(DrawingProgramLayerManager& layerMan, SerializedBlendMode newBlendMode) const { if(displayData && displayData->blendMode != newBlendMode) { displayData->blendMode = newBlendMode; layerMan.drawP.drawCache.clear_own_cached_surfaces(); layerMan.drawP.world.delayedUpdateObjectManager.send_update_to_all(displayData, false); } } SerializedBlendMode DrawingProgramLayerListItem::get_blend_mode() const { return displayData->blendMode; } void DrawingProgramLayerListItem::register_class(World& w) { w.netObjMan.register_class({ .writeConstructorFuncClient = write_constructor_func, .readConstructorFuncClient = read_constructor_func, .readUpdateFuncClient = nullptr, .writeConstructorFuncServer = write_constructor_func, .readConstructorFuncServer = read_constructor_func, .readUpdateFuncServer = nullptr, }); w.delayedUpdateObjectManager.register_class(w.netObjMan); w.delayedUpdateObjectManager.register_class(w.netObjMan, NetworkingObjects::DelayUpdateSerializedClassManager::CustomConstructors{ .postUpdateFunc = [&](DisplayData& o) { w.drawProg.drawCache.clear_own_cached_surfaces(); } }); } void DrawingProgramLayerListItem::write_constructor_func(const NetworkingObjects::NetObjTemporaryPtr& o, cereal::PortableBinaryOutputArchive& a) { a(o->is_folder()); if(o->is_folder()) o->folderData->folderList.write_create_message(a); else o->layerData->components.write_create_message(a); o->nameData.write_create_message(a); o->displayData.write_create_message(a); } void DrawingProgramLayerListItem::read_constructor_func(const NetworkingObjects::NetObjTemporaryPtr& o, cereal::PortableBinaryInputArchive& a, const std::shared_ptr& c) { bool isFolder; a(isFolder); if(isFolder) { o->folderData = std::make_unique(); o->folderData->folderList = o.get_obj_man()->read_create_message>(a, c); } else { o->layerData = std::make_unique(); o->layerData->components = o.get_obj_man()->read_create_message(a, c); } o->nameData = o.get_obj_man()->read_create_message(a, c); o->displayData = o.get_obj_man()->read_create_message(a, c); }