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(¶meter.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();
}
}
}