use crate::{Application, Interface, Tree};
use crate::tree::NodeId;
use crate::interface::{view, Element, View};
pub mod headless;
pub use headless::Headless;
#[cfg(feature="curses")]
#[cfg_attr(docsrs, doc(cfg(feature="curses")))]
pub mod curses;
#[cfg(feature="curses")]
#[cfg_attr(docsrs, doc(cfg(feature="curses")))]
pub use self::curses::Curses;
#[cfg(feature="opengl")]
#[cfg_attr(docsrs, doc(cfg(feature="opengl")))]
pub mod opengl;
#[cfg(feature="opengl")]
#[cfg_attr(docsrs, doc(cfg(feature="opengl")))]
pub use self::opengl::Opengl;
#[cfg(feature="fmod")]
#[cfg_attr(docsrs, doc(cfg(feature="fmod")))]
pub mod fmod;
#[cfg(feature="fmod")]
#[cfg_attr(docsrs, doc(cfg(feature="fmod")))]
pub use self::fmod::Fmod;
pub trait Presentation {
fn make_interface <A : Application> () -> Interface <A, Self> where Self : Sized {
Interface::with_root (Element::default())
}
fn with_root (root : View, root_id : NodeId) -> Self;
fn get_input (&mut self, input_buffer : &mut Vec <view::Input>);
fn display_view <V : AsRef <View>> (&mut self,
view_tree : &Tree <V>,
display_values : std::vec::Drain <(NodeId, view::Display)>);
}
pub trait Graphics : Presentation { }
pub trait Audio : Presentation { }
pub trait HasGraphics <G : Graphics> {
fn graphics (&mut self) -> &mut G;
}
#[derive(Debug)]
#[expect(clippy::type_complexity)]
pub struct Composite <G : Graphics, A : Audio> {
pub graphics : G,
pub audio : A,
display_buffers : (Vec <(NodeId, view::Display)>, Vec <(NodeId, view::Display)>)
}
impl <G, A> Presentation for Composite <G, A> where
G : Graphics,
A : Audio
{
fn make_interface <APP : Application> () -> Interface <APP, Self> where Self : Sized {
let graphical = G::make_interface();
let root = graphical.root_node().data().view.clone();
let root_id = graphical.root_id().clone();
graphical.swap_presentation (|graphics| {
let audio = A::with_root (root, root_id);
let display_buffers = (vec![], vec![]);
Composite { graphics, audio, display_buffers }
})
}
fn with_root (root : View, root_id : NodeId) -> Self {
let graphics = G::with_root (root.clone(), root_id.clone());
let audio = A::with_root (root, root_id);
let display_buffers = (vec![], vec![]);
Composite { graphics, audio, display_buffers }
}
fn get_input (&mut self, input_buffer : &mut Vec <view::Input>) {
self.graphics.get_input (input_buffer);
self.audio.get_input (input_buffer);
}
fn display_view <V : AsRef <View>> (&mut self,
view_tree : &Tree <V>,
display_values : std::vec::Drain <(NodeId, view::Display)>
) {
self.display_buffers.0 = display_values.collect();
self.display_buffers.1 = self.display_buffers.0.clone();
self.graphics.display_view (view_tree, self.display_buffers.0.drain(..));
self.audio.display_view (view_tree, self.display_buffers.1.drain(..));
}
}
impl <G, A> HasGraphics <G> for Composite <G, A> where
G : Graphics,
A : Audio
{
fn graphics (&mut self) -> &mut G {
&mut self.graphics
}
}
impl <G : Graphics> HasGraphics <G> for G {
fn graphics (&mut self) -> &mut G {
self
}
}