infinipaint/src/DrawingProgram/Layers/DrawingProgramLayerFolder.cpp

82 lines
3.1 KiB
C++
Raw Normal View History

2025-12-25 17:18:28 +03:00
#include "DrawingProgramLayerFolder.hpp"
#include "DrawingProgramLayerListItem.hpp"
2025-12-26 10:10:19 +03:00
#include "DrawingProgramLayer.hpp"
#include <Helpers/Parallel.hpp>
2026-01-01 22:46:02 +03:00
#include "DrawingProgramLayerManager.hpp"
#include "../DrawingProgram.hpp"
#include "../../World.hpp"
2025-12-25 17:18:28 +03:00
void DrawingProgramLayerFolder::draw(SkCanvas* canvas, const DrawData& drawData) const {
for(auto& p : (*folderList) | std::views::reverse)
p.obj->draw(canvas, drawData);
2025-12-25 17:18:28 +03:00
}
2025-12-26 10:10:19 +03:00
2025-12-30 21:18:59 +03:00
void DrawingProgramLayerFolder::set_component_list_callbacks(DrawingProgramLayerManager& layerMan) {
2025-12-26 10:10:19 +03:00
folderList->set_insert_callback([&](auto& c) {
layerMan.drawP.drawCache.clear_own_cached_surfaces();
2025-12-26 10:10:19 +03:00
c->obj->set_component_list_callbacks(layerMan);
});
2025-12-30 21:18:59 +03:00
folderList->set_erase_callback([&](auto& c) {
layerMan.drawP.drawCache.clear_own_cached_surfaces();
2025-12-30 21:18:59 +03:00
c->obj->set_to_erase();
});
folderList->set_move_callback([&](auto& c, uint32_t oldPos) {
layerMan.drawP.drawCache.clear_own_cached_surfaces();
});
for(auto& listItem : *folderList)
listItem.obj->set_component_list_callbacks(layerMan);
2025-12-26 10:10:19 +03:00
}
2025-12-30 21:18:59 +03:00
void DrawingProgramLayerFolder::set_to_erase() {
for(auto& listItem : *folderList)
listItem.obj->set_to_erase();
}
void DrawingProgramLayerFolder::get_flattened_component_list(std::vector<CanvasComponentContainer::ObjInfo*>& objList) const {
for(auto& listItem : (*folderList) | std::views::reverse)
listItem.obj->get_flattened_component_list(objList);
}
NetworkingObjects::NetObjWeakPtr<DrawingProgramLayerListItem> DrawingProgramLayerFolder::get_initial_editing_layer() const {
// BFS, select a layer that's closest to root as possible
for(auto& c : *folderList) {
if(!c.obj->is_folder())
return c.obj;
}
for(auto& c : *folderList) {
if(c.obj->is_folder()) {
NetworkingObjects::NetObjWeakPtr<DrawingProgramLayerListItem> toRet = c.obj->get_folder().get_initial_editing_layer();
if(!toRet.expired())
return toRet;
}
}
return {};
}
2025-12-31 16:30:56 +03:00
void DrawingProgramLayerFolder::scale_up(const WorldScalar& scaleUpAmount) {
for(auto& p : *folderList)
p.obj->scale_up(scaleUpAmount);
}
2026-01-01 22:46:02 +03:00
void DrawingProgramLayerFolder::load_file(cereal::PortableBinaryInputArchive& a, VersionNumber version, DrawingProgramLayerManager& layerMan) {
folderList = layerMan.drawP.world.netObjMan.make_obj<NetworkingObjects::NetObjOrderedList<DrawingProgramLayerListItem>>();
uint32_t folderListSize;
a(folderListSize);
for(uint32_t i = 0; i < folderListSize; i++) {
DrawingProgramLayerListItem* item = new DrawingProgramLayerListItem();
item->load_file(a, version, layerMan);
folderList->push_back_and_send_create(folderList, item);
}
}
void DrawingProgramLayerFolder::save_file(cereal::PortableBinaryOutputArchive& a) const {
a(folderList->size());
for(auto& listItem : *folderList)
listItem.obj->save_file(a);
}
2026-01-01 23:28:26 +03:00
void DrawingProgramLayerFolder::get_used_resources(std::unordered_set<NetworkingObjects::NetObjID>& resourceSet) const {
for(auto& listItem : *folderList)
listItem.obj->get_used_resources(resourceSet);
}