pub trait Theme<DS: DrawSharedImpl>: ThemeControl {
type Config: ThemeConfig;
type Window: Window;
type Draw<'a>: ThemeDraw
where
DS: 'a,
Self: 'a;
fn config(&self) -> Cow<'_, Self::Config>;
fn apply_config(&mut self, config: &Self::Config) -> TkAction;
fn init(&mut self, shared: &mut SharedState<DS>);
fn new_window(&self, dpi_factor: f32) -> Self::Window;
fn update_window(&self, window: &mut Self::Window, dpi_factor: f32);
fn draw<'a>(
&'a self,
draw: DrawIface<'a, DS>,
ev: &'a mut EventState,
window: &'a mut Self::Window
) -> Self::Draw<'a>;
fn clear_color(&self) -> Rgba;
}
Expand description
A theme provides widget sizing and drawing implementations.
The theme is generic over some DrawIface
.
Objects of this type are copied within each window’s data structure. For large resources (e.g. fonts and icons) consider using external storage.
Required Associated Types§
sourcetype Config: ThemeConfig
type Config: ThemeConfig
The associated config type
Required Methods§
sourcefn apply_config(&mut self, config: &Self::Config) -> TkAction
fn apply_config(&mut self, config: &Self::Config) -> TkAction
Apply/set the passed config
sourcefn init(&mut self, shared: &mut SharedState<DS>)
fn init(&mut self, shared: &mut SharedState<DS>)
Theme initialisation
The toolkit must call this method before Theme::new_window
to allow initialisation specific to the DrawIface
.
At a minimum, a theme must load a font to [kas::text::fonts
].
The first font loaded (by any theme) becomes the default font.
sourcefn new_window(&self, dpi_factor: f32) -> Self::Window
fn new_window(&self, dpi_factor: f32) -> Self::Window
Construct per-window storage
On “standard” monitors, the dpi_factor
is 1. High-DPI screens may
have a factor of 2 or higher. The factor may not be an integer; e.g.
9/8 = 1.125
works well with many 1440p screens. It is recommended to
round dimensions to the nearest integer, and cache the result:
self.margin = i32::conv_nearest(MARGIN * factor);
A reference to the draw backend is provided allowing configuration.
sourcefn update_window(&self, window: &mut Self::Window, dpi_factor: f32)
fn update_window(&self, window: &mut Self::Window, dpi_factor: f32)
Update a window created by Theme::new_window
This is called when the DPI factor changes or theme dimensions change.
sourcefn draw<'a>(
&'a self,
draw: DrawIface<'a, DS>,
ev: &'a mut EventState,
window: &'a mut Self::Window
) -> Self::Draw<'a>
fn draw<'a>(
&'a self,
draw: DrawIface<'a, DS>,
ev: &'a mut EventState,
window: &'a mut Self::Window
) -> Self::Draw<'a>
Prepare to draw and construct a [ThemeDraw
] object
This is called once per window per frame and should do any necessary preparation such as loading fonts and textures which are loaded on demand.
Drawing via this [ThemeDraw
] object is restricted to the specified rect
.
The window
is guaranteed to be one created by a call to
Theme::new_window
on self
.
sourcefn clear_color(&self) -> Rgba
fn clear_color(&self) -> Rgba
Background colour