2025-12-24 12:42:27 +03:00
|
|
|
#include "DrawingProgramLayerListItem.hpp"
|
|
|
|
|
#include "DrawingProgramLayerFolder.hpp"
|
|
|
|
|
#include <cereal/types/string.hpp>
|
|
|
|
|
#include "DrawingProgramLayer.hpp"
|
|
|
|
|
#include "../../World.hpp"
|
2025-12-25 19:37:41 +03:00
|
|
|
#include "SerializedBlendMode.hpp"
|
2025-12-24 12:42:27 +03:00
|
|
|
|
|
|
|
|
using namespace NetworkingObjects;
|
|
|
|
|
|
|
|
|
|
DrawingProgramLayerListItem::DrawingProgramLayerListItem() {}
|
|
|
|
|
|
|
|
|
|
DrawingProgramLayerListItem::DrawingProgramLayerListItem(NetworkingObjects::NetObjManager& netObjMan, const std::string& initName, bool isFolder) {
|
|
|
|
|
if(isFolder) {
|
|
|
|
|
folderData = std::make_unique<DrawingProgramLayerFolder>();
|
|
|
|
|
folderData->folderList = netObjMan.make_obj<NetworkingObjects::NetObjOrderedList<DrawingProgramLayerListItem>>();
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
layerData = std::make_unique<DrawingProgramLayer>();
|
|
|
|
|
layerData->components = netObjMan.make_obj<CanvasComponentContainer::NetList>();
|
|
|
|
|
}
|
|
|
|
|
nameData = netObjMan.make_obj<NameData>();
|
|
|
|
|
nameData->name = initName;
|
|
|
|
|
displayData = netObjMan.make_obj<DisplayData>();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DrawingProgramLayerListItem::reassign_netobj_ids_call() {
|
|
|
|
|
if(folderData)
|
|
|
|
|
folderData->folderList.reassign_ids();
|
|
|
|
|
else
|
|
|
|
|
layerData->components.reassign_ids();
|
|
|
|
|
nameData.reassign_ids();
|
|
|
|
|
displayData.reassign_ids();
|
|
|
|
|
}
|
|
|
|
|
|
2025-12-30 21:18:59 +03:00
|
|
|
void DrawingProgramLayerListItem::set_to_erase() {
|
|
|
|
|
if(folderData)
|
|
|
|
|
folderData->set_to_erase();
|
|
|
|
|
else
|
|
|
|
|
layerData->set_to_erase();
|
|
|
|
|
}
|
|
|
|
|
|
2025-12-26 10:10:19 +03:00
|
|
|
void DrawingProgramLayerListItem::set_component_list_callbacks(DrawingProgramLayerManager &layerMan) {
|
|
|
|
|
if(folderData)
|
|
|
|
|
folderData->set_component_list_callbacks(layerMan);
|
|
|
|
|
else
|
2025-12-28 17:34:33 +03:00
|
|
|
layerData->set_component_list_callbacks(*this, layerMan);
|
2025-12-26 10:10:19 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
|
2025-12-30 19:46:08 +03:00
|
|
|
void DrawingProgramLayerListItem::get_flattened_component_list(std::vector<CanvasComponentContainer::ObjInfo*>& objList) const {
|
2025-12-26 19:52:36 +03:00
|
|
|
if(folderData)
|
|
|
|
|
folderData->get_flattened_component_list(objList);
|
|
|
|
|
else
|
|
|
|
|
layerData->get_flattened_component_list(objList);
|
|
|
|
|
}
|
|
|
|
|
|
2025-12-29 19:57:36 +03:00
|
|
|
void DrawingProgramLayerListItem::get_flattened_layer_list(std::vector<DrawingProgramLayerListItem*>& objList) {
|
|
|
|
|
if(folderData) {
|
2025-12-30 19:46:08 +03:00
|
|
|
for(auto& c : *folderData->folderList)
|
|
|
|
|
c.obj->get_flattened_layer_list(objList);
|
2025-12-29 19:57:36 +03:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
objList.emplace_back(this);
|
|
|
|
|
}
|
|
|
|
|
|
2025-12-29 20:11:24 +03:00
|
|
|
uint32_t DrawingProgramLayerListItem::get_component_count() const {
|
|
|
|
|
if(folderData) {
|
|
|
|
|
uint32_t toRet = 0;
|
2025-12-30 19:46:08 +03:00
|
|
|
for(auto& c : *folderData->folderList)
|
|
|
|
|
toRet += c.obj->get_component_count();
|
2025-12-29 20:11:24 +03:00
|
|
|
return toRet;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
return layerData->components->size();
|
|
|
|
|
}
|
|
|
|
|
|
2025-12-31 16:30:56 +03:00
|
|
|
void DrawingProgramLayerListItem::scale_up(const WorldScalar& scaleUpAmount) {
|
|
|
|
|
if(folderData)
|
|
|
|
|
folderData->scale_up(scaleUpAmount);
|
|
|
|
|
else
|
|
|
|
|
layerData->scale_up(scaleUpAmount);
|
|
|
|
|
}
|
|
|
|
|
|
2025-12-24 12:42:27 +03:00
|
|
|
bool DrawingProgramLayerListItem::is_folder() const {
|
|
|
|
|
return folderData != nullptr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
DrawingProgramLayerFolder& DrawingProgramLayerListItem::get_folder() const {
|
|
|
|
|
return *folderData;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
DrawingProgramLayer& DrawingProgramLayerListItem::get_layer() const {
|
|
|
|
|
return *layerData;
|
|
|
|
|
}
|
|
|
|
|
|
2025-12-25 17:18:28 +03:00
|
|
|
void DrawingProgramLayerListItem::draw(SkCanvas* canvas, const DrawData& drawData) const {
|
|
|
|
|
if(displayData->visible) {
|
2025-12-25 19:37:41 +03:00
|
|
|
SkPaint layerPaint;
|
|
|
|
|
layerPaint.setAlphaf(displayData->alpha);
|
|
|
|
|
layerPaint.setBlendMode(serialized_blend_mode_to_sk_blend_mode(displayData->blendMode));
|
|
|
|
|
canvas->saveLayer(nullptr, &layerPaint);
|
2025-12-25 17:18:28 +03:00
|
|
|
if(folderData)
|
|
|
|
|
folderData->draw(canvas, drawData);
|
|
|
|
|
else
|
|
|
|
|
layerData->draw(canvas, drawData);
|
|
|
|
|
canvas->restore();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-12-24 12:42:27 +03:00
|
|
|
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>(nameData, false);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const std::string& DrawingProgramLayerListItem::get_name() const {
|
|
|
|
|
return nameData->name;
|
|
|
|
|
}
|
|
|
|
|
|
2025-12-28 17:34:33 +03:00
|
|
|
void DrawingProgramLayerListItem::set_alpha(DrawingProgramLayerManager& layerMan, float newAlpha) const {
|
2025-12-24 12:42:27 +03:00
|
|
|
if(displayData && displayData->alpha != newAlpha) {
|
|
|
|
|
displayData->alpha = newAlpha;
|
2025-12-29 15:04:32 +03:00
|
|
|
layerMan.drawP.drawCache.clear_own_cached_surfaces();
|
2025-12-28 17:34:33 +03:00
|
|
|
layerMan.drawP.world.delayedUpdateObjectManager.send_update_to_all<DisplayData>(displayData, false);
|
2025-12-24 12:42:27 +03:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
float DrawingProgramLayerListItem::get_alpha() const {
|
|
|
|
|
return displayData->alpha;
|
|
|
|
|
}
|
|
|
|
|
|
2025-12-28 17:34:33 +03:00
|
|
|
void DrawingProgramLayerListItem::set_visible(DrawingProgramLayerManager& layerMan, bool newVisible) const {
|
2025-12-24 12:42:27 +03:00
|
|
|
if(displayData && displayData->visible != newVisible) {
|
|
|
|
|
displayData->visible = newVisible;
|
2025-12-29 15:04:32 +03:00
|
|
|
layerMan.drawP.drawCache.clear_own_cached_surfaces();
|
2025-12-28 17:34:33 +03:00
|
|
|
layerMan.drawP.world.delayedUpdateObjectManager.send_update_to_all<DisplayData>(displayData, false);
|
2025-12-24 12:42:27 +03:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool DrawingProgramLayerListItem::get_visible() const {
|
|
|
|
|
return displayData->visible;
|
|
|
|
|
}
|
|
|
|
|
|
2025-12-28 17:34:33 +03:00
|
|
|
void DrawingProgramLayerListItem::set_blend_mode(DrawingProgramLayerManager& layerMan, SerializedBlendMode newBlendMode) const {
|
2025-12-25 19:37:41 +03:00
|
|
|
if(displayData && displayData->blendMode != newBlendMode) {
|
|
|
|
|
displayData->blendMode = newBlendMode;
|
2025-12-29 15:04:32 +03:00
|
|
|
layerMan.drawP.drawCache.clear_own_cached_surfaces();
|
2025-12-28 17:34:33 +03:00
|
|
|
layerMan.drawP.world.delayedUpdateObjectManager.send_update_to_all<DisplayData>(displayData, false);
|
2025-12-25 19:37:41 +03:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SerializedBlendMode DrawingProgramLayerListItem::get_blend_mode() const {
|
|
|
|
|
return displayData->blendMode;
|
|
|
|
|
}
|
|
|
|
|
|
2025-12-24 12:42:27 +03:00
|
|
|
void DrawingProgramLayerListItem::register_class(World& w) {
|
|
|
|
|
w.netObjMan.register_class<DrawingProgramLayerListItem, DrawingProgramLayerListItem, DrawingProgramLayerListItem, DrawingProgramLayerListItem>({
|
|
|
|
|
.writeConstructorFuncClient = write_constructor_func,
|
|
|
|
|
.readConstructorFuncClient = read_constructor_func,
|
|
|
|
|
.readUpdateFuncClient = nullptr,
|
|
|
|
|
.writeConstructorFuncServer = write_constructor_func,
|
|
|
|
|
.readConstructorFuncServer = read_constructor_func,
|
|
|
|
|
.readUpdateFuncServer = nullptr,
|
|
|
|
|
});
|
|
|
|
|
w.delayedUpdateObjectManager.register_class<NameData>(w.netObjMan);
|
2025-12-28 17:34:33 +03:00
|
|
|
w.delayedUpdateObjectManager.register_class<DisplayData>(w.netObjMan, NetworkingObjects::DelayUpdateSerializedClassManager::CustomConstructors<DisplayData>{
|
|
|
|
|
.postUpdateFunc = [&](DisplayData& o) {
|
2025-12-29 15:04:32 +03:00
|
|
|
w.drawProg.drawCache.clear_own_cached_surfaces();
|
2025-12-28 17:34:33 +03:00
|
|
|
}
|
|
|
|
|
});
|
2025-12-24 12:42:27 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DrawingProgramLayerListItem::write_constructor_func(const NetworkingObjects::NetObjTemporaryPtr<DrawingProgramLayerListItem>& 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<DrawingProgramLayerListItem>& o, cereal::PortableBinaryInputArchive& a, const std::shared_ptr<NetServer::ClientData>& c) {
|
|
|
|
|
bool isFolder;
|
|
|
|
|
a(isFolder);
|
|
|
|
|
if(isFolder) {
|
|
|
|
|
o->folderData = std::make_unique<DrawingProgramLayerFolder>();
|
|
|
|
|
o->folderData->folderList = o.get_obj_man()->read_create_message<NetworkingObjects::NetObjOrderedList<DrawingProgramLayerListItem>>(a, c);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
o->layerData = std::make_unique<DrawingProgramLayer>();
|
|
|
|
|
o->layerData->components = o.get_obj_man()->read_create_message<CanvasComponentContainer::NetList>(a, c);
|
|
|
|
|
}
|
|
|
|
|
o->nameData = o.get_obj_man()->read_create_message<NameData>(a, c);
|
|
|
|
|
o->displayData = o.get_obj_man()->read_create_message<DisplayData>(a, c);
|
|
|
|
|
}
|