From a9ec7bdcc9c866fd584903103b976a3917f4d942 Mon Sep 17 00:00:00 2001 From: Reinout Meliesie Date: Fri, 7 Feb 2025 15:19:41 +0100 Subject: [PATCH] g_box UI macro can now take inline conditional children --- src/ui/collatable_container/collated_grid.rs | 62 +++++++++-------- src/ui/utility.rs | 72 +++++++++++++------- 2 files changed, 81 insertions(+), 53 deletions(-) diff --git a/src/ui/collatable_container/collated_grid.rs b/src/ui/collatable_container/collated_grid.rs index 7c42e8b..ac65b14 100644 --- a/src/ui/collatable_container/collated_grid.rs +++ b/src/ui/collatable_container/collated_grid.rs @@ -156,46 +156,48 @@ async fn create_collection_item ( poster_file_path : Option < & Path > , details_widget : & Box , ) -> Box { - let container = g_box ! ( + g_box ! ( + @ option_children ; @ orientation : Vertical ; @ margin_top : 20 ; @ margin_bottom : 20 ; - ) ; - if let Some (poster_file_path) = poster_file_path { - let poster_file_path = PathBuf :: from (poster_file_path) ; // God forbid `Path` would work with `clone ! ()` - let poster_texture = spawn_blocking ( move || - Texture :: from_filename (poster_file_path) . unwrap () - ) . await . unwrap () ; + match poster_file_path { + Some (poster_file_path) => { + let poster_file_path = PathBuf :: from (poster_file_path) ; // God forbid `Path` would work with `clone ! ()` + let poster_texture = spawn_blocking ( move || + Texture :: from_filename (poster_file_path) . unwrap () + ) . await . unwrap () ; + Some ( image ! ( + @ paintable : & poster_texture ; + @ width_request : 300 ; + @ height_request : 300 ; + @ margin_bottom : 10 ; + ) ) + } , + None => None , + } . as_ref () , - container . append ( & image ! ( - @ paintable : & poster_texture ; - @ width_request : 300 ; - @ height_request : 300 ; - @ margin_bottom : 10 ; - ) ) ; - } - - container . append ( & label ! ( - @ justify : Justification :: Center ; - @ wrap : true ; - @ max_width_chars : 1 ; // Not the actual limit, used instead to wrap more aggressively - @ attributes : & pango_attributes ! ( @ scale : SCALE_LARGE ; @ weight : Bold ; ) ; - name , - ) ) ; - - if let Some (original_name) = original_name { - container . append ( & label ! ( + Some ( & label ! ( @ justify : Justification :: Center ; @ wrap : true ; @ max_width_chars : 1 ; // Not the actual limit, used instead to wrap more aggressively - original_name , - ) ) ; - } + @ attributes : & pango_attributes ! ( @ scale : SCALE_LARGE ; @ weight : Bold ; ) ; + name , + ) ) , - container . append (details_widget) ; + match original_name { + Some (original_name) => Some ( label ! ( + @ justify : Justification :: Center ; + @ wrap : true ; + @ max_width_chars : 1 ; // Not the actual limit, used instead to wrap more aggressively + original_name , + ) ) , + None => None , + } . as_ref () , - container + Some (details_widget) , + ) } fn create_film_details ( film : & FilmOverview ) -> Box { diff --git a/src/ui/utility.rs b/src/ui/utility.rs index 4b2a9c5..07b04b8 100644 --- a/src/ui/utility.rs +++ b/src/ui/utility.rs @@ -22,29 +22,55 @@ macro_rules ! label { ( label } } } -macro_rules ! g_box { ( - $ ( @ orientation : $ orientation : expr ; ) ? - $ ( @ halign : $ halign : expr ; ) ? - $ ( @ valign : $ valign : expr ; ) ? - $ ( @ spacing : $ spacing : expr ; ) ? - $ ( @ margin_top : $ margin_top : expr ; ) ? - $ ( @ margin_bottom : $ margin_bottom : expr ; ) ? - $ ( @ widget_name : $ widget_name : expr ; ) ? - $ ( @ css_classes : $ css_classes : expr ; ) ? - $ ( $ child : expr ) , * $ (,) ? -) => { { - let container = gtk4 :: Box :: builder () . build () ; - $ ( container . set_orientation ( $ orientation ) ; ) ? - $ ( container . set_halign ( $ halign ) ; ) ? - $ ( container . set_valign ( $ valign ) ; ) ? - $ ( container . set_spacing ( $ spacing ) ; ) ? - $ ( container . set_margin_top ( $ margin_top ) ; ) ? - $ ( container . set_margin_bottom ( $ margin_bottom ) ; ) ? - $ ( container . set_widget_name ( $ widget_name ) ; ) ? - $ ( container . set_css_classes ( $ css_classes ) ; ) ? - $ ( container . append ( $ child ) ; ) * - container -} } } +macro_rules ! g_box { + ( + $ ( @ orientation : $ orientation : expr ; ) ? + $ ( @ halign : $ halign : expr ; ) ? + $ ( @ valign : $ valign : expr ; ) ? + $ ( @ spacing : $ spacing : expr ; ) ? + $ ( @ margin_top : $ margin_top : expr ; ) ? + $ ( @ margin_bottom : $ margin_bottom : expr ; ) ? + $ ( @ widget_name : $ widget_name : expr ; ) ? + $ ( @ css_classes : $ css_classes : expr ; ) ? + $ ( $ child : expr ) , * $ (,) ? + ) => { { + let container = gtk4 :: Box :: builder () . build () ; + $ ( container . set_orientation ( $ orientation ) ; ) ? + $ ( container . set_halign ( $ halign ) ; ) ? + $ ( container . set_valign ( $ valign ) ; ) ? + $ ( container . set_spacing ( $ spacing ) ; ) ? + $ ( container . set_margin_top ( $ margin_top ) ; ) ? + $ ( container . set_margin_bottom ( $ margin_bottom ) ; ) ? + $ ( container . set_widget_name ( $ widget_name ) ; ) ? + $ ( container . set_css_classes ( $ css_classes ) ; ) ? + $ ( container . append ( $ child ) ; ) * + container + } } ; + ( + @ option_children ; + $ ( @ orientation : $ orientation : expr ; ) ? + $ ( @ halign : $ halign : expr ; ) ? + $ ( @ valign : $ valign : expr ; ) ? + $ ( @ spacing : $ spacing : expr ; ) ? + $ ( @ margin_top : $ margin_top : expr ; ) ? + $ ( @ margin_bottom : $ margin_bottom : expr ; ) ? + $ ( @ widget_name : $ widget_name : expr ; ) ? + $ ( @ css_classes : $ css_classes : expr ; ) ? + $ ( $ child : expr ) , * $ (,) ? + ) => { { + let container = gtk4 :: Box :: builder () . build () ; + $ ( container . set_orientation ( $ orientation ) ; ) ? + $ ( container . set_halign ( $ halign ) ; ) ? + $ ( container . set_valign ( $ valign ) ; ) ? + $ ( container . set_spacing ( $ spacing ) ; ) ? + $ ( container . set_margin_top ( $ margin_top ) ; ) ? + $ ( container . set_margin_bottom ( $ margin_bottom ) ; ) ? + $ ( container . set_widget_name ( $ widget_name ) ; ) ? + $ ( container . set_css_classes ( $ css_classes ) ; ) ? + $ ( if let Some (child) = $ child { container . append (child) ; } ) * + container + } } ; +} macro_rules ! view_stack { ( $ ( ( $ title : expr , $ icon : expr , $ widget : expr $ (,) ? ) ) , * $ (,) ?