Struct raui_core::application::Application
source · pub struct Application {
pub view_models: ViewModelCollection,
pub animations_delta_time: Scalar,
/* private fields */
}Expand description
Contains and orchestrates application layout, animations, interactions, etc.
See the application module for more information and examples.
Fields§
§view_models: ViewModelCollection§animations_delta_time: ScalarThe amount of time between the last update, used when calculating animation progress
Implementations§
source§impl Application
impl Application
sourcepub fn setup<F>(&mut self, f: F)where
F: FnMut(&mut Self),
pub fn setup<F>(&mut self, f: F)where F: FnMut(&mut Self),
Setup the application with a given a setup function
We need to run the setup function for the application to register components and
properties if we want to support serialization of the UI. We pass it a function that will do
the actual registration.
Note: RAUI will work fine without running any
setupif UI serialization is not required.
Example
application.setup(setup /* the core setup function from the RAUI prelude */);If you use crates like the raui_material crate you will want to call it’s setup function
as well.
application.setup(raui_material::setup);pub fn notifier(&self) -> ChangeNotifier
sourcepub fn register_component(&mut self, type_name: &str, processor: FnWidget)
pub fn register_component(&mut self, type_name: &str, processor: FnWidget)
Register’s a component under a string name used when serializing the UI
This function is often used in setup functions for registering batches of
components.
Example
fn my_widget(ctx: WidgetContext) -> WidgetNode {
todo!("make awesome widget");
}
fn setup_widgets(app: &mut Application) {
app.register_component("my_widget", FnWidget::pointer(my_widget));
}
let mut application = Application::default();
application.setup(setup_widgets);sourcepub fn unregister_component(&mut self, type_name: &str)
pub fn unregister_component(&mut self, type_name: &str)
Unregisters a component
sourcepub fn register_props<T>(&mut self, name: &str)where
T: 'static + Prefab + PropsData,
pub fn register_props<T>(&mut self, name: &str)where T: 'static + Prefab + PropsData,
Register’s a property type under a string name used when serializing the UI
This function is often used in setup functions for registering batches of
properties.
Example
#[derive(PropsData, Debug, Default, Copy, Clone, Serialize, Deserialize)]
struct MyProp {
awesome: bool,
}
fn setup_properties(app: &mut Application) {
app.register_props::<MyProp>("MyProp");
}
let mut application = Application::default();
application.setup(setup_properties);sourcepub fn unregister_props(&mut self, name: &str)
pub fn unregister_props(&mut self, name: &str)
Unregisters a property type
See register_props
sourcepub fn serialize_props(&self, props: &Props) -> Result<PrefabValue, PrefabError>
pub fn serialize_props(&self, props: &Props) -> Result<PrefabValue, PrefabError>
Serialize the given Props to a PrefabValue
sourcepub fn deserialize_props(&self, data: PrefabValue) -> Result<Props, PrefabError>
pub fn deserialize_props(&self, data: PrefabValue) -> Result<Props, PrefabError>
Deserialize Props from a PrefabValue
sourcepub fn serialize_node(
&self,
data: &WidgetNode
) -> Result<PrefabValue, ApplicationError>
pub fn serialize_node( &self, data: &WidgetNode ) -> Result<PrefabValue, ApplicationError>
Serialize a WidgetNode to a PrefabValue
sourcepub fn deserialize_node(
&self,
data: PrefabValue
) -> Result<WidgetNode, ApplicationError>
pub fn deserialize_node( &self, data: PrefabValue ) -> Result<WidgetNode, ApplicationError>
Deserialize a WidgetNode from a PrefabValue
sourcepub fn last_invalidation_cause(&self) -> &InvalidationCause
pub fn last_invalidation_cause(&self) -> &InvalidationCause
Get the reason that the application state was last invalidated and caused to re-process
sourcepub fn dirty(&self) -> &WidgetIdCommon
pub fn dirty(&self) -> &WidgetIdCommon
Return’s common root widget ID of widgets that has to be to be re-processed
sourcepub fn mark_dirty(&mut self)
pub fn mark_dirty(&mut self)
Force mark the application as needing to re-process its root
pub fn does_render_changed(&self) -> bool
sourcepub fn tree(&self) -> &WidgetNode
pub fn tree(&self) -> &WidgetNode
Get the WidgetNode for the application tree
sourcepub fn rendered_tree(&self) -> &WidgetUnit
pub fn rendered_tree(&self) -> &WidgetUnit
Get the application widget tree rendered to raw WidgetUnit’s
sourcepub fn layout_data(&self) -> &Layout
pub fn layout_data(&self) -> &Layout
Get the application Layout data
pub fn has_layout_widget(&self, id: &WidgetId) -> bool
sourcepub fn apply(&mut self, tree: impl Into<WidgetNode>)
pub fn apply(&mut self, tree: impl Into<WidgetNode>)
Update the application widget tree
sourcepub fn render<R, T, E>(
&self,
mapping: &CoordsMapping,
renderer: &mut R
) -> Result<T, E>where
R: Renderer<T, E>,
pub fn render<R, T, E>( &self, mapping: &CoordsMapping, renderer: &mut R ) -> Result<T, E>where R: Renderer<T, E>,
Render the application
sourcepub fn render_change<R, T, E>(
&mut self,
mapping: &CoordsMapping,
renderer: &mut R
) -> Result<Option<T>, E>where
R: Renderer<T, E>,
pub fn render_change<R, T, E>( &mut self, mapping: &CoordsMapping, renderer: &mut R ) -> Result<Option<T>, E>where R: Renderer<T, E>,
Render the application, but only if something effecting the rendering has changed and it needs to be re-rendered
sourcepub fn layout<L, E>(
&mut self,
mapping: &CoordsMapping,
layout_engine: &mut L
) -> Result<(), E>where
L: LayoutEngine<E>,
pub fn layout<L, E>( &mut self, mapping: &CoordsMapping, layout_engine: &mut L ) -> Result<(), E>where L: LayoutEngine<E>,
Calculate application layout
sourcepub fn layout_change<L, E>(
&mut self,
mapping: &CoordsMapping,
layout_engine: &mut L
) -> Result<bool, E>where
L: LayoutEngine<E>,
pub fn layout_change<L, E>( &mut self, mapping: &CoordsMapping, layout_engine: &mut L ) -> Result<bool, E>where L: LayoutEngine<E>,
Calculate application layout, but only if something effecting application layout has changed and the layout needs to be re-done
sourcepub fn interact<I, R, E>(&mut self, interactions_engine: &mut I) -> Result<R, E>where
I: InteractionsEngine<R, E>,
pub fn interact<I, R, E>(&mut self, interactions_engine: &mut I) -> Result<R, E>where I: InteractionsEngine<R, E>,
Perform interactions on the application using the given interaction engine
sourcepub fn send_message<T>(&mut self, id: &WidgetId, data: T)where
T: 'static + MessageData,
pub fn send_message<T>(&mut self, id: &WidgetId, data: T)where T: 'static + MessageData,
Send a message to the given widget
sourcepub fn send_message_raw(&mut self, id: &WidgetId, data: Message)
pub fn send_message_raw(&mut self, id: &WidgetId, data: Message)
Send raw message data to the given widget
sourcepub fn consume_signals(&mut self) -> Vec<Signal>
pub fn consume_signals(&mut self) -> Vec<Signal>
Get the list of signals that have been sent by widgets, consuming the current list so that further calls will not include previously sent signals
sourcepub fn state_write(&mut self, id: &WidgetId, data: Props)
pub fn state_write(&mut self, id: &WidgetId, data: Props)
Set the props of a given widget
sourcepub fn state_mutate<F>(&mut self, id: &WidgetId, f: F)where
F: FnMut(&Props) -> Props,
pub fn state_mutate<F>(&mut self, id: &WidgetId, f: F)where F: FnMut(&Props) -> Props,
Get read access to the given widget’s Props in a closure and update the widget’s props
to the props that were returned by the closure
sourcepub fn state_mutate_cloned<F>(&mut self, id: &WidgetId, f: F)where
F: FnMut(&mut Props),
pub fn state_mutate_cloned<F>(&mut self, id: &WidgetId, f: F)where F: FnMut(&mut Props),
Get mutable access to the cloned Props of a widget in a closure and update the widget’s
props to the value of the clone props after the closure modifies them
sourcepub fn forced_process(&mut self) -> bool
pub fn forced_process(&mut self) -> bool
process() application, even if no changes have been detected
sourcepub fn process(&mut self) -> bool
pub fn process(&mut self) -> bool
Process the application.
Example
const APP_DATA: &str = "app-data";
const COUNTER: &str = "counter";
/// Some sort of application data.
struct AppData {
counter: ViewModelValue<i32>,
}
// Make view-model of that data.
let mut view_model = ViewModel::produce(|properties| {
AppData {
counter: ViewModelValue::new(0, properties.notifier(COUNTER)),
}
});
// Get handle to view-model data for access on host side.
// This handle is valid as long as it's view-model is alive.
let mut app_data = view_model.lazy::<AppData>().unwrap();
let mut app = Application::default();
app.view_models.insert(APP_DATA.to_owned(), view_model);
// Do application stuff like interactions, layout, etc...
// Now we call `process` with our process context
app.process();Now, in our components we can access the AppData from view-model
through the widget’s WidgetContext.
fn my_component(mut ctx: WidgetContext) -> WidgetNode {
let mut data = ctx
.view_models
.view_model_mut::<AppData>(APP_DATA)
.unwrap();
*data.counter += 1;
// widget stuff...
}