Struct zng::app::HeadlessApp
source · pub struct HeadlessApp { /* private fields */ }
Expand description
A headless app controller.
Headless apps don’t cause external side-effects like visible windows and don’t listen to system events. They can be used for creating apps like a command line app that renders widgets, or for creating integration tests.
You can start a headless app using AppExtended::run_headless
.
Implementations§
source§impl HeadlessApp
impl HeadlessApp
sourcepub fn block_on<A>(
&mut self,
handler: &mut (dyn AppHandler<A> + 'static),
args: &A,
timeout: Duration,
) -> Result<(), String>where
A: Clone + 'static,
pub fn block_on<A>(
&mut self,
handler: &mut (dyn AppHandler<A> + 'static),
args: &A,
timeout: Duration,
) -> Result<(), String>where
A: Clone + 'static,
Calls an AppHandler<A>
once and blocks until the update tasks started during the call complete.
This function spins until all update tasks are completed. Timers or send events can be received during execution but the loop does not sleep, it just spins requesting an update for each pass.
sourcepub fn block_on_multi<A>(
&mut self,
handlers: Vec<&mut (dyn AppHandler<A> + 'static)>,
args: &A,
timeout: Duration,
) -> Result<(), String>where
A: Clone + 'static,
pub fn block_on_multi<A>(
&mut self,
handlers: Vec<&mut (dyn AppHandler<A> + 'static)>,
args: &A,
timeout: Duration,
) -> Result<(), String>where
A: Clone + 'static,
Calls multiple AppHandler<A>
once each and blocks until all update tasks are complete.
This function spins until all update tasks are completed. Timers or send events can be received during execution but the loop does not sleep, it just spins requesting an update for each pass.
sourcepub fn block_on_fut<F>(
&mut self,
future: F,
timeout: Duration,
) -> Result<<F as Future>::Output, String>where
F: Future,
pub fn block_on_fut<F>(
&mut self,
future: F,
timeout: Duration,
) -> Result<<F as Future>::Output, String>where
F: Future,
Polls a future
and updates the app repeatedly until it completes or the timeout
is reached.
sourcepub fn doc_test<A, H>(args: A, handler: H)where
A: Clone + 'static,
H: AppHandler<A>,
pub fn doc_test<A, H>(args: A, handler: H)where
A: Clone + 'static,
H: AppHandler<A>,
Calls the handler
once and block_on
it with a 60 seconds timeout using the minimal headless app.
sourcepub fn doc_test_multi<A>(args: A, handlers: Vec<Box<dyn AppHandler<A>>>)where
A: Clone + 'static,
pub fn doc_test_multi<A>(args: A, handlers: Vec<Box<dyn AppHandler<A>>>)where
A: Clone + 'static,
Calls the handlers
once each and block_on_multi
with a 60 seconds timeout.
source§impl HeadlessApp
impl HeadlessApp
sourcepub fn renderer_enabled(&mut self) -> bool
pub fn renderer_enabled(&mut self) -> bool
If headless rendering is enabled.
When enabled windows are still not visible but frames will be rendered and the frame image can be requested.
Note that UiNode::render
is still called when a renderer is disabled and you can still
query the latest frame from WINDOWS.widget_tree
. The only thing that
is disabled is the actual renderer that converts display lists to pixels.
sourcepub fn update(&mut self, wait_app_event: bool) -> AppControlFlow
pub fn update(&mut self, wait_app_event: bool) -> AppControlFlow
Does updates unobserved.
See update_observed
for more details.
sourcepub fn update_observe(
&mut self,
on_update: impl FnMut(),
wait_app_event: bool,
) -> AppControlFlow
pub fn update_observe( &mut self, on_update: impl FnMut(), wait_app_event: bool, ) -> AppControlFlow
Does updates observing update
only.
See update_observed
for more details.
sourcepub fn update_observe_event(
&mut self,
on_event: impl FnMut(&mut EventUpdate),
wait_app_event: bool,
) -> AppControlFlow
pub fn update_observe_event( &mut self, on_event: impl FnMut(&mut EventUpdate), wait_app_event: bool, ) -> AppControlFlow
Does updates observing event
only.
See update_observed
for more details.
sourcepub fn update_observed<O>(
&mut self,
observer: &mut O,
wait_app_event: bool,
) -> AppControlFlowwhere
O: AppEventObserver,
pub fn update_observed<O>(
&mut self,
observer: &mut O,
wait_app_event: bool,
) -> AppControlFlowwhere
O: AppEventObserver,
Does updates with an AppEventObserver
.
If wait_app_event
is true
the thread sleeps until at least one app event is received or a timer elapses,
if it is false
only responds to app events already in the buffer.
sourcepub fn run_task<R, T>(
&mut self,
task: impl IntoFuture<IntoFuture = T>,
) -> Option<R>
pub fn run_task<R, T>( &mut self, task: impl IntoFuture<IntoFuture = T>, ) -> Option<R>
Execute the async task
in the UI thread, updating the app until it finishes or the app shuts-down.
Returns the task result if the app has not shut-down.
sourcepub fn has_exited(&self) -> bool
pub fn has_exited(&self) -> bool
If the app has exited.
Exited apps cannot update anymore. The app should be dropped to unload the app scope.
Trait Implementations§
source§impl HeadlessAppGestureExt for HeadlessApp
impl HeadlessAppGestureExt for HeadlessApp
source§impl HeadlessAppKeyboardExt for HeadlessApp
impl HeadlessAppKeyboardExt for HeadlessApp
source§fn on_keyboard_input(
&mut self,
window_id: WindowId,
code: KeyCode,
location: KeyLocation,
key: Key,
state: KeyState,
)
fn on_keyboard_input( &mut self, window_id: WindowId, code: KeyCode, location: KeyLocation, key: Key, state: KeyState, )
source§fn press_key(
&mut self,
window_id: WindowId,
code: KeyCode,
location: KeyLocation,
key: Key,
)
fn press_key( &mut self, window_id: WindowId, code: KeyCode, location: KeyLocation, key: Key, )
source§fn press_modified_key(
&mut self,
window_id: WindowId,
modifiers: ModifiersState,
code: KeyCode,
location: KeyLocation,
key: Key,
)
fn press_modified_key( &mut self, window_id: WindowId, modifiers: ModifiersState, code: KeyCode, location: KeyLocation, key: Key, )
source§impl HeadlessAppWindowExt for HeadlessApp
impl HeadlessAppWindowExt for HeadlessApp
source§fn open_window<F>(
&mut self,
new_window: impl IntoFuture<IntoFuture = F>,
) -> WindowId
fn open_window<F>( &mut self, new_window: impl IntoFuture<IntoFuture = F>, ) -> WindowId
source§fn focus_window(&mut self, window_id: WindowId)
fn focus_window(&mut self, window_id: WindowId)
source§fn blur_window(&mut self, window_id: WindowId)
fn blur_window(&mut self, window_id: WindowId)
source§fn window_frame_image(
&mut self,
window_id: WindowId,
mask: Option<ImageMaskMode>,
) -> ReadOnlyVar<Img, ArcVar<Img>>
fn window_frame_image( &mut self, window_id: WindowId, mask: Option<ImageMaskMode>, ) -> ReadOnlyVar<Img, ArcVar<Img>>
source§fn run_window<F>(&mut self, new_window: impl IntoFuture<IntoFuture = F>)
fn run_window<F>(&mut self, new_window: impl IntoFuture<IntoFuture = F>)
source§fn doc_test_window<F>(&mut self, new_window: impl IntoFuture<IntoFuture = F>)
fn doc_test_window<F>(&mut self, new_window: impl IntoFuture<IntoFuture = F>)
Auto Trait Implementations§
impl !Freeze for HeadlessApp
impl !RefUnwindSafe for HeadlessApp
impl !Send for HeadlessApp
impl !Sync for HeadlessApp
impl Unpin for HeadlessApp
impl !UnwindSafe for HeadlessApp
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more