2024-11-26 17:20:53 +01:00
|
|
|
mod collatable_container ;
|
2024-11-27 15:22:55 +01:00
|
|
|
mod component ;
|
2024-11-20 16:32:37 +01:00
|
|
|
mod utility ;
|
|
|
|
|
2025-02-12 10:27:29 +01:00
|
|
|
use futures :: * ;
|
2025-02-18 17:40:37 +01:00
|
|
|
use futures :: future :: * ;
|
2025-02-05 14:57:07 +01:00
|
|
|
use gtk4 :: Orientation :: * ;
|
|
|
|
use gtk4 :: prelude :: * ;
|
|
|
|
use libadwaita :: * ;
|
2025-02-12 14:11:53 +01:00
|
|
|
use libadwaita :: prelude :: * ;
|
2025-02-10 23:56:48 +01:00
|
|
|
use libadwaita :: ViewSwitcherPolicy :: * ;
|
2024-11-20 16:32:37 +01:00
|
|
|
|
2025-02-05 14:57:07 +01:00
|
|
|
use crate :: data_manager :: * ;
|
|
|
|
use crate :: ui :: collatable_container :: * ;
|
|
|
|
use crate :: ui :: component :: * ;
|
|
|
|
use crate :: ui :: utility :: * ;
|
2025-02-12 14:11:53 +01:00
|
|
|
use crate :: utility :: * ;
|
2024-11-20 16:32:37 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pub struct UI {
|
2025-02-10 23:56:48 +01:00
|
|
|
films_component : CollatableMediaContainer <FilmsAdapter> ,
|
|
|
|
series_component : CollatableMediaContainer <SeriesAdapter> ,
|
2024-11-20 16:32:37 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
impl UI {
|
2025-02-18 17:40:37 +01:00
|
|
|
pub fn new (
|
|
|
|
window : & 'static ApplicationWindow ,
|
|
|
|
get_film_details : impl Fn (String) -> BoxFuture < 'static , FilmDetails > + 'static ,
|
|
|
|
) -> UI {
|
|
|
|
let get_film_details = leak (get_film_details) ;
|
2025-02-12 14:11:53 +01:00
|
|
|
|
2025-02-18 17:40:37 +01:00
|
|
|
let films_component = CollatableMediaContainer :: <FilmsAdapter> :: new ( |film| {
|
|
|
|
glib :: spawn_future_local ( async {
|
|
|
|
let film_details = get_film_details ( film . uuid ) . await ;
|
2025-02-12 15:59:54 +01:00
|
|
|
|
2025-02-18 17:40:37 +01:00
|
|
|
dialog ! (
|
|
|
|
& g_box ! (
|
|
|
|
@ option_children ;
|
|
|
|
@ orientation : Vertical ;
|
|
|
|
@ css_classes : & [ "media-modal" ] ;
|
2025-02-12 15:59:54 +01:00
|
|
|
|
2025-02-18 17:40:37 +01:00
|
|
|
Some ( label ! (
|
|
|
|
@ css_classes : & [ "title-1" ] ;
|
|
|
|
film_details . name . as_str () ,
|
|
|
|
) ) . as_ref () ,
|
2025-02-12 15:59:54 +01:00
|
|
|
|
2025-02-18 17:40:37 +01:00
|
|
|
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) )
|
|
|
|
|
|
|
|
} ) ;
|
|
|
|
} ) ;
|
2025-02-12 14:11:53 +01:00
|
|
|
let series_component = CollatableMediaContainer :: <SeriesAdapter> :: new (
|
|
|
|
|series| dialog ! () . present ( Some (window) ) ,
|
|
|
|
) ;
|
|
|
|
let switched = view_stack ! (
|
2025-02-10 23:56:48 +01:00
|
|
|
( "Films" , "camera-video-symbolic" , films_component . get_widget () ) ,
|
|
|
|
( "Series" , "video-display-symbolic" , series_component . get_widget () ) ,
|
|
|
|
) ;
|
|
|
|
let header_bar = header_bar ! (
|
2025-02-12 14:11:53 +01:00
|
|
|
& view_switcher ! ( @ policy : Wide ; & switched ) ,
|
2025-02-10 23:56:48 +01:00
|
|
|
) ;
|
2024-11-27 15:22:55 +01:00
|
|
|
|
2025-02-12 14:11:53 +01:00
|
|
|
window . set_content ( Some (
|
|
|
|
& toolbar_view ! ( @ top_bar : & header_bar ; & switched ) ,
|
|
|
|
) ) ;
|
2024-11-20 16:32:37 +01:00
|
|
|
|
2025-02-18 17:40:37 +01:00
|
|
|
UI { films_component , series_component }
|
2024-11-20 16:32:37 +01:00
|
|
|
}
|
|
|
|
|
2025-02-05 13:51:22 +01:00
|
|
|
pub async fn render_collection_overview ( & self , collection : CollectionOverview ) {
|
2025-02-12 10:27:29 +01:00
|
|
|
join ! (
|
|
|
|
self . films_component . set_media ( collection . films ) ,
|
|
|
|
self . series_component . set_media ( collection . series ) ,
|
|
|
|
) ;
|
2024-11-20 16:32:37 +01:00
|
|
|
}
|
|
|
|
}
|