use std::error::Error; use crate::core::app::context::ApplicationContext; use super::Scene; pub struct SceneManager { scenes: Vec>, current_scene_index: Option, } impl SceneManager { pub fn new() -> Self { Self { scenes: Vec::new(), current_scene_index: None, } } pub fn load_scene(&mut self, scene: Box) { self.scenes.push(scene); self.current_scene_index = Some(self.scenes.len() - 1); } pub fn replace_current_scene(&mut self, scene: Box) { if let Some(index) = self.current_scene_index { if index < self.scenes.len() { self.scenes[index].unload(); self.scenes[index] = scene; } } else { self.load_scene(scene); } } pub fn current_scene(&self) -> Option<&Box> { if let Some(index) = self.current_scene_index { self.scenes.get(index) } else { None } } pub fn current_scene_mut(&mut self) -> Option<&mut Box> { if let Some(index) = self.current_scene_index { self.scenes.get_mut(index) } else { None } } pub fn load_scene_if_not_loaded( &mut self, app_context: &mut ApplicationContext, ) -> Result<(), Box> { if let Some(scene) = self.current_scene_mut() { if !scene.loaded() { scene.load(app_context)?; } } else { log::warn!("No scene found in SceneManager!"); } Ok(()) } }