// Copyright 2022 System76 // SPDX-License-Identifier: MPL-2.0 mod app_runner; mod component; mod handle; mod macros; use gtk4::prelude::*; use tokio::sync::mpsc; pub use self::app_runner::AppRunner; pub use self::component::Component; pub use self::handle::{Handle, Registered}; pub use gtk4 as gtk; pub use relm4_macros::view; pub type Sender = mpsc::UnboundedSender; pub type Receiver = mpsc::UnboundedReceiver; /// Provides a convenience function for getting a widget out of a type. pub trait Widget { fn widget(&self) -> &W; } /// Convenience function for `Component::register()`. pub fn register( model: C, args: C::InitialArgs, ) -> Registered { model.register(args) } /// Convenience function for forwarding events from a receiver to different sender. pub fn forward O) + 'static>( mut receiver: Receiver, sender: Sender, transformer: F, ) { spawn_local(async move { while let Some(event) = receiver.recv().await { if sender.send(transformer(event)).is_err() { break; } } }) } /// Convenience function for spawning tasks on the local executor pub fn spawn_local + 'static>(func: F) { gtk4::glib::MainContext::default().spawn_local(func); }