vn-settings 0.4.0

Various settings intended to simulate visual novels
Documentation
use super::{Resettable, Settings};

#[derive(Clone)]
pub struct LayerObjectSettings<I, L, A> {
    pub image: I,
    pub hor: L,
    pub ver: L,
    pub scale: L,
    pub anchor: A,
}

#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
pub enum LayerObjectLayoutParameter {
    Hor,
    Ver,
    Scale,
}

impl<I, L, A> Settings<LayerObjectLayoutParameter> for LayerObjectSettings<I, L, A> {
    type Value = L;

    fn get_mut(&mut self, parameter: &LayerObjectLayoutParameter) -> &mut L {
        use LayerObjectLayoutParameter::*;
        match parameter {
            Hor => &mut self.hor,
            Ver => &mut self.ver,
            Scale => &mut self.scale,
        }
    }
}

impl<I: Resettable, L: Resettable, A: Resettable> Resettable for LayerObjectSettings<I, L, A> {
    fn reset(&mut self) {
        self.image.reset();
        self.hor.reset();
        self.ver.reset();
        self.scale.reset();
        self.anchor.reset();
    }

    fn reset_aspects(&mut self) {
        self.image.reset_aspects();
        self.hor.reset_aspects();
        self.ver.reset_aspects();
        self.scale.reset_aspects();
        self.anchor.reset_aspects();
    }
}

#[derive(Clone)]
pub struct LayerSettings<I, L, A> {
    pub objects: Vec<LayerObjectSettings<I, L, A>>,
}

impl<I: Default, L: From<f32>, A: Default> LayerSettings<I, L, A> {
    pub fn common() -> Self {
        Self {
            objects: Vec::new(),
        }
    }

    fn at(&mut self, index: usize) -> &mut LayerObjectSettings<I, L, A> {
        if index >= self.objects.len() {
            self.objects.resize_with(index + 1, || LayerObjectSettings {
                image: Default::default(),
                hor: 0.0.into(),
                ver: 0.0.into(),
                scale: 1.0.into(),
                anchor: Default::default(),
            });
        }
        &mut self.objects[index]
    }
}

#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct LayerImageParameter(pub usize);

#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct LayerLayoutParameter {
    pub layer: usize,
    pub layout: LayerObjectLayoutParameter,
}

#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct LayerAnchorParameter(pub usize);

impl<I: Default, L: From<f32>, A: Default> Settings<LayerImageParameter>
    for LayerSettings<I, L, A>
{
    type Value = I;

    fn get_mut(&mut self, &LayerImageParameter(index): &LayerImageParameter) -> &mut I {
        &mut self.at(index).image
    }
}

impl<I: Default, L: From<f32>, A: Default> Settings<LayerLayoutParameter>
    for LayerSettings<I, L, A>
{
    type Value = L;

    fn get_mut(&mut self, parameter: &LayerLayoutParameter) -> &mut L {
        self.at(parameter.layer).get_mut(&parameter.layout)
    }
}

impl<I: Default, L: From<f32>, A: Default> Settings<LayerAnchorParameter>
    for LayerSettings<I, L, A>
{
    type Value = A;

    fn get_mut(&mut self, &LayerAnchorParameter(index): &LayerAnchorParameter) -> &mut A {
        &mut self.at(index).anchor
    }
}

impl<I: Resettable, L: Resettable, A: Resettable> Resettable for LayerSettings<I, L, A> {
    fn reset(&mut self) {
        for object in &mut self.objects {
            object.reset();
        }
    }

    fn reset_aspects(&mut self) {
        for object in &mut self.objects {
            object.reset_aspects();
        }
    }
}