11#include <RmlUi/Core/Context.h>
12#include <RmlUi/Core/Element.h>
13#include <RmlUi/Core/ElementDocument.h>
15#include <RmlUi/Debugger/Debugger.h>
21 auto is_keyboard_event(
const os::event&
event) ->
bool
25 case os::events::key_down:
26 case os::events::key_up:
27 case os::events::text_input:
34 auto is_release_event(
const os::event&
event) ->
bool
38 case os::events::key_up:
40 case os::events::mouse_button:
41 return event.button.state_id == os::state::released;
47 auto is_pointer_tracking_event(
const os::event&
event) ->
bool
51 case os::events::mouse_button:
52 case os::events::mouse_motion:
53 case os::events::mouse_wheel:
60 auto context_wants_keyboard_input(Rml::Context* context) ->
bool
67 Rml::Element* focus = context->GetFocusElement();
68 if(!focus || focus == context->GetRootElement())
73 Rml::Element* leaf = focus->GetFocusLeafNode();
74 if(!leaf || leaf == context->GetRootElement())
79 const Rml::String&
tag = leaf->GetTagName();
80 return tag ==
"input" ||
tag ==
"textarea" ||
tag ==
"select";
83 void blur_all_document_contexts(
scene& scn,
const Rml::Context* except,
const ui_system& system)
85 scn.registry->view<ui_document_component>().each(
86 [&](entt::entity, ui_document_component& ui_comp)
88 if(ui_comp.context && ui_comp.context != except)
90 system.blur_ui_context(ui_comp.context);
101 if(input_allowed && is_keyboard_event(
event))
109 else if(input_allowed)
118 if(Rml::Debugger::IsVisible() && debug_context_ && context_wants_keyboard_input(debug_context_))
120 return debug_context_;
123 Rml::Context* keyboard_context =
nullptr;
129 keyboard_context = ui_comp.
context;
132 return keyboard_context;
137 Rml::Context* keyboard_context = find_keyboard_context(scn);
138 if(!keyboard_context)
146 return !is_release_event(
event);
154 if(is_pointer_tracking_event(
event))
156 refresh_mouse_state(ctx, scn);
159 if(Rml::Debugger::IsVisible() && debug_context_)
161 if(process_event(scn, debug_context_,
event))
184 Rml::Context* target_context,
187 if(
event.type != os::events::mouse_button)
192 if(
event.button.state_id == os::state::released)
198 if(
event.button.state_id != os::state::pressed)
203 if(!target_context && input_allowed)
214 if(target_context || !input_allowed)
216 const Rml::Context* except = (input_allowed && target_context) ? target_context :
nullptr;
217 blur_all_document_contexts(scn, except, *
this);
232 if(element->GetTagName() ==
"#root")
241 if(
static_cast<Rml::Element*
>(ui_comp.document) == element)
251 if(!context->ProcessMouseMove(
x,
y, 0))
253 auto hover_element = context->GetHoverElement();
254 if(is_not_root_element(scn, hover_element))
256 if(debug_target_context_ != context)
258 debug_target_context_ = context;
259 Rml::Debugger::SetContext(context);
277 if(is_keyboard_event(
event))
284 if(
event.type == os::events::mouse_button ||
event.type == os::events::mouse_motion)
286 auto hover_element = context->GetHoverElement();
287 if(is_not_root_element(scn, hover_element))
303 context->ProcessMouseLeave();
305 Rml::Element* focus = context->GetFocusElement();
306 if(focus && focus != context->GetRootElement())
315 if(!
input.manager.is_input_allowed())
320 const int mouse_x =
static_cast<int>(
input.manager.get_mouse().get_position().
x);
321 const int mouse_y =
static_cast<int>(
input.manager.get_mouse().get_position().
y);
323 const camera* scene_camera =
nullptr;
324 entt::handle camera_entity;
356 ui_comp.
context->ProcessMouseLeave();
365 if(scene_camera->
project_to_quad(math::vec2(
static_cast<float>(mouse_x),
static_cast<float>(mouse_y)),
372 ui_comp.
context->ProcessMouseLeave();
Class that contains core camera data, used for rendering and other purposes.
Class representing a camera. Contains functionality for manipulating and updating a camera....
auto project_to_quad(const math::vec2 &viewport_point, const math::transform &quad_transform, uint32_t quad_width, uint32_t quad_height, math::vec2 &pixel_out) const -> bool
Raycasts from viewport point onto a quad plane and returns pixel coordinates.
auto input_event_handler(Rml::Context *context, const os::event &event) -> bool
Process ospp event and forward to RmlUi context.
@ screen_space_overlay
Screen-space overlay (viewport-sized or positioned)
std::vector< float > scale
Manages the entity-component-system (ECS) operations for the ACE framework.
Represents a scene in the ACE framework, managing entities and their relationships.
std::unique_ptr< entt::registry > registry
The registry that manages all entities in the scene.
auto create_handle(entt::entity e) -> entt::handle
Creates an entity in the scene.
Component that holds a reference to a UI document for RmlUi rendering.
auto get_world_space_scale() const -> math::vec2
usize32_t size
Document resolution (pixels). For screen-space: viewport size. For world-space: configurable (e....
auto is_enabled() const -> bool
Check if document is currently enabled.
Rml::Context * context
Per-document RmlUi context (owned by this component)
ui_render_mode render_mode
Rendering mode: screen or world.
Rml::Context * target_context
void on_os_event(rtti::context &ctx, os::event &event)
Handle OS events and forward to RmlUi.
auto try_consume_keyboard_event(scene &scn, os::event &event) -> bool
void apply_mouse_press_focus(scene &scn, os::event &event, Rml::Context *target_context, bool input_allowed)
auto process_mouse_move(scene &scn, Rml::Context *context, int x, int y) -> bool
auto find_keyboard_context(scene &scn) const -> Rml::Context *
void blur_ui_context(Rml::Context *context) const
auto dispatch_pointer_event(rtti::context &ctx, scene &scn, os::event &event) -> ui_pointer_dispatch_result
void refresh_mouse_state(rtti::context &ctx, scene &scn)
auto is_not_root_element(scene &scn, Rml::Element *element) -> bool
auto process_event(scene &scn, Rml::Context *context, os::event &event) -> bool