mod collatable_container ; mod component ; mod utility ; use futures :: * ; use futures :: future :: * ; use gtk4 :: Orientation :: * ; use gtk4 :: prelude :: * ; use libadwaita :: * ; use libadwaita :: prelude :: * ; use libadwaita :: ViewSwitcherPolicy :: * ; use crate :: data_manager :: * ; use crate :: ui :: collatable_container :: * ; use crate :: ui :: component :: * ; use crate :: ui :: utility :: * ; use crate :: utility :: * ; pub struct UI { films_component : CollatableMediaContainer , series_component : CollatableMediaContainer , } impl UI { pub fn new ( window : & 'static Window , get_film_details : impl Fn (String) -> BoxFuture < 'static , FilmDetails > + 'static , ) -> UI { let get_film_details = leak (get_film_details) ; let films_component = CollatableMediaContainer :: :: new ( |film| { glib :: spawn_future_local ( async { let film_details = get_film_details ( film . uuid ) . await ; dialog ! ( & g_box ! ( @ option_children ; @ orientation : Vertical ; @ css_classes : & [ "media-modal" ] ; Some ( label ! ( @ css_classes : & [ "title-1" ] ; film_details . name . as_str () , ) ) . as_ref () , film_details . original_name . map ( |original_name| label ! ( original_name . as_str () ) , ) . as_ref () , Some ( label ! ( @ css_classes : & [ "top-padding" ] ; & format ! ( "Release date: {}" , film_details . release_date ) , ) ) . as_ref () , ) , ) . present ( Some ( & window . libadwaita_window ) ) } ) ; } ) ; let series_component = CollatableMediaContainer :: :: new ( |series| dialog ! () . present ( Some ( & window . libadwaita_window ) ) , ) ; let switched = view_stack ! ( ( "Films" , "camera-video-symbolic" , films_component . get_widget () ) , ( "Series" , "video-display-symbolic" , series_component . get_widget () ) , ) ; let header_bar = header_bar ! ( & view_switcher ! ( @ policy : Wide ; & switched ) , ) ; window . libadwaita_window . set_content ( Some ( & toolbar_view ! ( @ top_bar : & header_bar ; & switched ) , ) ) ; UI { films_component , series_component } } pub async fn render_collection_overview ( & self , collection : CollectionOverview ) { join ! ( self . films_component . set_media ( collection . films ) , self . series_component . set_media ( collection . series ) , ) ; } } pub struct Window { libadwaita_window : ApplicationWindow , } impl Window { pub fn new (application : & Application ) -> Self { let libadwaita_window = ApplicationWindow :: builder () . application (application) . title ("Zoƶdex") . build () ; Self { libadwaita_window } } pub fn show ( & self ) { self . libadwaita_window . set_visible (true) } pub fn close ( & self ) { self . libadwaita_window . close () } }