vn-settings 0.4.0

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

#[derive(Clone)]
pub struct ObjectData<I, A, S> {
    pub images: Vec<I>,
    pub anchors: Vec<A>,
    pub scale: S,
}

impl<I: Default, A: Default, S> ObjectData<I, A, S> {
    fn new() -> Self
    where
        S: From<f32>,
    {
        Self {
            images: Vec::new(),
            anchors: Vec::new(),
            scale: 1.0.into(),
        }
    }

    fn image(&mut self, index: usize) -> &mut I {
        if index >= self.images.len() {
            self.images.resize_with(index + 1, Default::default);
        }
        &mut self.images[index]
    }

    fn anchor(&mut self, index: usize) -> &mut A {
        if index >= self.anchors.len() {
            self.anchors.resize_with(index + 1, Default::default);
        }
        &mut self.anchors[index]
    }
}

#[derive(Clone)]
pub struct ObjectSettings<I, A, S> {
    pub objects: Vec<ObjectData<I, A, S>>,
}

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

    fn at(&mut self, index: usize) -> &mut ObjectData<I, A, S> {
        if index >= self.objects.len() {
            self.objects.resize_with(index + 1, ObjectData::new);
        }
        &mut self.objects[index]
    }
}

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

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

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

impl<I: Default, A: Default, S: From<f32>> Settings<ObjectImageParameter>
    for ObjectSettings<I, A, S>
{
    type Value = I;

    fn get_mut(&mut self, parameter: &ObjectImageParameter) -> &mut I {
        let &ObjectImageParameter(o, i) = parameter;
        self.at(o).image(i)
    }
}

impl<I: Default, A: Default, S: From<f32>> Settings<ObjectAnchorParameter>
    for ObjectSettings<I, A, S>
{
    type Value = A;

    fn get_mut(&mut self, parameter: &ObjectAnchorParameter) -> &mut A {
        let &ObjectAnchorParameter(o, a) = parameter;
        self.at(o).anchor(a)
    }
}

impl<I: Default, A: Default, S: From<f32>> Settings<ObjectScaleParameter>
    for ObjectSettings<I, A, S>
{
    type Value = S;

    fn get_mut(&mut self, parameter: &ObjectScaleParameter) -> &mut S {
        let &ObjectScaleParameter(o) = parameter;
        &mut self.at(o).scale
    }
}

impl<I: Resettable, A: Resettable, S: Resettable> Resettable for ObjectSettings<I, A, S> {
    fn reset(&mut self) {
        for object in &mut self.objects {
            for image in &mut object.images {
                image.reset();
            }
            for anchor in &mut object.anchors {
                anchor.reset();
            }
            object.scale.reset();
        }
    }

    fn reset_aspects(&mut self) {
        for object in &mut self.objects {
            for image in &mut object.images {
                image.reset_aspects();
            }
            for anchor in &mut object.anchors {
                anchor.reset_aspects();
            }
            object.scale.reset_aspects();
        }
    }
}