Skip to main content

plushie_renderer_lib/
view.rs

1//! Renders a window's UI tree into iced `Element`s via plushie-core's widget
2//! mapper.
3
4use iced::widget::{container, text};
5use iced::{Element, Fill, window};
6
7use plushie_widget_sdk::runtime::Message;
8
9use crate::App;
10
11impl App {
12    /// Render a single window's UI tree into iced `Element`s.
13    /// Called by the iced daemon for each open window on every frame.
14    pub fn view_window(&self, iced_id: window::Id) -> Element<'_, Message> {
15        let window_id = match self.windows.get_window_id(&iced_id) {
16            Some(id) => id,
17            None => {
18                return container(text("unknown window"))
19                    .width(Fill)
20                    .height(Fill)
21                    .center(Fill)
22                    .into();
23            }
24        };
25
26        let resolved_theme = self.theme_ref_for_window(iced_id);
27        let theme_chrome = self.theme_chrome_for_window(iced_id);
28
29        match self.core.tree.find_window(window_id) {
30            Some(window_node) => {
31                let ctx = plushie_widget_sdk::render_ctx::RenderCtx {
32                    caches: &self.core.caches,
33                    images: &self.image_registry,
34                    theme: resolved_theme,
35                    theme_chrome,
36                    registry: &self.registry,
37                    default_text_size: self.core.default_text_size,
38                    default_font: self.core.default_font,
39                    window_id,
40                    scale_factor: self.scale_factor_for_window(iced_id),
41                    validate_props: self.core.is_validate_props_enabled(),
42                };
43                plushie_widget_sdk::runtime::render(window_node, ctx)
44            }
45            None => container(text("waiting for snapshot..."))
46                .width(Fill)
47                .height(Fill)
48                .center(Fill)
49                .into(),
50        }
51    }
52}