1use super::{Resettable, Settings};
2
3#[derive(Clone)]
4pub struct ObjectLayerSettings<T, U> {
5 pub image: T,
6 pub hor: U,
7 pub ver: U,
8 pub scale: U,
9}
10
11#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
12pub enum ObjectLayerLayoutParameter {
13 Hor,
14 Ver,
15 Scale,
16}
17
18impl<T, U> Settings<ObjectLayerLayoutParameter> for ObjectLayerSettings<T, U> {
19 type Value = U;
20
21 fn get_mut(&mut self, parameter: &ObjectLayerLayoutParameter) -> &mut U {
22 use ObjectLayerLayoutParameter::*;
23 match parameter {
24 Hor => &mut self.hor,
25 Ver => &mut self.ver,
26 Scale => &mut self.scale,
27 }
28 }
29}
30
31impl<T: Resettable, U: Resettable> Resettable for ObjectLayerSettings<T, U> {
32 fn reset(&mut self) {
33 self.image.reset();
34 self.hor.reset();
35 self.ver.reset();
36 self.scale.reset();
37 }
38}
39
40#[derive(Clone)]
41pub struct ObjectSettings<T, U> {
42 pub objects: Vec<ObjectLayerSettings<T, U>>,
43}
44
45impl<T: Default, U: From<f32>> ObjectSettings<T, U> {
46 pub fn common() -> Self {
47 Self {
48 objects: Vec::new(),
49 }
50 }
51
52 fn at(&mut self, i: usize) -> &mut ObjectLayerSettings<T, U> {
53 let settings = || ObjectLayerSettings {
54 image: Default::default(),
55 hor: 0.0.into(),
56 ver: 0.0.into(),
57 scale: 1.0.into(),
58 };
59
60 while i >= self.objects.len() {
61 self.objects.push(settings());
62 }
63
64 &mut self.objects[i]
65 }
66}
67
68pub type ObjectImageParameter = usize;
69
70#[derive(Clone, Debug, PartialEq, Eq, Hash)]
71pub struct ObjectLayoutParameter {
72 pub layer: usize,
73 pub layout: ObjectLayerLayoutParameter,
74}
75
76impl<T: Default, U: From<f32>> Settings<ObjectImageParameter> for ObjectSettings<T, U> {
77 type Value = T;
78
79 fn get_mut(&mut self, parameter: &ObjectImageParameter) -> &mut T {
80 &mut self.at(*parameter).image
81 }
82}
83
84impl<T: Default, U: From<f32>> Settings<ObjectLayoutParameter> for ObjectSettings<T, U> {
85 type Value = U;
86
87 fn get_mut(&mut self, parameter: &ObjectLayoutParameter) -> &mut U {
88 self.at(parameter.layer).get_mut(¶meter.layout)
89 }
90}
91
92impl<T: Resettable, U: Resettable> Resettable for ObjectSettings<T, U> {
93 fn reset(&mut self) {
94 for object in &mut self.objects {
95 object.reset();
96 }
97 }
98}