use super::impl_terminal_builder_methods;
use super::impl_ui_builder_methods;
use super::InternalBuilder;
use crate::system::RuntimeManager;
use crate::ui::common::traits::Control;
use crate::ui::common::traits::NotModalWindow;
use crate::ui::common::traits::WindowControl;
type WindowFactory = Box<dyn FnOnce(&mut RuntimeManager)>;
pub struct MultiWindowAppBuilder {
builder: InternalBuilder,
window_factories: Vec<WindowFactory>,
}
impl MultiWindowAppBuilder {
pub(crate) fn new() -> Self {
Self {
builder: InternalBuilder::new(),
window_factories: Vec::new(),
}
}
#[inline(always)]
pub fn desktop<T>(mut self, desktop: T) -> Self
where
T: crate::ui::common::traits::Control + crate::ui::common::traits::DesktopControl + 'static,
{
self.builder.desktop(desktop);
self
}
pub fn window<F, T>(mut self, factory: F) -> Self
where
F: FnOnce() -> T + 'static,
T: Control + WindowControl + NotModalWindow + 'static,
{
self.window_factories.push(Box::new(move |rt: &mut RuntimeManager| {
let _ = rt.add_window(factory()); }));
self
}
#[inline(always)]
pub fn run(mut self) -> Result<(), crate::system::Error> {
let app = self.builder.build()?;
for factory in self.window_factories.drain(..) {
factory(RuntimeManager::get());
}
app.start_app()
}
impl_terminal_builder_methods!();
impl_ui_builder_methods!();
}