use iced::{Element, Theme};
use crate::PlushieRenderer;
use crate::image_registry::ImageRegistry;
use crate::message::Message;
use crate::protocol::TreeNode;
use crate::shared_state::SharedState;
use crate::theming::ThemeChrome;
pub struct RenderCtx<'a, R: PlushieRenderer = iced::Renderer> {
pub caches: &'a SharedState,
pub images: &'a ImageRegistry,
pub theme: &'a Theme,
pub theme_chrome: ThemeChrome,
pub registry: &'a crate::registry::WidgetRegistry<R>,
pub default_text_size: Option<f32>,
pub default_font: Option<iced::Font>,
pub window_id: &'a str,
pub scale_factor: f32,
pub validate_props: bool,
}
impl<R: PlushieRenderer> Clone for RenderCtx<'_, R> {
fn clone(&self) -> Self {
*self
}
}
impl<R: PlushieRenderer> Copy for RenderCtx<'_, R> {}
impl<R: PlushieRenderer> std::fmt::Debug for RenderCtx<'_, R> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("RenderCtx")
.field("window_id", &self.window_id)
.field("scale_factor", &self.scale_factor)
.field("validate_props", &self.validate_props)
.field("default_text_size", &self.default_text_size)
.field("default_font", &self.default_font)
.finish_non_exhaustive()
}
}
impl<'a, R: PlushieRenderer> RenderCtx<'a, R> {
pub fn render_child(&self, node: &'a TreeNode) -> Element<'a, Message, Theme, R> {
crate::widget::render::render(node, *self)
}
pub fn with_theme(&self, theme: &'a Theme) -> Self {
RenderCtx { theme, ..*self }
}
pub fn with_theme_and_chrome(&self, theme: &'a Theme, theme_chrome: ThemeChrome) -> Self {
RenderCtx {
theme,
theme_chrome,
..*self
}
}
pub fn with_window_id(&self, window_id: &'a str) -> Self {
RenderCtx { window_id, ..*self }
}
pub fn render_children(&self, node: &'a TreeNode) -> Vec<Element<'a, Message, Theme, R>> {
node.children.iter().map(|c| self.render_child(c)).collect()
}
}