Files
aligned
app
arrayvec
as_slice
bare_metal
byteorder
cfg_if
cortex_m
cortex_m_rt
cstr_core
cty
druid
druid_shell
embedded_graphics
embedded_hal
generic_array
hash32
heapless
introsort
kurbo
libchip8
libm
log
memchr
mynewt
nb
num_traits
piet
piet_common
piet_embedded_graphics
r0
st7735_lcd
stable_deref_trait
typenum
unicode_segmentation
vcell
void
volatile_register
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
//! `WindowBox` contains a `Window`. Allows for dynamic dispatch with static `Windows` in `[no_std]`.

use crate::{
    Data, Env, Event, EventCtx, LayoutCtx, PaintCtx, UpdateCtx, Window,
    widget::{Align, Flex, Padding},
};

/// Boxed version of a `Window`
#[derive(Clone, Default)]
pub struct WindowBox<D: Data + 'static + Default>(
    pub WindowType<D>,
);

/// Enum to store each `Window`
#[derive(Clone)]
pub enum WindowType<D: Data + 'static + Default> {
    None,
    Align(Window<D, Align<D>>),
    Flex(Window<D, Flex<D>>),
    Padding(Window<D, Padding<D>>),
}

impl<D: Data + 'static + Default> Default for WindowType<D> {
    fn default() -> Self { WindowType::None }
}

/// Generic implementation of `WindowBox`
impl<D: Data + 'static + Default> WindowBox<D> {
    /// Create a new empty box without a `Window`
    pub fn new() -> Self {
        WindowBox(
            WindowType::None,
        )
    }
}

/// Implementation of `WindowBox`. We just forward to the inner `Window`.
impl<D: Data + 'static + Default> WindowBox<D> {
    pub fn event(
        &mut self, 
        ctx: &mut EventCtx<D>, 
        event: &Event, 
        data: &mut D, 
        env: &Env
    ) {
        match &mut self.0 {
            WindowType::Align(w)   => w.event(ctx, event, data, env),
            WindowType::Flex(w)    => w.event(ctx, event, data, env),
            WindowType::Padding(w) => w.event(ctx, event, data, env),
            WindowType::None => {}
        };
    }

    pub fn update(
        &mut self, 
        ctx: &mut UpdateCtx<D>, 
        data: &D, 
        env: &Env
    ) {
        match &mut self.0 {
            WindowType::Align(w)   => w.update(ctx, data, env),
            WindowType::Flex(w)    => w.update(ctx, data, env),
            WindowType::Padding(w) => w.update(ctx, data, env),
            WindowType::None => {}
        };
    }

    pub fn layout(
        &mut self,
        layout_ctx: &mut LayoutCtx,
        data: &D,
        env: &Env,
    ) {
        match &mut self.0 {
            WindowType::Align(w)   => w.layout(layout_ctx, data, env),
            WindowType::Flex(w)    => w.layout(layout_ctx, data, env),
            WindowType::Padding(w) => w.layout(layout_ctx, data, env),
            WindowType::None => {}
        };
    }

    pub fn paint(
        &mut self, 
        paint_ctx: &mut PaintCtx, 
        data: &D, 
        env: &Env
    ) {
        match &mut self.0 {
            WindowType::Align(w)   => w.paint(paint_ctx, data, env),
            WindowType::Flex(w)    => w.paint(paint_ctx, data, env),
            WindowType::Padding(w) => w.paint(paint_ctx, data, env),
            WindowType::None => {}
        };
    }

    pub fn has_active(
        &mut self,
    ) -> bool {
        match &mut self.0 {
            WindowType::Align(w)   => w.root.state.has_active,
            WindowType::Flex(w)    => w.root.state.has_active,
            WindowType::Padding(w) => w.root.state.has_active,
            WindowType::None => false
        }        
    }
}