use std::{ marker::PhantomData, sync::{Arc, Weak}, }; use crate::*; pub trait ContentWrapper: ContentUpdate + Send + Sync { fn refresh(&mut self, world: &mut World) -> Result<()>; fn next_tab(&mut self, world: &mut World, hero: Entity) -> Result<()>; fn previous_tab(&mut self, world: &mut World, hero: Entity) -> Result<()>; fn base(&self) -> &Arc; fn is_empty(&self) -> bool; } pub trait ContentUpdate { fn update(&mut self, world: &mut World, hero: Entity) -> Result<()>; fn select(&self, world: &mut World) -> Result<()>; } pub struct Content { pub reference: Weak, base: Arc, data: Vec, on_enable: Box Result> + Send + Sync + 'static>, page: usize, pages: usize, ability_marker: PhantomData, } impl Content { pub fn new( world: &mut World, reference: Weak, on_enable: F, ) -> Result where F: Fn(&mut World) -> Result> + Send + Sync + 'static, P: Page, { let base = GuiSnippet::from_str(world, include_str!("../resources/content.xml"))?; let mut resources = world.resources.multi_mut(); let gui_handler = resources.get::(); let engine_settings = resources.get::(); let context = resources.get::(); let left: Arc