SDOM - Simple SDL Document Object Model
A lightweight, extensible Document Object Model for SDL-based applications.
Loading...
Searching...
No Matches
SDOM_Factory.hpp
Go to the documentation of this file.
1#pragma once
2// #include <SDOM/SDOM.hpp>
3// #include <SDOM/SDOM_IDisplayObject.hpp>
4// #include <SDOM/SDOM_DisplayHandle.hpp>
5// #include <SDOM/SDOM_IAssetObject.hpp>
6// #include <SDOM/SDOM_AssetHandle.hpp>
7
8#include <string>
9#include <memory>
10#include <functional>
11#include <unordered_map>
12#include <vector>
13#include <sol/sol.hpp>
14
15// include the concrete interface headers so unique_ptr<T> is instantiated with a complete type
16// #include <SDOM/SDOM_IDataObject.hpp>
17#include <SDOM/SDOM_IDisplayObject.hpp> // required for std::unique_ptr<IDisplayObject>
18#include <SDOM/SDOM_IAssetObject.hpp> // required for std::unique_ptr<IAssetObject>
19
20
21namespace SDOM
22{
23 class Stage;
24 class IDisplayObject;
25 class DisplayHandle;
26 class IAssetObject;
27 class AssetHandle;
28
29 // --- Type Creation Structs --- //
31 {
32 std::function<std::unique_ptr<IDisplayObject>(const sol::table&)> fromLua;
33 std::function<std::unique_ptr<IDisplayObject>(const IDisplayObject::InitStruct&)> fromInitStruct;
34 };
35
37 {
38 std::function<std::unique_ptr<IAssetObject>(const sol::table&)> fromLua;
39 std::function<std::unique_ptr<IAssetObject>(const IAssetObject::InitStruct&)> fromInitStruct;
40 };
41
42 class Factory final : public IDataObject
43 {
44 friend class Core; // Core should have direct access to the Factory internals
45
46 public:
47 // --- Lifecycle (IDataObject overrides) --- //
48 Factory();
49 virtual ~Factory() = default;
50 virtual bool onInit() override;
51 bool isInitialized() const { return initialized_; }
52 virtual void onQuit() override {}
53 virtual bool onUnitTest() override;
54
55 // --- Object Type Registration --- //
56 void registerDomType(const std::string& typeName, const TypeCreators& creators); // change to registerDisplayObjectType()
57 void registerResType(const std::string& typeName, const AssetTypeCreators& creators); // change to registerAssetObjectType()
58
59 // --- Object Creation --- //
60 DisplayHandle create(const std::string& typeName, const sol::table& config);
61 DisplayHandle create(const std::string& typeName, const IDisplayObject::InitStruct& init);
62 DisplayHandle create(const std::string& typeName, const std::string& luaScript);
63
64 AssetHandle createAsset(const std::string& typeName, const sol::table& config);
65 AssetHandle createAsset(const std::string& typeName, const IAssetObject::InitStruct& init);
66 AssetHandle createAsset(const std::string& typeName, const std::string& luaScript);
67
68 // Helper: attach a newly-created display object (by name/type) to a
69 // parent specified in a Lua config value. Accepts string name, DomHandle,
70 // or a nested table { parent = ... }. Returns true if attachment occurred.
71 bool attachCreatedObjectToParentFromConfig(const std::string& name, const std::string& typeName, const sol::object& parentConfig);
72
73 // --- Object Lookup --- //
74 IDisplayObject* getDomObj(const std::string& name); // change to getIDisplayObject()
75 IAssetObject* getResObj(const std::string& name); //change to getIAssetObject()
76 DisplayHandle getDisplayObject(const std::string& name);
77 AssetHandle getAssetObject(const std::string& name);
79
80 // --- Display Object Management --- //
81
82 void addDisplayObject(const std::string& name, std::unique_ptr<IDisplayObject> displayObject); // Deprecated: Consider refactoring/removal
83
84 void destroyDisplayObject(const std::string& name);
85 void destroyAssetObject(const std::string& name); // NEW, needs LUA bindings
86
87 // --- Orphan Management --- //
89 std::vector<DisplayHandle> getOrphanedDisplayObjects();
91 void detachOrphans();
92 void collectGarbage(); // Maintenance orphaned objects based on their retention policy
93
94
95 // --- Future Child Management --- //
97 void addToOrphanList(const DisplayHandle orphan);
98 void addToFutureChildrenList(const DisplayHandle child, const DisplayHandle parent,
99 bool useWorld=false, int worldX=0, int worldY=0);
100
101 // --- Utility Methods --- //
102 std::vector<std::string> listDisplayObjectNames() const;
103 // std::vector<std::string> listResourceNames() const;
104 void clear();
105 void printObjectRegistry() const;
106 void printAssetRegistry() const; // NEW, needs LUA bindings
107 void printAssetTree() const; // Print a dependency tree of assets (BitmapFont->SpriteSheet->Texture, TruetypeFont->TTFAsset)
108 void printAssetTreeGrouped() const; // Grouped view with Texture/TTFAsset roots and dependents indented like printTree()
109
110 // --- Internal Lua Integration --- //
111 void initFromLua(const sol::table& lua);
112 // void initLuaProcessResource(const sol::table& resource);
113
114 // Helper: find an existing asset by filename (optionally matching type)
115 AssetHandle findAssetByFilename(const std::string& filename, const std::string& typeName = "") const;
116
117 // Helper: find a SpriteSheet asset matching filename and sprite dimensions
118 AssetHandle findSpriteSheetByParams(const std::string& filename, int spriteW, int spriteH) const;
119
120 private:
121 // initialization guard to make onInit idempotent
122 bool initialized_ = false;
123 // --- Internal Storage --- //
124 std::unordered_map<std::string, std::unique_ptr<IDisplayObject>> displayObjects_;
125 // Use shared_ptr so multiple registry names can alias the same underlying asset
126 std::unordered_map<std::string, std::shared_ptr<IAssetObject>> assetObjects_;
127 std::unordered_map<std::string, TypeCreators> creators_;
128 std::unordered_map<std::string, AssetTypeCreators> assetCreators_;
129
130 // --- Orphan & Future Child Lists --- //
131
132 std::vector<DisplayHandle> orphanList_;
133 struct futureChild
134 {
135 DisplayHandle child;
136 DisplayHandle parent;
137 bool preserveWorldPosition;
138 int dragStartWorldX;
139 int dragStartWorldY;
140 };
141 std::vector<futureChild> futureChildrenList_;
142
143 // Helper: find an existing asset by filename (optionally matching type)
144 // Helper: find a SpriteSheet asset matching filename and sprite dimensions
145
146
147 };
148
149
150}
151
152
Definition SDOM_AssetHandle.hpp:13
The central singleton framework object for SDOM.
Definition SDOM_Core.hpp:27
Definition SDOM_DisplayHandle.hpp:24
Definition SDOM_Factory.hpp:43
void destroyDisplayObject(const std::string &name)
Definition SDOM_Factory.cpp:969
AssetHandle getAssetObject(const std::string &name)
Definition SDOM_Factory.cpp:409
void clear()
Definition SDOM_Factory.cpp:1086
void initFromLua(const sol::table &lua)
void printAssetTreeGrouped() const
Definition SDOM_Factory.cpp:1191
void addDisplayObject(const std::string &name, std::unique_ptr< IDisplayObject > displayObject)
Definition SDOM_Factory.cpp:955
void printAssetRegistry() const
Definition SDOM_Factory.cpp:1105
virtual bool onUnitTest() override
Runs unit tests for this object.
Definition SDOM_Factory.cpp:1375
virtual void onQuit() override
Definition SDOM_Factory.hpp:52
IAssetObject * getResObj(const std::string &name)
Definition SDOM_Factory.cpp:387
DisplayHandle getStageHandle()
Definition SDOM_Factory.cpp:423
void destroyOrphanedDisplayObjects()
Definition SDOM_Factory.cpp:1016
void addToFutureChildrenList(const DisplayHandle child, const DisplayHandle parent, bool useWorld=false, int worldX=0, int worldY=0)
Definition SDOM_Factory.cpp:1345
DisplayHandle getDisplayObject(const std::string &name)
Definition SDOM_Factory.cpp:397
std::vector< DisplayHandle > getOrphanedDisplayObjects()
Definition SDOM_Factory.cpp:1005
void printObjectRegistry() const
Definition SDOM_Factory.cpp:1091
AssetHandle findAssetByFilename(const std::string &filename, const std::string &typeName="") const
Definition SDOM_Factory.cpp:1038
int countOrphanedDisplayObjects() const
Definition SDOM_Factory.cpp:994
AssetHandle createAsset(const std::string &typeName, const sol::table &config)
Definition SDOM_Factory.cpp:646
void registerDomType(const std::string &typeName, const TypeCreators &creators)
Definition SDOM_Factory.cpp:330
void addToOrphanList(const DisplayHandle orphan)
Definition SDOM_Factory.cpp:1337
virtual bool onInit() override
Definition SDOM_Factory.cpp:37
virtual ~Factory()=default
void attachFutureChildren()
Definition SDOM_Factory.cpp:1318
AssetHandle findSpriteSheetByParams(const std::string &filename, int spriteW, int spriteH) const
Definition SDOM_Factory.cpp:1063
IDisplayObject * getDomObj(const std::string &name)
Definition SDOM_Factory.cpp:367
void collectGarbage()
Definition SDOM_Factory.cpp:256
bool attachCreatedObjectToParentFromConfig(const std::string &name, const std::string &typeName, const sol::object &parentConfig)
Definition SDOM_Factory.cpp:855
void destroyAssetObject(const std::string &name)
Definition SDOM_Factory.cpp:974
void registerResType(const std::string &typeName, const AssetTypeCreators &creators)
Definition SDOM_Factory.cpp:377
DisplayHandle create(const std::string &typeName, const sol::table &config)
Definition SDOM_Factory.cpp:435
std::vector< std::string > listDisplayObjectNames() const
Definition SDOM_Factory.cpp:1028
void printAssetTree() const
Definition SDOM_Factory.cpp:1128
bool isInitialized() const
Definition SDOM_Factory.hpp:51
void detachOrphans()
Definition SDOM_Factory.cpp:1298
Factory()
Definition SDOM_Factory.cpp:30
Definition SDOM_IAssetObject.hpp:10
Definition SDOM_IDataObject.hpp:107
Definition SDOM_IDisplayObject.hpp:153
Contains all core classes and utilities for the SDOM library.
Definition lua_BindHelpers.hpp:7
Definition SDOM_Factory.hpp:37
std::function< std::unique_ptr< IAssetObject >(const sol::table &)> fromLua
Definition SDOM_Factory.hpp:38
std::function< std::unique_ptr< IAssetObject >(const IAssetObject::InitStruct &)> fromInitStruct
Definition SDOM_Factory.hpp:39
Definition SDOM_IAssetObject.hpp:18
Definition SDOM_IDisplayObject.hpp:187
Definition SDOM_Factory.hpp:31
std::function< std::unique_ptr< IDisplayObject >(const sol::table &)> fromLua
Definition SDOM_Factory.hpp:32
std::function< std::unique_ptr< IDisplayObject >(const IDisplayObject::InitStruct &)> fromInitStruct
Definition SDOM_Factory.hpp:33