use crate::{
core::pool::Handle, font::FontResource, message::UiMessage, style::resource::StyleResource,
Control, RestrictionEntry, UiNode, UserInterface,
};
use fyrox_core::pool::{ObjectOrVariant, PoolError};
use fyrox_graph::SceneGraph;
use std::{
ops::{Index, IndexMut},
sync::mpsc::Sender,
};
pub struct BuildContext<'a> {
ui: &'a mut UserInterface,
pub style: StyleResource,
}
impl<U: ObjectOrVariant<UiNode>> Index<Handle<U>> for BuildContext<'_> {
type Output = U;
fn index(&self, index: Handle<U>) -> &U {
self.ui.try_get(index).unwrap()
}
}
impl<U: ObjectOrVariant<UiNode>> IndexMut<Handle<U>> for BuildContext<'_> {
fn index_mut(&mut self, index: Handle<U>) -> &mut Self::Output {
self.ui.try_get_mut(index).unwrap()
}
}
impl<'a> From<&'a mut UserInterface> for BuildContext<'a> {
fn from(ui: &'a mut UserInterface) -> Self {
Self {
style: ui.style.clone(),
ui,
}
}
}
impl BuildContext<'_> {
pub fn default_font(&self) -> FontResource {
self.ui.default_font.clone()
}
pub fn sender(&self) -> Sender<UiMessage> {
self.ui.sender()
}
pub fn add_node(&mut self, node: UiNode) -> Handle<UiNode> {
self.ui.add_node(node)
}
pub fn add<T: Control>(&mut self, node: T) -> Handle<T> {
self.ui.add_node(UiNode::new(node)).transmute()
}
pub fn link(
&mut self,
child: Handle<impl ObjectOrVariant<UiNode>>,
parent: Handle<impl ObjectOrVariant<UiNode>>,
) {
self.ui.link_nodes(child, parent, false)
}
pub fn copy(&mut self, node: Handle<UiNode>) -> Handle<UiNode> {
self.ui.copy_node(node)
}
pub fn try_get_node(&self, node: Handle<UiNode>) -> Result<&UiNode, PoolError> {
self.ui.try_get_node(node)
}
pub fn try_get_node_mut(&mut self, node: Handle<UiNode>) -> Result<&mut UiNode, PoolError> {
self.ui.nodes.try_borrow_mut(node)
}
pub fn push_picking_restriction(&mut self, restriction: RestrictionEntry) {
self.ui.push_picking_restriction(restriction)
}
pub fn remove_picking_restriction(&mut self, node: Handle<UiNode>) {
self.ui.remove_picking_restriction(node)
}
pub fn inner(&self) -> &UserInterface {
self.ui
}
pub fn inner_mut(&mut self) -> &mut UserInterface {
self.ui
}
pub fn send_message(&self, message: UiMessage) {
self.ui.send_message(message);
}
}