From e3984b0ffbcec21adc54eabbb631394f270caaef Mon Sep 17 00:00:00 2001 From: Reinout Meliesie Date: Thu, 28 Nov 2024 21:35:55 +0100 Subject: [PATCH] Deduplicate collated grid sorting logic --- src/ui/collated_grid.rs | 122 ++++++++++++++++------------------------ 1 file changed, 50 insertions(+), 72 deletions(-) diff --git a/src/ui/collated_grid.rs b/src/ui/collated_grid.rs index 29089d7..c03ad39 100644 --- a/src/ui/collated_grid.rs +++ b/src/ui/collated_grid.rs @@ -28,86 +28,92 @@ pub struct CollatedSeriesGrid { impl CollatedFilmsGrid { pub fn new ( films : Vec , sorting : FilmsSortedBy ) -> Self { let grid_widget = create_flow_box () ; - let film_widgets = films . iter () - . map (create_film_entry) - . collect :: < Vec <_> > () ; - let film_widget_pairs = RefCell :: new ( zip ( films , film_widgets ) - . collect :: < Vec <_> > () ) ; + let film_widget_pairs = RefCell :: new ( vec ! () ) ; - let film_widget_pairs_sorted = sort_film_widget_pairs ( - film_widget_pairs . borrow () . as_slice () , sorting ) ; - for ( _ , film_widget ) in & film_widget_pairs_sorted { - grid_widget . append (film_widget) ; - } + let component = Self { film_widget_pairs , grid_widget } ; + component . set_films ( films , sorting ) ; - Self { film_widget_pairs , grid_widget } + component } pub fn set_films ( & self , films : Vec , sorting : FilmsSortedBy ) { - let film_widgets = films . iter () + let widgets = films . iter () . map (create_film_entry) . collect :: < Vec <_> > () ; - * self . film_widget_pairs . borrow_mut () = zip ( films , film_widgets ) - . collect :: < Vec <_> > () ; + * self . film_widget_pairs . borrow_mut () = zip ( films , widgets ) + . collect () ; - let film_widget_pairs_sorted = sort_film_widget_pairs ( - self . film_widget_pairs . borrow () . as_slice () , sorting ) ; - for ( _ , film_widget ) in & film_widget_pairs_sorted { - self . grid_widget . append (film_widget) ; + for ( _ , film_widget ) in self . sort_film_widget_pairs (sorting) { + self . grid_widget . append ( & film_widget ) ; } } pub fn set_sorting ( & self , sorting : FilmsSortedBy ) { self . grid_widget . remove_all () ; - let film_widget_pairs_sorted = sort_film_widget_pairs ( - self . film_widget_pairs . borrow () . as_slice () , sorting ) ; - for ( _ , film_widget ) in & film_widget_pairs_sorted { - self . grid_widget . append (film_widget) ; + for ( _ , film_widget ) in self . sort_film_widget_pairs (sorting) { + self . grid_widget . append ( & film_widget ) ; } } + + fn sort_film_widget_pairs ( & self , sorting : FilmsSortedBy ) -> Vec < ( Film , Box ) > { + let mut sorted = Vec :: from ( + self . film_widget_pairs . borrow () . as_slice () ) ; + + sorted . sort_by ( | ( film_1 , _ ) , ( film_2 , _ ) | match sorting { + FilmsSortedBy :: Name => + film_1 . name . cmp ( & film_2 . name ) , + FilmsSortedBy :: ReleaseDate => + film_1 . release_date . cmp ( & film_2 . release_date ) , + FilmsSortedBy :: Runtime => + film_1 . runtime_minutes . cmp ( & film_2 . runtime_minutes ) , + } ) ; + + sorted + } } impl CollatedSeriesGrid { pub fn new ( series : Vec , sorting : SeriesSortedBy ) -> Self { let grid_widget = create_flow_box () ; - let series_widgets = series . iter () - . map (create_series_entry) - . collect :: < Vec <_> > () ; - let series_widget_pairs = RefCell :: new ( zip ( series , series_widgets ) - . collect :: < Vec <_> > () ) ; + let series_widget_pairs = RefCell :: new ( vec ! () ) ; - let series_widget_pairs_sorted = sort_series_widget_pairs ( - series_widget_pairs . borrow () . as_slice () , sorting ) ; - for ( _ , series_widget ) in & series_widget_pairs_sorted { - grid_widget . append (series_widget) ; - } + let component = Self { series_widget_pairs , grid_widget } ; + component . set_series ( series, sorting ) ; - Self { series_widget_pairs , grid_widget } + component } pub fn set_series ( & self , series : Vec , sorting : SeriesSortedBy ) { - let series_widgets = series . iter () + let widgets = series . iter () . map (create_series_entry) . collect :: < Vec <_> > () ; - * self . series_widget_pairs . borrow_mut () = zip ( series , series_widgets ) - . collect :: < Vec <_> > () ; + * self . series_widget_pairs . borrow_mut () = zip ( series , widgets ) + . collect () ; - let series_widget_pairs_sorted = sort_series_widget_pairs ( - self . series_widget_pairs . borrow () . as_slice () , sorting ) ; - for ( _ , series_widget ) in & series_widget_pairs_sorted { - self . grid_widget . append (series_widget) ; + for ( _ , series_widget ) in self . sort_series_widget_pairs (sorting) { + self . grid_widget . append ( & series_widget ) ; } } pub fn set_sorting ( & self , sorting : SeriesSortedBy ) { self . grid_widget . remove_all () ; - let series_widget_pairs_sorted = sort_series_widget_pairs ( - self . series_widget_pairs . borrow () . as_slice () , sorting ) ; - for ( _ , series_widget ) in & series_widget_pairs_sorted { - self . grid_widget . append (series_widget) ; + for ( _ , series_widget ) in self . sort_series_widget_pairs (sorting) { + self . grid_widget . append ( & series_widget ) ; } } + + fn sort_series_widget_pairs ( & self , sorting : SeriesSortedBy ) -> Vec < ( Series , Box ) > { + let mut sorted = Vec :: from ( + self . series_widget_pairs . borrow () . as_slice () ) ; + + sorted . sort_by ( | ( series_1 , _ ) , ( series_2 , _ ) | match sorting { + SeriesSortedBy :: Name => series_1 . name . cmp ( & series_2 . name ) , + SeriesSortedBy :: FirstReleaseDate => todo ! () , + } ) ; + + sorted + } } impl Component for CollatedFilmsGrid { @@ -117,34 +123,6 @@ impl Component for CollatedSeriesGrid { fn get_widget ( & self ) -> & FlowBox { & self . grid_widget } } -fn sort_film_widget_pairs ( - film_widget_pairs : & [ ( Film , Box ) ] , - sorting : FilmsSortedBy , -) -> Vec < ( Film , Box ) > { - let mut sorted = Vec :: from (film_widget_pairs) ; - - sorted . sort_by ( | ( film_1 , _ ) , ( film_2 , _ ) | match sorting { - FilmsSortedBy :: Name => film_1 . name . cmp ( & film_2 . name ) , - FilmsSortedBy :: ReleaseDate => film_1 . release_date . cmp ( & film_2 . release_date ) , - FilmsSortedBy :: Runtime => film_1 . runtime_minutes . cmp ( & film_2 . runtime_minutes ) , - } ) ; - - sorted -} -fn sort_series_widget_pairs ( - series_widget_pairs : & [ ( Series, Box ) ] , - sorting : SeriesSortedBy , -) -> Vec < ( Series , Box ) > { - let mut sorted = Vec :: from (series_widget_pairs) ; - - sorted . sort_by ( | ( series_1 , _ ) , ( series_2 , _ ) | match sorting { - SeriesSortedBy :: Name => series_1 . name . cmp ( & series_2 . name ) , - SeriesSortedBy :: FirstReleaseDate => todo ! () , - } ) ; - - sorted -} - fn create_flow_box () -> FlowBox { FlowBox :: builder () . orientation (Horizontal)