88
99#include < functional>
1010#include < string>
11- #include < unordered_set>
12- #include < vector>
1311
1412#include < OvMaths/FVector2.h>
1513#include < OvMaths/FVector3.h>
1614#include < OvMaths/FVector4.h>
1715#include < OvMaths/FQuaternion.h>
1816
19- #include < OvTools/Utils/PathParser.h>
20-
2117#include < OvUI/Internal/WidgetContainer.h>
2218#include < OvUI/Widgets/Texts/Text.h>
2319#include < OvUI/Widgets/Drags/DragSingleScalar.h>
2420#include < OvUI/Widgets/Drags/DragMultipleScalars.h>
2521#include < OvUI/Widgets/InputFields/InputText.h>
26- #include < OvUI/Widgets/Visual/Image .h>
22+ #include < OvUI/Widgets/InputFields/AssetField .h>
2723#include < OvUI/Types/Color.h>
2824
2925namespace OvCore ::Resources
@@ -46,116 +42,16 @@ namespace OvRendering::Resources
4642namespace OvCore ::Helpers
4743{
4844 /* *
49- * Provide some helpers to draw UI elements
45+ * Provides helpers to draw UI elements for common data types and asset resources.
5046 */
5147 class GUIDrawer
5248 {
5349 public:
54- /* *
55- * Represents a single item in the picker.
56- * The key uniquely identifies the item for deduplication when combining lists.
57- */
58- struct PickerItem
59- {
60- std::string key; // unique identifier used for deduplication
61- std::string displayName;
62- std::string tooltip;
63- uint32_t iconID = 0 ;
64- std::function<void ()> onSelected;
65- };
66-
67- /* *
68- * An ordered, deduplication-aware collection of picker items.
69- * Items with the same key are silently dropped when added.
70- */
71- class PickerItemList
72- {
73- public:
74- /* *
75- * Add an item to the list.
76- * @returns true if added, false if an item with the same key was already present.
77- */
78- bool Add (PickerItem p_item)
79- {
80- if (!m_keys.insert (p_item.key ).second )
81- return false ;
82- m_items.push_back (std::move (p_item));
83- return true ;
84- }
85-
86- const std::vector<PickerItem>& Items () const { return m_items; }
87- bool empty () const { return m_items.empty (); }
88- size_t size () const { return m_items.size (); }
89-
90- private:
91- std::vector<PickerItem> m_items;
92- std::unordered_set<std::string> m_keys;
93- };
94-
95- /* *
96- * A callback that builds a PickerItemList for a given file type.
97- * Called internally by OpenAssetPicker — register once via SetFileItemBuilder.
98- */
99- using FileItemBuilderCallback = std::function<PickerItemList(OvTools::Utils::PathParser::EFileType, std::function<void (std::string)>, bool , bool )>;
100-
101- using PickerProviderCallback = std::function<void (PickerItemList, std::string)>;
102-
10350 static const OvUI::Types::Color TitleColor;
10451
10552 static const float _MIN_FLOAT;
10653 static const float _MAX_FLOAT;
10754
108- /* *
109- * Defines the texture to use when there is no texture in a texture resource field
110- * @param p_emptyTexture
111- */
112- static void ProvideEmptyTexture (OvRendering::Resources::Texture& p_emptyTexture);
113-
114- /* *
115- * Register the function that builds a PickerItemList for a given file type.
116- * This is called internally by OpenAssetPicker.
117- * Call this once during editor startup.
118- * @param p_builder
119- */
120- static void SetFileItemBuilder (FileItemBuilderCallback p_builder);
121-
122- /* *
123- * Open the asset picker for the given file type.
124- * Builds the item list via the registered file item builder, derives the window title
125- * from the file type, and forwards everything to the registered picker provider.
126- * Has no effect if either callback has not been registered.
127- * @param p_fileType
128- * @param p_onSelect
129- * @param p_searchProjectFiles Include project assets in the results
130- * @param p_searchEngineFiles Include engine assets in the results
131- */
132- static void OpenAssetPicker (
133- OvTools::Utils::PathParser::EFileType p_fileType,
134- std::function<void (std::string)> p_onSelect,
135- bool p_searchProjectFiles = true,
136- bool p_searchEngineFiles = true
137- );
138-
139- /* *
140- * Register the function that opens the picker window.
141- * Call this once during editor startup (typically in Editor::SetupUI).
142- * @param p_provider
143- */
144- static void SetPickerProvider (PickerProviderCallback p_provider);
145-
146- /* *
147- * Open the picker with the given list of items.
148- * Has no effect if no provider has been registered.
149- * @param p_items
150- * @param p_title Title displayed in the window's title bar
151- */
152- static void OpenPicker (PickerItemList p_items, std::string p_title);
153-
154- /* *
155- * Draw a title with the title color
156- * @param p_root
157- * @param p_name
158- */
15955 static void CreateTitle (OvUI::Internal::WidgetContainer& p_root, const std::string& p_name);
16056
16157 template <typename T>
@@ -167,12 +63,14 @@ namespace OvCore::Helpers
16763 static void DrawQuat (OvUI::Internal::WidgetContainer& p_root, const std::string& p_name, OvMaths::FQuaternion& p_data, float p_step = 1 .f, float p_min = _MIN_FLOAT, float p_max = _MAX_FLOAT);
16864 static void DrawString (OvUI::Internal::WidgetContainer& p_root, const std::string& p_name, std::string& p_data);
16965 static void DrawColor (OvUI::Internal::WidgetContainer& p_root, const std::string& p_name, OvUI::Types::Color& p_color, bool p_hasAlpha = false );
170- static OvUI::Widgets::Texts::Text& DrawMesh (OvUI::Internal::WidgetContainer& p_root, const std::string& p_name, OvRendering::Resources::Model*& p_data, OvTools::Eventing::Event<>* p_updateNotifier = nullptr );
171- static OvUI::Widgets::Visual::Image& DrawTexture (OvUI::Internal::WidgetContainer& p_root, const std::string& p_name, OvRendering::Resources::Texture*& p_data, OvTools::Eventing::Event<>* p_updateNotifier = nullptr );
172- static OvUI::Widgets::Texts::Text& DrawShader (OvUI::Internal::WidgetContainer& p_root, const std::string& p_name, OvRendering::Resources::Shader*& p_data, OvTools::Eventing::Event<>* p_updateNotifier = nullptr );
173- static OvUI::Widgets::Texts::Text& DrawMaterial (OvUI::Internal::WidgetContainer& p_root, const std::string& p_name, OvCore::Resources::Material*& p_data, OvTools::Eventing::Event<>* p_updateNotifier = nullptr );
174- static OvUI::Widgets::Texts::Text& DrawSound (OvUI::Internal::WidgetContainer& p_root, const std::string& p_name, OvAudio::Resources::Sound*& p_data, OvTools::Eventing::Event<>* p_updateNotifier = nullptr );
175- static OvUI::Widgets::Texts::Text& DrawAsset (OvUI::Internal::WidgetContainer& p_root, const std::string& p_name, std::string& p_data, OvTools::Eventing::Event<>* p_updateNotifier = nullptr );
66+ static OvUI::Widgets::InputFields::AssetField& DrawMesh (OvUI::Internal::WidgetContainer& p_root, const std::string& p_name, OvRendering::Resources::Model*& p_data, OvTools::Eventing::Event<>* p_updateNotifier = nullptr );
67+ static OvUI::Widgets::InputFields::AssetField& DrawTexture (OvUI::Internal::WidgetContainer& p_root, const std::string& p_name, OvRendering::Resources::Texture*& p_data, OvTools::Eventing::Event<>* p_updateNotifier = nullptr );
68+ static OvUI::Widgets::InputFields::AssetField& DrawShader (OvUI::Internal::WidgetContainer& p_root, const std::string& p_name, OvRendering::Resources::Shader*& p_data, OvTools::Eventing::Event<>* p_updateNotifier = nullptr );
69+ static OvUI::Widgets::InputFields::AssetField& DrawMaterial (OvUI::Internal::WidgetContainer& p_root, const std::string& p_name, OvCore::Resources::Material*& p_data, OvTools::Eventing::Event<>* p_updateNotifier = nullptr );
70+ static OvUI::Widgets::InputFields::AssetField& DrawSound (OvUI::Internal::WidgetContainer& p_root, const std::string& p_name, OvAudio::Resources::Sound*& p_data, OvTools::Eventing::Event<>* p_updateNotifier = nullptr );
71+ static OvUI::Widgets::InputFields::AssetField& DrawAsset (OvUI::Internal::WidgetContainer& p_root, const std::string& p_name, std::string& p_data, OvTools::Eventing::Event<>* p_updateNotifier = nullptr );
72+
73+ static OvUI::Widgets::InputFields::AssetField& DrawScene (OvUI::Internal::WidgetContainer& p_root, const std::string& p_name, std::function<std::string()> p_gatherer, std::function<void(std::string)> p_provider);
17674
17775 template <typename T>
17876 static void DrawScalar (OvUI::Internal::WidgetContainer& p_root, const std::string& p_name, std::function<T(void )> p_gatherer, std::function<void(T)> p_provider, float p_step = 1.f, T p_min = std::numeric_limits<T>::min(), T p_max = std::numeric_limits<T>::max());
0 commit comments