g_box UI macro can now take inline conditional children

This commit is contained in:
Reinout Meliesie 2025-02-07 15:19:41 +01:00
parent cd45d4303b
commit a9ec7bdcc9
Signed by: zedfrigg
GPG key ID: 3AFCC06481308BC6
2 changed files with 81 additions and 53 deletions

View file

@ -156,46 +156,48 @@ async fn create_collection_item (
poster_file_path : Option < & Path > , poster_file_path : Option < & Path > ,
details_widget : & Box , details_widget : & Box ,
) -> Box { ) -> Box {
let container = g_box ! ( g_box ! (
@ option_children ;
@ orientation : Vertical ; @ orientation : Vertical ;
@ margin_top : 20 ; @ margin_top : 20 ;
@ margin_bottom : 20 ; @ margin_bottom : 20 ;
) ;
if let Some (poster_file_path) = poster_file_path { 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_file_path = PathBuf :: from (poster_file_path) ; // God forbid `Path` would work with `clone ! ()`
let poster_texture = spawn_blocking ( move || let poster_texture = spawn_blocking ( move ||
Texture :: from_filename (poster_file_path) . unwrap () Texture :: from_filename (poster_file_path) . unwrap ()
) . await . unwrap () ; ) . await . unwrap () ;
Some ( image ! (
container . append ( & image ! (
@ paintable : & poster_texture ; @ paintable : & poster_texture ;
@ width_request : 300 ; @ width_request : 300 ;
@ height_request : 300 ; @ height_request : 300 ;
@ margin_bottom : 10 ; @ margin_bottom : 10 ;
) ) ; ) )
} } ,
None => None ,
} . as_ref () ,
container . append ( & label ! ( Some ( & label ! (
@ justify : Justification :: Center ; @ justify : Justification :: Center ;
@ wrap : true ; @ wrap : true ;
@ max_width_chars : 1 ; // Not the actual limit, used instead to wrap more aggressively @ max_width_chars : 1 ; // Not the actual limit, used instead to wrap more aggressively
@ attributes : & pango_attributes ! ( @ scale : SCALE_LARGE ; @ weight : Bold ; ) ; @ attributes : & pango_attributes ! ( @ scale : SCALE_LARGE ; @ weight : Bold ; ) ;
name , name ,
) ) ; ) ) ,
if let Some (original_name) = original_name { match original_name {
container . append ( & label ! ( Some (original_name) => Some ( label ! (
@ justify : Justification :: Center ; @ justify : Justification :: Center ;
@ wrap : true ; @ wrap : true ;
@ max_width_chars : 1 ; // Not the actual limit, used instead to wrap more aggressively @ max_width_chars : 1 ; // Not the actual limit, used instead to wrap more aggressively
original_name , original_name ,
) ) ; ) ) ,
} None => None ,
} . as_ref () ,
container . append (details_widget) ; Some (details_widget) ,
)
container
} }
fn create_film_details ( film : & FilmOverview ) -> Box { fn create_film_details ( film : & FilmOverview ) -> Box {

View file

@ -22,7 +22,8 @@ macro_rules ! label { (
label label
} } } } } }
macro_rules ! g_box { ( macro_rules ! g_box {
(
$ ( @ orientation : $ orientation : expr ; ) ? $ ( @ orientation : $ orientation : expr ; ) ?
$ ( @ halign : $ halign : expr ; ) ? $ ( @ halign : $ halign : expr ; ) ?
$ ( @ valign : $ valign : expr ; ) ? $ ( @ valign : $ valign : expr ; ) ?
@ -44,7 +45,32 @@ macro_rules ! g_box { (
$ ( container . set_css_classes ( $ css_classes ) ; ) ? $ ( container . set_css_classes ( $ css_classes ) ; ) ?
$ ( container . append ( $ child ) ; ) * $ ( container . append ( $ child ) ; ) *
container 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 { ( macro_rules ! view_stack { (
$ ( ( $ title : expr , $ icon : expr , $ widget : expr $ (,) ? ) ) , * $ (,) ? $ ( ( $ title : expr , $ icon : expr , $ widget : expr $ (,) ? ) ) , * $ (,) ?