5#include <tracy/Tracy.hpp>
12import fabric.memory.lazy_alloc;
14export import fabric.wiring.signals;
18export using children_list = std::vector<cydui::components::component_holder_t>;
21 export template <
typename ComponentType,
typename EventHandler>
25 ZoneScopedN(
"event_dispatcher_t");
26 auto &style = *
static_cast<typename ComponentType::style_t *
>(&component_->get_style_data().as_base());
28 *
static_cast<ComponentType*
>(component_),
30 std::dynamic_pointer_cast<typename ComponentType::state_t>(component_->state()),
31 (std::dynamic_pointer_cast<typename ComponentType::state_t>(component_->state()))->window,
32 static_cast<ComponentType*
>(component_)->props,
37 if constexpr (refl::Reflected<EventHandler>) {
38 static constexpr std::size_t field_count = refl::field_count<EventHandler>;
40 configure_event_handler_fields(std::make_index_sequence<field_count> { });
45 ZoneScopedN(
"Update - Component EV");
46 auto eh =
static_cast<EventHandler*
>(event_handler_.get());
47 auto [at, ir] = component_data();
57 content_children_builder
61 ZoneScopedN(
"Paint Fragment - Component EV");
62 auto eh =
static_cast<EventHandler*
>(event_handler_.get());
63 auto [at, ir] = component_data();
78 ZoneScopedN(
"Key Press - Component EV");
79 auto eh =
static_cast<EventHandler*
>(event_handler_.get());
80 auto [at, ir] = component_data();
95 ZoneScopedN(
"Key Release - Component EV");
96 auto eh =
static_cast<EventHandler*
>(event_handler_.get());
97 auto [at, ir] = component_data();
112 ZoneScopedN(
"Text Input - Component EV");
113 auto eh =
static_cast<EventHandler*
>(event_handler_.get());
114 auto [at, ir] = component_data();
133 ZoneScopedN(
"Button Press - Component EV");
134 auto eh =
static_cast<EventHandler*
>(event_handler_.get());
135 auto [at, ir] = component_data();
156 ZoneScopedN(
"Button Release - Component EV");
157 auto eh =
static_cast<EventHandler*
>(event_handler_.get());
158 auto [at, ir] = component_data();
159 eh->on_button_release(
175 ZoneScopedN(
"Mouse Enter - Component EV");
176 auto eh =
static_cast<EventHandler*
>(event_handler_.get());
177 auto [at, ir] = component_data();
193 ZoneScopedN(
"Mouse Exit - Component EV");
194 auto eh =
static_cast<EventHandler*
>(event_handler_.get());
195 auto [at, ir] = component_data();
211 ZoneScopedN(
"Mouse Motion - Component EV");
212 auto eh =
static_cast<EventHandler*
>(event_handler_.get());
213 auto [at, ir] = component_data();
229 ZoneScopedN(
"Scroll - Component EV");
230 auto eh =
static_cast<EventHandler*
>(event_handler_.get());
231 auto [at, ir] = component_data();
247 ZoneScopedN(
"Scroll - Component EV");
248 auto eh =
static_cast<EventHandler*
>(event_handler_.get());
249 auto [at, ir] = component_data();
250 eh->on_focus_changed(
263 std::pair<component_dimensional_relations_t, internal_relations_t&> component_data() {
267 template<std::size_t... I>
268 void configure_event_handler_fields(std::index_sequence<I...>) {
269 ZoneScopedN(
"Configure Fields");
270 (configure_event_handler_field<I>(), ...);
273 template<std::
size_t FieldI>
274 void configure_event_handler_field() {
275 using field = refl::field<EventHandler, FieldI>;
276 using field_type =
typename field::type;
277 ZoneScopedN(field::name);
278 auto* eh =
static_cast<EventHandler*
>(event_handler_.get());
280 if constexpr (packtl::is_type<use_context, field_type>::value) {
281 using context_type =
typename field_type::context_type;
282 using ret_context_type =
typename field_type::ret_context_type;
284 use_context<ret_context_type> &ctx_ref = field::from_instance(*eh);
286 auto ctx = component_->find_context<context_type>();
288 if (ctx.has_value()) {
298 }
else if constexpr (packtl::is_type<provide_context, field_type>::value) {
299 using context_type =
typename field_type::context_type;
301 provide_context<context_type> &ctx_ref = field::from_instance(*eh);
307 component_base_t* component_{};
308 std::shared_ptr<event_handler_t> event_handler_{};
virtual component_dimensional_relations_t get_dimensional_relations()=0
internal_relations_t & get_internal_relations()
void paint_fragment(vg::fragment_t &fragment) override
void dispatch_button_release(const Button &button, dimension_t::value_type x, dimension_t::value_type y) override
void dispatch_mouse_motion(dimension_t::value_type x, dimension_t::value_type y) override
std::vector< component_holder_t > update(StyleArchive &style_archive, component_builder_t &content_children_builder) override
void dispatch_scroll(dimension_t::value_type dx, dimension_t::value_type dy) override
void dispatch_key_press(const KeyEvent &ev) override
void dispatch_focus_changed() override
void dispatch_mouse_exit(dimension_t::value_type x, dimension_t::value_type y) override
void dispatch_button_press(const Button &button, dimension_t::value_type x, dimension_t::value_type y) override
void dispatch_text_input(const TextInputEvent &ev) override
void dispatch_key_release(const KeyEvent &ev) override
event_dispatcher_t(component_base_t *component)
void dispatch_mouse_enter(dimension_t::value_type x, dimension_t::value_type y) override
dimensions::screen_measure value_type
std::vector< cydui::components::component_holder_t > children_list
const S & get_value(dimension< S > &dimension)
static void set_state(provide_context< ContextType > *it, const components::component_state_ref &state)
static void set_context(use_context< ContextType > *it, ContextType *ctx)
static void set_state(use_context< ContextType > *it, const cydui::components::component_state_ref &state)
static void set_owns_context(use_context< ContextType > *it, bool value)
static void start_listening(use_context< ContextType > *it)