2025-12-25 17:18:28 +03:00
# include "DrawingProgramLayerManager.hpp"
# include "../../World.hpp"
2025-12-30 19:46:08 +03:00
# include "Helpers/NetworkingObjects/NetObjOrderedList.hpp"
2025-12-25 17:18:28 +03:00
DrawingProgramLayerManager : : DrawingProgramLayerManager ( DrawingProgram & drawProg ) :
drawP ( drawProg ) , // initialize drawP first for next objects to be initialized properly
listGUI ( * this )
{ }
void DrawingProgramLayerManager : : init ( ) {
2025-12-26 10:10:19 +03:00
if ( drawP . world . netObjMan . is_server ( ) ) {
2025-12-25 17:18:28 +03:00
layerTreeRoot = drawP . world . netObjMan . make_obj_from_ptr < DrawingProgramLayerListItem > ( new DrawingProgramLayerListItem ( drawP . world . netObjMan , " ROOT " , true ) ) ;
2025-12-26 10:10:19 +03:00
layerTreeRoot - > get_folder ( ) . set_component_list_callbacks ( * this ) ; // Only need to call set_component_list_callbacks on root, and the rest will get the callbacks set as well
editingLayer = layerTreeRoot - > get_folder ( ) . folderList - > emplace_back_direct ( layerTreeRoot - > get_folder ( ) . folderList , drawP . world . netObjMan , " First Layer " , false ) - > obj ;
}
2025-12-25 17:18:28 +03:00
}
void DrawingProgramLayerManager : : write_components_server ( cereal : : PortableBinaryOutputArchive & a ) {
layerTreeRoot . write_create_message ( a ) ;
}
void DrawingProgramLayerManager : : read_components_client ( cereal : : PortableBinaryInputArchive & a ) {
layerTreeRoot = drawP . world . netObjMan . read_create_message < DrawingProgramLayerListItem > ( a , nullptr ) ;
2025-12-26 10:10:19 +03:00
layerTreeRoot - > commit_update_dont_invalidate_cache ( * this ) ;
layerTreeRoot - > set_component_list_callbacks ( * this ) ;
}
bool DrawingProgramLayerManager : : is_a_layer_being_edited ( ) {
return ! editingLayer . expired ( ) ;
}
2025-12-29 19:57:36 +03:00
uint32_t DrawingProgramLayerManager : : edited_layer_component_count ( ) {
return editingLayer . lock ( ) - > get_layer ( ) . components - > size ( ) ;
}
2025-12-30 19:46:08 +03:00
CanvasComponentContainer : : ObjInfoIterator DrawingProgramLayerManager : : get_edited_layer_end_iterator ( ) {
return editingLayer . lock ( ) - > get_layer ( ) . components - > end ( ) ;
}
2025-12-26 10:10:19 +03:00
void DrawingProgramLayerManager : : draw ( SkCanvas * canvas , const DrawData & drawData ) {
if ( layerTreeRoot )
layerTreeRoot - > draw ( canvas , drawData ) ;
2025-12-25 17:18:28 +03:00
}
2025-12-26 19:52:36 +03:00
2025-12-30 19:46:08 +03:00
std : : vector < CanvasComponentContainer : : ObjInfo * > DrawingProgramLayerManager : : get_flattened_component_list ( ) const {
std : : vector < CanvasComponentContainer : : ObjInfo * > toRet ;
2025-12-26 19:52:36 +03:00
layerTreeRoot - > get_flattened_component_list ( toRet ) ;
return toRet ;
}
2025-12-28 17:34:33 +03:00
2025-12-29 19:57:36 +03:00
std : : vector < DrawingProgramLayerListItem * > DrawingProgramLayerManager : : get_flattened_layer_list ( ) {
std : : vector < DrawingProgramLayerListItem * > toRet ;
layerTreeRoot - > get_flattened_layer_list ( toRet ) ;
return toRet ;
}
2025-12-28 17:34:33 +03:00
bool DrawingProgramLayerManager : : layer_tree_root_exists ( ) {
return layerTreeRoot ;
}
const DrawingProgramLayerListItem & DrawingProgramLayerManager : : get_layer_root ( ) {
return * layerTreeRoot ;
}
2025-12-30 19:46:08 +03:00
bool DrawingProgramLayerManager : : component_passes_layer_selector ( CanvasComponentContainer : : ObjInfo * c , LayerSelector layerSelector ) {
2025-12-28 17:34:33 +03:00
switch ( layerSelector ) {
case LayerSelector : : ALL_VISIBLE_LAYERS :
return c - > obj - > parentLayer - > get_visible ( ) ;
case LayerSelector : : LAYER_BEING_EDITED :
return is_a_layer_being_edited ( ) & & c - > obj - > parentLayer = = editingLayer . lock ( ) . get ( ) ;
}
return false ;
}
2025-12-29 19:57:36 +03:00
2025-12-30 19:46:08 +03:00
std : : vector < CanvasComponentContainer : : ObjInfoIterator > DrawingProgramLayerManager : : add_many_components_to_layer_being_edited ( const std : : vector < std : : pair < CanvasComponentContainer : : ObjInfoIterator , CanvasComponentContainer * > > & newObjs ) {
2025-12-29 19:57:36 +03:00
auto editLayerPtr = editingLayer . lock ( ) ;
if ( ! editLayerPtr )
return { } ;
return editLayerPtr - > get_layer ( ) . components - > insert_ordered_list_and_send_create ( editLayerPtr - > get_layer ( ) . components , newObjs ) ;
}
2025-12-30 19:46:08 +03:00
CanvasComponentContainer : : ObjInfo * DrawingProgramLayerManager : : add_component_to_layer_being_edited ( CanvasComponentContainer * newObj ) {
2025-12-29 19:57:36 +03:00
auto editLayerPtr = editingLayer . lock ( ) ;
if ( ! editLayerPtr )
return nullptr ;
2025-12-30 19:46:08 +03:00
return & ( * editLayerPtr - > get_layer ( ) . components - > push_back_and_send_create ( editLayerPtr - > get_layer ( ) . components , newObj ) ) ;
2025-12-29 19:57:36 +03:00
}