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