use std::marker::PhantomData;
use bevy_ecs::prelude::*;
use bevy_state::state::FreelyMutableState;
use crate::prelude::*;
#[derive(Component, Debug, Clone, PartialEq, Eq)]
pub struct ProgressEntity<S: FreelyMutableState> {
pub visible: Progress,
pub hidden: HiddenProgress,
_pd: PhantomData<S>,
}
impl<S: FreelyMutableState> Default for ProgressEntity<S> {
fn default() -> Self {
Self {
visible: Progress::default(),
hidden: HiddenProgress::default(),
_pd: PhantomData,
}
}
}
impl<S: FreelyMutableState> ProgressEntity<S> {
pub fn new() -> Self {
Default::default()
}
pub fn with_progress(mut self, done: u32, total: u32) -> Self {
self.visible.done = done;
self.visible.total = total;
self
}
pub fn with_hidden_progress(mut self, done: u32, total: u32) -> Self {
self.hidden.done = done;
self.hidden.total = total;
self
}
}
pub(crate) fn apply_progress_from_entities<S: FreelyMutableState>(
tracker: Res<ProgressTracker<S>>,
q: Query<&ProgressEntity<S>>,
) {
let sum = q.iter().fold(
(Progress::default(), HiddenProgress::default()),
|sum, pfs| {
(sum.0 + pfs.visible, sum.1 + pfs.hidden)
},
);
tracker.set_sum_entities(sum.0, sum.1);
}