Skip to main content

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}