use bevy_ecs::{
change_detection::{DetectChanges as _, DetectChangesMut as _},
system::{Res, ResMut},
world::{Mut, Ref},
};
use crate::reflect::CVarMeta;
trait Sealed {}
impl<T: CVarMeta> Sealed for Ref<'_, T> {}
impl<T: CVarMeta> Sealed for Res<'_, T> {}
impl<T: CVarMeta> Sealed for Mut<'_, T> {}
impl<T: CVarMeta> Sealed for ResMut<'_, T> {}
#[allow(private_bounds)]
pub trait IsDefault: Sealed {
fn is_default(&self) -> bool;
}
pub trait IsDefaultMut: IsDefault {
fn set_is_default(&mut self);
fn reset_to_default(&mut self);
}
impl<T: CVarMeta> IsDefault for Ref<'_, T> {
fn is_default(&self) -> bool {
self.added() == self.last_changed()
}
}
impl<T: CVarMeta> IsDefault for Res<'_, T> {
fn is_default(&self) -> bool {
self.added() == self.last_changed()
}
}
impl<T: CVarMeta> IsDefault for ResMut<'_, T> {
fn is_default(&self) -> bool {
self.added() == self.last_changed()
}
}
impl<T: CVarMeta> IsDefault for Mut<'_, T> {
fn is_default(&self) -> bool {
self.added() == self.last_changed()
}
}
impl<T: CVarMeta> IsDefaultMut for Mut<'_, T> {
fn set_is_default(&mut self) {
self.set_added();
}
fn reset_to_default(&mut self) {
T::set_to_default(self.as_mut());
self.set_added();
}
}
impl<T: CVarMeta> IsDefaultMut for ResMut<'_, T> {
fn set_is_default(&mut self) {
self.set_added();
}
fn reset_to_default(&mut self) {
T::set_to_default(self.as_mut());
self.set_added();
}
}