cotis_web/cotis_traits.rs
1//! Cotis context trait implementations for [`HTMLRenderer`].
2//!
3//! These traits connect the renderer to the Cotis app loop:
4//!
5//! | Trait | Provides |
6//! |-------|----------|
7//! | [`RendererTextMeasuringProvider`] | Browser-based text measurement via `renderer.js` |
8//! | [`CotisWindowContext`] | Viewport size in pixels |
9//! | [`CotisFrameContext`] | Frame delta time in **seconds** |
10//! | [`cotis_utils::traits::CotisRenderContext`] | Provided automatically via blanket impl when window + frame traits are implemented |
11//! | [`RenderCompatibleWith`] | No-op layout init hook |
12//!
13//! Mouse input is implemented on [`HTMLRenderer`] directly (see the `interactivity` module).
14//! Keyboard state is available through `HTMLInteractivity` in the `interactivity` module
15//! ([`SimpleKeyboardProvider`](cotis_utils::interactivity::keyboard::SimpleKeyboardProvider)).
16
17use crate::renderer::HTMLRenderer;
18use crate::web_functions::primitives::{
19 get_delta_time_ms, text_measuring_function, window_dimensions,
20};
21use cotis::renders::RenderCompatibleWith;
22use cotis_defaults::element_configs::text_config::TextConfig;
23use cotis_utils::math::Dimensions;
24use cotis_utils::text::RendererTextMeasuringProvider;
25use cotis_utils::traits::{CotisFrameContext, CotisWindowContext};
26
27impl RendererTextMeasuringProvider<TextConfig> for HTMLRenderer {
28 /// Returns a measurer that uses off-screen DOM layout in `renderer.js`.
29 ///
30 /// Respects `TextConfig` font id, size, line height, and letter spacing.
31 fn provide_measurer(&mut self) -> Box<dyn Fn(&str, &TextConfig) -> Dimensions> {
32 Box::new(text_measuring_function)
33 }
34}
35
36impl CotisWindowContext for HTMLRenderer {
37 /// Returns the browser viewport size `(width, height)` in CSS pixels.
38 fn window_dimensions(&self) -> Dimensions {
39 let array = window_dimensions();
40 Dimensions {
41 width: array.0,
42 height: array.1,
43 }
44 }
45}
46
47impl CotisFrameContext for HTMLRenderer {
48 /// Returns elapsed time since the previous frame, in **seconds**.
49 ///
50 /// Sourced from JS `get_delta_time_ms()` (milliseconds) and converted to seconds.
51 fn get_delta_time(&self) -> f32 {
52 get_delta_time_ms()
53 }
54}
55
56impl<M> RenderCompatibleWith<M> for HTMLRenderer {
57 /// No-op: the HTML renderer does not require layout-manager initialization.
58 fn init(&mut self, _layout_manager: &mut M) {}
59}