From 4bf0607a11e9925c7804c85c0e7e6303fd61e7b4 Mon Sep 17 00:00:00 2001 From: hodasemi Date: Thu, 28 Mar 2024 08:32:06 +0100 Subject: [PATCH] Merge 2 gui builders --- src/builder/builder.rs | 50 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 44 insertions(+), 6 deletions(-) diff --git a/src/builder/builder.rs b/src/builder/builder.rs index 1364e68..52c70fc 100644 --- a/src/builder/builder.rs +++ b/src/builder/builder.rs @@ -1,5 +1,5 @@ use crate::prelude::*; -use anyhow::Result; +use anyhow::{bail, Result}; use assetpath::AssetPath; @@ -29,7 +29,7 @@ impl GuiBuilder { path, )?; - Self::_new(gui_handler, validator) + Ok(Arc::new(Self::_new(gui_handler, validator)?)) } pub fn from_str(gui_handler: &Arc, s: &str) -> Result> { @@ -39,11 +39,49 @@ impl GuiBuilder { s, )?; - Self::_new(gui_handler, validator) + Ok(Arc::new(Self::_new(gui_handler, validator)?)) + } + + pub fn merge<'a>( + gui_handler: &Arc, + pathes: impl IntoIterator, + ) -> Result> { + let mut me = Self { + grids: Default::default(), + default_select: Default::default(), + + ids: Default::default(), + + decline_callback: Default::default(), + }; + + for path in pathes.into_iter() { + let validator = Validator::new( + #[cfg(feature = "audio")] + gui_handler, + path, + )?; + + let builder = Self::_new(gui_handler, validator)?; + + me.grids.extend(builder.grids); + + if me.default_select.is_some() && builder.default_select.is_some() { + bail!("multiple default selects are not supported!"); + } + + if builder.default_select.is_some() { + me.default_select = builder.default_select; + } + + me.ids.extend(builder.ids); + } + + Ok(Arc::new(me)) } #[inline] - fn _new(gui_handler: &Arc, validator: Validator) -> Result> { + fn _new(gui_handler: &Arc, validator: Validator) -> Result { let root = validator.root(); let mut ids = HashMap::new(); @@ -71,14 +109,14 @@ impl GuiBuilder { Self::connect_custom_neighbours(&ids, custom_neighbours)?; - Ok(Arc::new(GuiBuilder { + Ok(GuiBuilder { grids, default_select: opt_default_select, ids, decline_callback: RwLock::new(None), - })) + }) } pub(crate) fn connect_custom_neighbours(