use std::{ marker::PhantomData, sync::{Arc, Weak}, }; use crate::*; pub trait ContentWrapper: ContentUpdate + Send + Sync { fn refresh(&mut self) -> Result<()>; fn next_tab(&mut self, engine: &Arc, hero: Entity) -> Result<()>; fn previous_tab(&mut self, engine: &Arc, hero: Entity) -> Result<()>; fn base(&self) -> &Arc; fn is_empty(&self) -> bool; } pub trait ContentUpdate { fn update(&mut self, engine: &Arc, hero: Entity) -> Result<()>; fn select(&self) -> 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( engine: &Arc, reference: Weak, on_enable: F, ) -> Result where F: Fn() -> Result> + Send + Sync + 'static, P: Page, { let base = GuiSnippet::from_str( engine.gui_handler(), include_str!("../resources/content.xml"), )?; let left: Arc