refactor(movie_details_handler): Use the new handle_table_events macro

This commit is contained in:
2024-12-08 14:04:34 -07:00
parent f1d934b0a6
commit d6863dc1fd
4 changed files with 84 additions and 224 deletions
+3
View File
@@ -344,6 +344,9 @@ mod test_utils {
movie_details_modal movie_details_modal
.movie_history .movie_history
.set_items(vec![$crate::models::radarr_models::MovieHistoryItem::default()]); .set_items(vec![$crate::models::radarr_models::MovieHistoryItem::default()]);
movie_details_modal.movie_cast.set_items(vec![$crate::models::radarr_models::Credit::default()]);
movie_details_modal.movie_crew.set_items(vec![$crate::models::radarr_models::Credit::default()]);
movie_details_modal.movie_releases.set_items(vec![$crate::models::radarr_models::RadarrRelease::default()]);
app.data.radarr_data.movie_details_modal = Some(movie_details_modal); app.data.radarr_data.movie_details_modal = Some(movie_details_modal);
let mut series_history = $crate::models::stateful_table::StatefulTable::default(); let mut series_history = $crate::models::stateful_table::StatefulTable::default();
series_history.set_items(vec![ series_history.set_items(vec![
@@ -1,10 +1,13 @@
use crate::models::HorizontallyScrollableText;
use serde_json::Number; use serde_json::Number;
use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::key_binding::DEFAULT_KEYBINDINGS;
use crate::app::App; use crate::app::App;
use crate::event::Key; use crate::event::Key;
use crate::handle_table_events;
use crate::handlers::table_handler::TableHandlingProps;
use crate::handlers::{handle_prompt_toggle, KeyEventHandler}; use crate::handlers::{handle_prompt_toggle, KeyEventHandler};
use crate::models::radarr_models::RadarrRelease; use crate::models::radarr_models::{Credit, MovieHistoryItem, RadarrRelease};
use crate::models::servarr_data::radarr::radarr_data::{ use crate::models::servarr_data::radarr::radarr_data::{
ActiveRadarrBlock, EDIT_MOVIE_SELECTION_BLOCKS, MOVIE_DETAILS_BLOCKS, ActiveRadarrBlock, EDIT_MOVIE_SELECTION_BLOCKS, MOVIE_DETAILS_BLOCKS,
}; };
@@ -24,7 +27,58 @@ pub(super) struct MovieDetailsHandler<'a, 'b> {
_context: Option<ActiveRadarrBlock>, _context: Option<ActiveRadarrBlock>,
} }
impl<'a, 'b> MovieDetailsHandler<'a, 'b> {
handle_table_events!(
self,
movie_releases,
self
.app
.data
.radarr_data
.movie_details_modal
.as_mut()
.unwrap()
.movie_releases,
RadarrRelease
);
handle_table_events!(
self,
movie_history,
self
.app
.data
.radarr_data
.movie_details_modal
.as_mut()
.unwrap()
.movie_history,
MovieHistoryItem
);
handle_table_events!(self, movie_cast, self.app.data.radarr_data.movie_details_modal.as_mut().unwrap().movie_cast, Credit);
handle_table_events!(self, movie_crew, self.app.data.radarr_data.movie_details_modal.as_mut().unwrap().movie_crew, Credit);
}
impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for MovieDetailsHandler<'a, 'b> { impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for MovieDetailsHandler<'a, 'b> {
fn handle(&mut self) {
let movie_history_table_handling_props =
TableHandlingProps::new(ActiveRadarrBlock::MovieHistory.into());
let movie_releases_table_handling_props =
TableHandlingProps::new(ActiveRadarrBlock::ManualSearch.into())
.sorting_block(ActiveRadarrBlock::ManualSearchSortPrompt.into())
.sort_options(releases_sorting_options());
let movie_cast_table_handling_props =
TableHandlingProps::new(ActiveRadarrBlock::Cast.into());
let movie_crew_table_handling_props = TableHandlingProps::new(ActiveRadarrBlock::Crew.into());
if !self.handle_movie_history_table_events(movie_history_table_handling_props)
&& !self.handle_movie_releases_table_events(movie_releases_table_handling_props)
&& !self.handle_movie_cast_table_events(movie_cast_table_handling_props)
&& !self.handle_movie_crew_table_events(movie_crew_table_handling_props)
{
self.handle_key_event();
}
}
fn accepts(active_block: ActiveRadarrBlock) -> bool { fn accepts(active_block: ActiveRadarrBlock) -> bool {
MOVIE_DETAILS_BLOCKS.contains(&active_block) MOVIE_DETAILS_BLOCKS.contains(&active_block)
} }
@@ -83,54 +137,6 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for MovieDetailsHandler<
.unwrap() .unwrap()
.movie_details .movie_details
.scroll_up(), .scroll_up(),
ActiveRadarrBlock::MovieHistory => self
.app
.data
.radarr_data
.movie_details_modal
.as_mut()
.unwrap()
.movie_history
.scroll_up(),
ActiveRadarrBlock::Cast => self
.app
.data
.radarr_data
.movie_details_modal
.as_mut()
.unwrap()
.movie_cast
.scroll_up(),
ActiveRadarrBlock::Crew => self
.app
.data
.radarr_data
.movie_details_modal
.as_mut()
.unwrap()
.movie_crew
.scroll_up(),
ActiveRadarrBlock::ManualSearch => self
.app
.data
.radarr_data
.movie_details_modal
.as_mut()
.unwrap()
.movie_releases
.scroll_up(),
ActiveRadarrBlock::ManualSearchSortPrompt => self
.app
.data
.radarr_data
.movie_details_modal
.as_mut()
.unwrap()
.movie_releases
.sort
.as_mut()
.unwrap()
.scroll_up(),
_ => (), _ => (),
} }
} }
@@ -146,54 +152,6 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for MovieDetailsHandler<
.unwrap() .unwrap()
.movie_details .movie_details
.scroll_down(), .scroll_down(),
ActiveRadarrBlock::MovieHistory => self
.app
.data
.radarr_data
.movie_details_modal
.as_mut()
.unwrap()
.movie_history
.scroll_down(),
ActiveRadarrBlock::Cast => self
.app
.data
.radarr_data
.movie_details_modal
.as_mut()
.unwrap()
.movie_cast
.scroll_down(),
ActiveRadarrBlock::Crew => self
.app
.data
.radarr_data
.movie_details_modal
.as_mut()
.unwrap()
.movie_crew
.scroll_down(),
ActiveRadarrBlock::ManualSearch => self
.app
.data
.radarr_data
.movie_details_modal
.as_mut()
.unwrap()
.movie_releases
.scroll_down(),
ActiveRadarrBlock::ManualSearchSortPrompt => self
.app
.data
.radarr_data
.movie_details_modal
.as_mut()
.unwrap()
.movie_releases
.sort
.as_mut()
.unwrap()
.scroll_down(),
_ => (), _ => (),
} }
} }
@@ -209,54 +167,6 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for MovieDetailsHandler<
.unwrap() .unwrap()
.movie_details .movie_details
.scroll_to_top(), .scroll_to_top(),
ActiveRadarrBlock::MovieHistory => self
.app
.data
.radarr_data
.movie_details_modal
.as_mut()
.unwrap()
.movie_history
.scroll_to_top(),
ActiveRadarrBlock::Cast => self
.app
.data
.radarr_data
.movie_details_modal
.as_mut()
.unwrap()
.movie_cast
.scroll_to_top(),
ActiveRadarrBlock::Crew => self
.app
.data
.radarr_data
.movie_details_modal
.as_mut()
.unwrap()
.movie_crew
.scroll_to_top(),
ActiveRadarrBlock::ManualSearch => self
.app
.data
.radarr_data
.movie_details_modal
.as_mut()
.unwrap()
.movie_releases
.scroll_to_top(),
ActiveRadarrBlock::ManualSearchSortPrompt => self
.app
.data
.radarr_data
.movie_details_modal
.as_mut()
.unwrap()
.movie_releases
.sort
.as_mut()
.unwrap()
.scroll_to_top(),
_ => (), _ => (),
} }
} }
@@ -272,54 +182,6 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for MovieDetailsHandler<
.unwrap() .unwrap()
.movie_details .movie_details
.scroll_to_bottom(), .scroll_to_bottom(),
ActiveRadarrBlock::MovieHistory => self
.app
.data
.radarr_data
.movie_details_modal
.as_mut()
.unwrap()
.movie_history
.scroll_to_bottom(),
ActiveRadarrBlock::Cast => self
.app
.data
.radarr_data
.movie_details_modal
.as_mut()
.unwrap()
.movie_cast
.scroll_to_bottom(),
ActiveRadarrBlock::Crew => self
.app
.data
.radarr_data
.movie_details_modal
.as_mut()
.unwrap()
.movie_crew
.scroll_to_bottom(),
ActiveRadarrBlock::ManualSearch => self
.app
.data
.radarr_data
.movie_details_modal
.as_mut()
.unwrap()
.movie_releases
.scroll_to_bottom(),
ActiveRadarrBlock::ManualSearchSortPrompt => self
.app
.data
.radarr_data
.movie_details_modal
.as_mut()
.unwrap()
.movie_releases
.sort
.as_mut()
.unwrap()
.scroll_to_bottom(),
_ => (), _ => (),
} }
} }
@@ -385,18 +247,6 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for MovieDetailsHandler<
self.app.pop_navigation_stack(); self.app.pop_navigation_stack();
} }
ActiveRadarrBlock::ManualSearchSortPrompt => {
self
.app
.data
.radarr_data
.movie_details_modal
.as_mut()
.unwrap()
.movie_releases
.apply_sorting();
self.app.pop_navigation_stack();
}
_ => (), _ => (),
} }
} }
@@ -414,8 +264,7 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for MovieDetailsHandler<
} }
ActiveRadarrBlock::AutomaticallySearchMoviePrompt ActiveRadarrBlock::AutomaticallySearchMoviePrompt
| ActiveRadarrBlock::UpdateAndScanPrompt | ActiveRadarrBlock::UpdateAndScanPrompt
| ActiveRadarrBlock::ManualSearchConfirmPrompt | ActiveRadarrBlock::ManualSearchConfirmPrompt => {
| ActiveRadarrBlock::ManualSearchSortPrompt => {
self.app.pop_navigation_stack(); self.app.pop_navigation_stack();
self.app.data.radarr_data.prompt_confirm = false; self.app.data.radarr_data.prompt_confirm = false;
} }
@@ -459,20 +308,6 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for MovieDetailsHandler<
.app .app
.pop_and_push_navigation_stack(self.active_radarr_block.into()); .pop_and_push_navigation_stack(self.active_radarr_block.into());
} }
_ if key == DEFAULT_KEYBINDINGS.sort.key => {
self
.app
.data
.radarr_data
.movie_details_modal
.as_mut()
.unwrap()
.movie_releases
.sorting(releases_sorting_options());
self
.app
.push_navigation_stack(ActiveRadarrBlock::ManualSearchSortPrompt.into());
}
_ => (), _ => (),
}, },
ActiveRadarrBlock::AutomaticallySearchMoviePrompt => { ActiveRadarrBlock::AutomaticallySearchMoviePrompt => {
@@ -135,6 +135,7 @@ mod tests {
#[values(DEFAULT_KEYBINDINGS.up.key, DEFAULT_KEYBINDINGS.down.key)] key: Key, #[values(DEFAULT_KEYBINDINGS.up.key, DEFAULT_KEYBINDINGS.down.key)] key: Key,
) { ) {
let mut app = App::default(); let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::MovieHistory.into());
let mut movie_details_modal = MovieDetailsModal::default(); let mut movie_details_modal = MovieDetailsModal::default();
movie_details_modal movie_details_modal
.movie_history .movie_history
@@ -232,6 +233,7 @@ mod tests {
#[values(DEFAULT_KEYBINDINGS.up.key, DEFAULT_KEYBINDINGS.down.key)] key: Key, #[values(DEFAULT_KEYBINDINGS.up.key, DEFAULT_KEYBINDINGS.down.key)] key: Key,
) { ) {
let mut app = App::default(); let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Cast.into());
let mut movie_details_modal = MovieDetailsModal::default(); let mut movie_details_modal = MovieDetailsModal::default();
movie_details_modal movie_details_modal
.movie_cast .movie_cast
@@ -317,6 +319,7 @@ mod tests {
#[values(DEFAULT_KEYBINDINGS.up.key, DEFAULT_KEYBINDINGS.down.key)] key: Key, #[values(DEFAULT_KEYBINDINGS.up.key, DEFAULT_KEYBINDINGS.down.key)] key: Key,
) { ) {
let mut app = App::default(); let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Crew.into());
let mut movie_details_modal = MovieDetailsModal::default(); let mut movie_details_modal = MovieDetailsModal::default();
movie_details_modal movie_details_modal
.movie_crew .movie_crew
@@ -402,6 +405,7 @@ mod tests {
#[values(DEFAULT_KEYBINDINGS.up.key, DEFAULT_KEYBINDINGS.down.key)] key: Key, #[values(DEFAULT_KEYBINDINGS.up.key, DEFAULT_KEYBINDINGS.down.key)] key: Key,
) { ) {
let mut app = App::default(); let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::ManualSearch.into());
let mut movie_details_modal = MovieDetailsModal::default(); let mut movie_details_modal = MovieDetailsModal::default();
movie_details_modal movie_details_modal
.movie_releases .movie_releases
@@ -666,6 +670,7 @@ mod tests {
#[test] #[test]
fn test_movie_history_home_end() { fn test_movie_history_home_end() {
let mut app = App::default(); let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::MovieHistory.into());
let mut movie_details_modal = MovieDetailsModal::default(); let mut movie_details_modal = MovieDetailsModal::default();
movie_details_modal movie_details_modal
.movie_history .movie_history
@@ -783,6 +788,7 @@ mod tests {
#[test] #[test]
fn test_cast_home_end() { fn test_cast_home_end() {
let mut app = App::default(); let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Cast.into());
let mut movie_details_modal = MovieDetailsModal::default(); let mut movie_details_modal = MovieDetailsModal::default();
movie_details_modal movie_details_modal
.movie_cast .movie_cast
@@ -888,6 +894,7 @@ mod tests {
#[test] #[test]
fn test_crew_home_end() { fn test_crew_home_end() {
let mut app = App::default(); let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Crew.into());
let mut movie_details_modal = MovieDetailsModal::default(); let mut movie_details_modal = MovieDetailsModal::default();
movie_details_modal movie_details_modal
.movie_crew .movie_crew
@@ -993,6 +1000,7 @@ mod tests {
#[test] #[test]
fn test_manual_search_home_end() { fn test_manual_search_home_end() {
let mut app = App::default(); let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::ManualSearch.into());
let mut movie_details_modal = MovieDetailsModal::default(); let mut movie_details_modal = MovieDetailsModal::default();
movie_details_modal movie_details_modal
.movie_releases .movie_releases
@@ -1430,12 +1438,12 @@ mod tests {
ActiveRadarrBlock::AutomaticallySearchMoviePrompt, ActiveRadarrBlock::AutomaticallySearchMoviePrompt,
ActiveRadarrBlock::UpdateAndScanPrompt, ActiveRadarrBlock::UpdateAndScanPrompt,
ActiveRadarrBlock::ManualSearchConfirmPrompt, ActiveRadarrBlock::ManualSearchConfirmPrompt,
ActiveRadarrBlock::ManualSearchSortPrompt
)] )]
prompt_block: ActiveRadarrBlock, prompt_block: ActiveRadarrBlock,
#[values(true, false)] is_ready: bool, #[values(true, false)] is_ready: bool,
) { ) {
let mut app = App::default(); let mut app = App::default();
app.data.radarr_data = create_test_radarr_data();
app.is_loading = is_ready; app.is_loading = is_ready;
app.data.radarr_data.prompt_confirm = true; app.data.radarr_data.prompt_confirm = true;
app.push_navigation_stack(ActiveRadarrBlock::Movies.into()); app.push_navigation_stack(ActiveRadarrBlock::Movies.into());
@@ -1446,6 +1454,18 @@ mod tests {
assert!(!app.data.radarr_data.prompt_confirm); assert!(!app.data.radarr_data.prompt_confirm);
assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into());
} }
#[rstest]
fn test_manual_search_sort_prompt_esc() {
let mut app = App::default();
app.data.radarr_data = create_test_radarr_data();
app.push_navigation_stack(ActiveRadarrBlock::Movies.into());
app.push_navigation_stack(ActiveRadarrBlock::ManualSearchSortPrompt.into());
MovieDetailsHandler::with(ESC_KEY, &mut app, ActiveRadarrBlock::ManualSearchSortPrompt, None).handle();
assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into());
}
} }
mod test_handle_key_char { mod test_handle_key_char {
@@ -1542,6 +1562,7 @@ mod tests {
#[test] #[test]
fn test_sort_key() { fn test_sort_key() {
let mut app = App::default(); let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::ManualSearch.into());
let mut modal = MovieDetailsModal::default(); let mut modal = MovieDetailsModal::default();
modal.movie_releases.set_items(release_vec()); modal.movie_releases.set_items(release_vec());
app.data.radarr_data.movie_details_modal = Some(modal); app.data.radarr_data.movie_details_modal = Some(modal);
+3 -2
View File
@@ -216,9 +216,10 @@ macro_rules! handle_table_events {
_ if props.sorting_block.is_some() _ if props.sorting_block.is_some()
&& $self.app.get_current_route() == *props.sorting_block.as_ref().unwrap() => && $self.app.get_current_route() == *props.sorting_block.as_ref().unwrap() =>
{ {
let sort_by_fn = props.sort_by_fn.expect("Sort by function is required"); if let Some(sort_by_fn) = props.sort_by_fn {
$table.items.sort_by(sort_by_fn);
}
$table.items.sort_by(sort_by_fn);
$table.apply_sorting(); $table.apply_sorting();
$self.app.pop_navigation_stack(); $self.app.pop_navigation_stack();