Cleaned up the block selection logic to use the new BlockSelectionState struct

This commit is contained in:
2023-08-08 10:50:06 -06:00
parent 2561e7e9b2
commit 4fb83c114a
23 changed files with 840 additions and 882 deletions
+5 -5
View File
@@ -7,7 +7,7 @@ use crate::models::{HorizontallyScrollableText, Route};
mod radarr_handlers;
pub trait KeyEventHandler<'a, T: Into<Route>> {
pub trait KeyEventHandler<'a, 'b, T: Into<Route>> {
fn handle_key_event(&mut self) {
let key = self.get_key();
match key {
@@ -29,7 +29,7 @@ pub trait KeyEventHandler<'a, T: Into<Route>> {
self.handle_key_event();
}
fn with(key: &'a Key, app: &'a mut App, active_block: &'a T, context: &'a Option<T>) -> Self;
fn with(key: &'a Key, app: &'a mut App<'b>, active_block: &'a T, context: &'a Option<T>) -> Self;
fn get_key(&self) -> &Key;
fn handle_scroll_up(&mut self);
fn handle_scroll_down(&mut self);
@@ -42,19 +42,19 @@ pub trait KeyEventHandler<'a, T: Into<Route>> {
fn handle_char_key_event(&mut self);
}
pub fn handle_events(key: Key, app: &mut App) {
pub fn handle_events(key: Key, app: &mut App<'_>) {
if let Route::Radarr(active_radarr_block, context) = *app.get_current_route() {
RadarrHandler::with(&key, app, &active_radarr_block, &context).handle()
}
}
fn handle_clear_errors(app: &mut App) {
fn handle_clear_errors(app: &mut App<'_>) {
if !app.error.text.is_empty() {
app.error = HorizontallyScrollableText::default();
}
}
fn handle_prompt_toggle(app: &mut App, key: &Key) {
fn handle_prompt_toggle(app: &mut App<'_>, key: &Key) {
match key {
_ if *key == DEFAULT_KEYBINDINGS.left.key || *key == DEFAULT_KEYBINDINGS.right.key => {
if let Route::Radarr(_, _) = *app.get_current_route() {
@@ -1,24 +1,24 @@
use crate::app::key_binding::DEFAULT_KEYBINDINGS;
use crate::app::radarr::ActiveRadarrBlock;
use crate::app::radarr::{ActiveRadarrBlock, ADD_MOVIE_SELECTION_BLOCKS};
use crate::handlers::{handle_prompt_toggle, KeyEventHandler};
use crate::models::{Scrollable, StatefulTable};
use crate::models::{BlockSelectionState, Scrollable, StatefulTable};
use crate::network::radarr_network::RadarrEvent;
use crate::{handle_text_box_keys, handle_text_box_left_right_keys, App, Key};
pub(super) struct AddMovieHandler<'a> {
pub(super) struct AddMovieHandler<'a, 'b> {
key: &'a Key,
app: &'a mut App,
app: &'a mut App<'b>,
active_radarr_block: &'a ActiveRadarrBlock,
context: &'a Option<ActiveRadarrBlock>,
}
impl<'a> KeyEventHandler<'a, ActiveRadarrBlock> for AddMovieHandler<'a> {
impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for AddMovieHandler<'a, 'b> {
fn with(
key: &'a Key,
app: &'a mut App,
app: &'a mut App<'b>,
active_block: &'a ActiveRadarrBlock,
context: &'a Option<ActiveRadarrBlock>,
) -> AddMovieHandler<'a> {
) -> AddMovieHandler<'a, 'b> {
AddMovieHandler {
key,
app,
@@ -51,14 +51,7 @@ impl<'a> KeyEventHandler<'a, ActiveRadarrBlock> for AddMovieHandler<'a> {
ActiveRadarrBlock::AddMovieSelectRootFolder => {
self.app.data.radarr_data.root_folder_list.scroll_up()
}
ActiveRadarrBlock::AddMoviePrompt => {
self.app.data.radarr_data.selected_block = self
.app
.data
.radarr_data
.selected_block
.previous_add_movie_prompt_block()
}
ActiveRadarrBlock::AddMoviePrompt => self.app.data.radarr_data.selected_block.previous(),
_ => (),
}
}
@@ -83,14 +76,7 @@ impl<'a> KeyEventHandler<'a, ActiveRadarrBlock> for AddMovieHandler<'a> {
ActiveRadarrBlock::AddMovieSelectRootFolder => {
self.app.data.radarr_data.root_folder_list.scroll_down()
}
ActiveRadarrBlock::AddMoviePrompt => {
self.app.data.radarr_data.selected_block = self
.app
.data
.radarr_data
.selected_block
.next_add_movie_prompt_block()
}
ActiveRadarrBlock::AddMoviePrompt => self.app.data.radarr_data.selected_block.next(),
_ => (),
}
}
@@ -220,31 +206,42 @@ impl<'a> KeyEventHandler<'a, ActiveRadarrBlock> for AddMovieHandler<'a> {
.app
.push_navigation_stack(ActiveRadarrBlock::AddMoviePrompt.into());
self.app.data.radarr_data.populate_preferences_lists();
self.app.data.radarr_data.selected_block = ActiveRadarrBlock::AddMovieSelectRootFolder;
self.app.data.radarr_data.selected_block =
BlockSelectionState::new(&ADD_MOVIE_SELECTION_BLOCKS);
}
}
ActiveRadarrBlock::AddMoviePrompt => match self.app.data.radarr_data.selected_block {
ActiveRadarrBlock::AddMovieConfirmPrompt => {
if self.app.data.radarr_data.prompt_confirm {
self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::AddMovie);
}
ActiveRadarrBlock::AddMoviePrompt => {
match self.app.data.radarr_data.selected_block.get_active_block() {
ActiveRadarrBlock::AddMovieConfirmPrompt => {
if self.app.data.radarr_data.prompt_confirm {
self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::AddMovie);
}
self.app.pop_navigation_stack();
self.app.pop_navigation_stack();
}
ActiveRadarrBlock::AddMovieSelectMonitor
| ActiveRadarrBlock::AddMovieSelectMinimumAvailability
| ActiveRadarrBlock::AddMovieSelectQualityProfile
| ActiveRadarrBlock::AddMovieSelectRootFolder => self.app.push_navigation_stack(
(
*self.app.data.radarr_data.selected_block.get_active_block(),
*self.context,
)
.into(),
),
ActiveRadarrBlock::AddMovieTagsInput => {
self.app.push_navigation_stack(
(
*self.app.data.radarr_data.selected_block.get_active_block(),
*self.context,
)
.into(),
);
self.app.should_ignore_quit_key = true;
}
_ => (),
}
ActiveRadarrBlock::AddMovieSelectMonitor
| ActiveRadarrBlock::AddMovieSelectMinimumAvailability
| ActiveRadarrBlock::AddMovieSelectQualityProfile
| ActiveRadarrBlock::AddMovieSelectRootFolder => self
.app
.push_navigation_stack((self.app.data.radarr_data.selected_block, *self.context).into()),
ActiveRadarrBlock::AddMovieTagsInput => {
self.app.push_navigation_stack(
(self.app.data.radarr_data.selected_block, *self.context).into(),
);
self.app.should_ignore_quit_key = true;
}
_ => (),
},
}
ActiveRadarrBlock::AddMovieSelectMonitor
| ActiveRadarrBlock::AddMovieSelectMinimumAvailability
| ActiveRadarrBlock::AddMovieSelectQualityProfile
@@ -321,6 +318,8 @@ mod tests {
use rstest::rstest;
use strum::IntoEnumIterator;
use crate::app::radarr::ADD_MOVIE_SELECTION_BLOCKS;
use crate::models::BlockSelectionState;
use crate::{simple_stateful_iterable_vec, test_enum_scroll, test_iterable_scroll};
use super::*;
@@ -375,19 +374,20 @@ mod tests {
#[rstest]
fn test_add_movie_prompt_scroll(#[values(Key::Up, Key::Down)] key: Key) {
let mut app = App::default();
app.data.radarr_data.selected_block = ActiveRadarrBlock::AddMovieSelectMinimumAvailability;
app.data.radarr_data.selected_block = BlockSelectionState::new(&ADD_MOVIE_SELECTION_BLOCKS);
app.data.radarr_data.selected_block.next();
AddMovieHandler::with(&key, &mut app, &ActiveRadarrBlock::AddMoviePrompt, &None).handle();
if key == Key::Up {
assert_eq!(
app.data.radarr_data.selected_block,
ActiveRadarrBlock::AddMovieSelectMonitor
app.data.radarr_data.selected_block.get_active_block(),
&ActiveRadarrBlock::AddMovieSelectRootFolder
);
} else {
assert_eq!(
app.data.radarr_data.selected_block,
ActiveRadarrBlock::AddMovieSelectQualityProfile
app.data.radarr_data.selected_block.get_active_block(),
&ActiveRadarrBlock::AddMovieSelectMinimumAvailability
);
}
}
@@ -513,7 +513,9 @@ mod tests {
use pretty_assertions::{assert_eq, assert_str_eq};
use rstest::rstest;
use crate::app::radarr::ADD_MOVIE_SELECTION_BLOCKS;
use crate::models::radarr_models::Movie;
use crate::models::BlockSelectionState;
use crate::network::radarr_network::RadarrEvent;
use super::*;
@@ -564,8 +566,8 @@ mod tests {
&ActiveRadarrBlock::AddMoviePrompt.into()
);
assert_eq!(
app.data.radarr_data.selected_block,
ActiveRadarrBlock::AddMovieSelectRootFolder
app.data.radarr_data.selected_block.get_active_block(),
&ActiveRadarrBlock::AddMovieSelectRootFolder
);
assert!(!app.data.radarr_data.monitor_list.items.is_empty());
assert!(!app
@@ -636,7 +638,12 @@ mod tests {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Movies.into());
app.push_navigation_stack(ActiveRadarrBlock::AddMoviePrompt.into());
app.data.radarr_data.selected_block = ActiveRadarrBlock::AddMovieConfirmPrompt;
app.data.radarr_data.selected_block = BlockSelectionState::new(&ADD_MOVIE_SELECTION_BLOCKS);
app
.data
.radarr_data
.selected_block
.set_index(ADD_MOVIE_SELECTION_BLOCKS.len() - 1);
AddMovieHandler::with(
&SUBMIT_KEY,
@@ -656,7 +663,12 @@ mod tests {
app.push_navigation_stack(ActiveRadarrBlock::Movies.into());
app.push_navigation_stack(ActiveRadarrBlock::AddMoviePrompt.into());
app.data.radarr_data.prompt_confirm = true;
app.data.radarr_data.selected_block = ActiveRadarrBlock::AddMovieConfirmPrompt;
app.data.radarr_data.selected_block = BlockSelectionState::new(&ADD_MOVIE_SELECTION_BLOCKS);
app
.data
.radarr_data
.selected_block
.set_index(ADD_MOVIE_SELECTION_BLOCKS.len() - 1);
AddMovieHandler::with(
&SUBMIT_KEY,
@@ -674,15 +686,14 @@ mod tests {
}
#[rstest]
#[case(ActiveRadarrBlock::AddMovieSelectRootFolder, 0)]
#[case(ActiveRadarrBlock::AddMovieSelectMonitor, 1)]
#[case(ActiveRadarrBlock::AddMovieSelectMinimumAvailability, 2)]
#[case(ActiveRadarrBlock::AddMovieSelectQualityProfile, 3)]
#[case(ActiveRadarrBlock::AddMovieTagsInput, 4)]
fn test_add_movie_prompt_selected_block_submit(
#[values(
ActiveRadarrBlock::AddMovieSelectMonitor,
ActiveRadarrBlock::AddMovieSelectMinimumAvailability,
ActiveRadarrBlock::AddMovieSelectQualityProfile,
ActiveRadarrBlock::AddMovieSelectRootFolder,
ActiveRadarrBlock::AddMovieTagsInput
)]
selected_block: ActiveRadarrBlock,
#[case] selected_block: ActiveRadarrBlock,
#[case] index: usize,
) {
let mut app = App::default();
app.push_navigation_stack(
@@ -692,7 +703,8 @@ mod tests {
)
.into(),
);
app.data.radarr_data.selected_block = selected_block;
app.data.radarr_data.selected_block = BlockSelectionState::new(&ADD_MOVIE_SELECTION_BLOCKS);
app.data.radarr_data.selected_block.set_index(index);
AddMovieHandler::with(
&SUBMIT_KEY,
@@ -1,24 +1,26 @@
use crate::app::key_binding::DEFAULT_KEYBINDINGS;
use crate::app::radarr::ActiveRadarrBlock;
use crate::app::radarr::{
ActiveRadarrBlock, ADD_MOVIE_SELECTION_BLOCKS, EDIT_COLLECTION_SELECTION_BLOCKS,
};
use crate::app::App;
use crate::event::Key;
use crate::handlers::KeyEventHandler;
use crate::models::Scrollable;
use crate::models::{BlockSelectionState, Scrollable};
pub(super) struct CollectionDetailsHandler<'a> {
pub(super) struct CollectionDetailsHandler<'a, 'b> {
key: &'a Key,
app: &'a mut App,
app: &'a mut App<'b>,
active_radarr_block: &'a ActiveRadarrBlock,
_context: &'a Option<ActiveRadarrBlock>,
}
impl<'a> KeyEventHandler<'a, ActiveRadarrBlock> for CollectionDetailsHandler<'a> {
impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for CollectionDetailsHandler<'a, 'b> {
fn with(
key: &'a Key,
app: &'a mut App,
app: &'a mut App<'b>,
active_block: &'a ActiveRadarrBlock,
_context: &'a Option<ActiveRadarrBlock>,
) -> CollectionDetailsHandler<'a> {
) -> CollectionDetailsHandler<'a, 'b> {
CollectionDetailsHandler {
key,
app,
@@ -95,7 +97,8 @@ impl<'a> KeyEventHandler<'a, ActiveRadarrBlock> for CollectionDetailsHandler<'a>
)
.into(),
);
self.app.data.radarr_data.selected_block = ActiveRadarrBlock::AddMovieSelectRootFolder;
self.app.data.radarr_data.selected_block =
BlockSelectionState::new(&ADD_MOVIE_SELECTION_BLOCKS);
self.app.data.radarr_data.populate_preferences_lists();
}
}
@@ -124,7 +127,8 @@ impl<'a> KeyEventHandler<'a, ActiveRadarrBlock> for CollectionDetailsHandler<'a>
.into(),
);
self.app.data.radarr_data.populate_edit_collection_fields();
self.app.data.radarr_data.selected_block = ActiveRadarrBlock::EditCollectionToggleMonitored;
self.app.data.radarr_data.selected_block =
BlockSelectionState::new(&EDIT_COLLECTION_SELECTION_BLOCKS);
}
}
}
@@ -182,7 +186,9 @@ mod tests {
use bimap::BiMap;
use pretty_assertions::assert_eq;
use crate::app::radarr::ADD_MOVIE_SELECTION_BLOCKS;
use crate::models::radarr_models::Movie;
use crate::models::BlockSelectionState;
use super::*;
@@ -198,7 +204,12 @@ mod tests {
.set_items(vec![CollectionMovie::default()]);
app.data.radarr_data.quality_profile_map =
BiMap::from_iter([(1, "B - Test 2".to_owned()), (0, "A - Test 1".to_owned())]);
app.data.radarr_data.selected_block = ActiveRadarrBlock::AddMovieConfirmPrompt;
app.data.radarr_data.selected_block = BlockSelectionState::new(&ADD_MOVIE_SELECTION_BLOCKS);
app
.data
.radarr_data
.selected_block
.set_index(ADD_MOVIE_SELECTION_BLOCKS.len() - 1);
CollectionDetailsHandler::with(
&SUBMIT_KEY,
@@ -218,8 +229,8 @@ mod tests {
);
assert!(!app.data.radarr_data.monitor_list.items.is_empty());
assert_eq!(
app.data.radarr_data.selected_block,
ActiveRadarrBlock::AddMovieSelectRootFolder
app.data.radarr_data.selected_block.get_active_block(),
&ActiveRadarrBlock::AddMovieSelectRootFolder
);
assert!(!app
.data
@@ -329,7 +340,9 @@ mod tests {
use crate::app::radarr::radarr_test_utils::create_test_radarr_data;
use crate::app::radarr::RadarrData;
use crate::app::radarr::EDIT_COLLECTION_SELECTION_BLOCKS;
use crate::models::radarr_models::{Collection, MinimumAvailability};
use crate::models::BlockSelectionState;
use crate::models::HorizontallyScrollableText;
use crate::models::StatefulTable;
use crate::test_edit_collection_key;
@@ -4,17 +4,17 @@ use crate::event::Key;
use crate::handlers::{handle_prompt_toggle, KeyEventHandler};
use crate::network::radarr_network::RadarrEvent;
pub(super) struct DeleteMovieHandler<'a> {
pub(super) struct DeleteMovieHandler<'a, 'b> {
key: &'a Key,
app: &'a mut App,
app: &'a mut App<'b>,
active_radarr_block: &'a ActiveRadarrBlock,
_context: &'a Option<ActiveRadarrBlock>,
}
impl<'a> KeyEventHandler<'a, ActiveRadarrBlock> for DeleteMovieHandler<'a> {
impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for DeleteMovieHandler<'a, 'b> {
fn with(
key: &'a Key,
app: &'a mut App,
app: &'a mut App<'b>,
active_block: &'a ActiveRadarrBlock,
_context: &'a Option<ActiveRadarrBlock>,
) -> Self {
@@ -32,23 +32,13 @@ impl<'a> KeyEventHandler<'a, ActiveRadarrBlock> for DeleteMovieHandler<'a> {
fn handle_scroll_up(&mut self) {
if *self.active_radarr_block == ActiveRadarrBlock::DeleteMoviePrompt {
self.app.data.radarr_data.selected_block = self
.app
.data
.radarr_data
.selected_block
.previous_delete_movie_prompt_block();
self.app.data.radarr_data.selected_block.previous();
}
}
fn handle_scroll_down(&mut self) {
if *self.active_radarr_block == ActiveRadarrBlock::DeleteMoviePrompt {
self.app.data.radarr_data.selected_block = self
.app
.data
.radarr_data
.selected_block
.next_delete_movie_prompt_block();
self.app.data.radarr_data.selected_block.next();
}
}
@@ -66,7 +56,7 @@ impl<'a> KeyEventHandler<'a, ActiveRadarrBlock> for DeleteMovieHandler<'a> {
fn handle_submit(&mut self) {
if self.active_radarr_block == &ActiveRadarrBlock::DeleteMoviePrompt {
match self.app.data.radarr_data.selected_block {
match self.app.data.radarr_data.selected_block.get_active_block() {
ActiveRadarrBlock::DeleteMovieConfirmPrompt => {
if self.app.data.radarr_data.prompt_confirm {
self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::DeleteMovie);
@@ -114,25 +104,30 @@ mod tests {
use pretty_assertions::assert_eq;
use rstest::rstest;
use crate::app::radarr::DELETE_MOVIE_SELECTION_BLOCKS;
use crate::models::BlockSelectionState;
use super::*;
#[rstest]
fn test_delete_movie_prompt_scroll(#[values(Key::Up, Key::Down)] key: Key) {
let mut app = App::default();
app.data.radarr_data.selected_block = ActiveRadarrBlock::DeleteMovieToggleAddListExclusion;
app.data.radarr_data.selected_block =
BlockSelectionState::new(&DELETE_MOVIE_SELECTION_BLOCKS);
app.data.radarr_data.selected_block.next();
DeleteMovieHandler::with(&key, &mut app, &ActiveRadarrBlock::DeleteMoviePrompt, &None)
.handle();
if key == Key::Up {
assert_eq!(
app.data.radarr_data.selected_block,
ActiveRadarrBlock::DeleteMovieToggleDeleteFile
app.data.radarr_data.selected_block.get_active_block(),
&ActiveRadarrBlock::DeleteMovieToggleDeleteFile
);
} else {
assert_eq!(
app.data.radarr_data.selected_block,
ActiveRadarrBlock::DeleteMovieConfirmPrompt
app.data.radarr_data.selected_block.get_active_block(),
&ActiveRadarrBlock::DeleteMovieConfirmPrompt
);
}
}
@@ -162,6 +157,8 @@ mod tests {
mod test_handle_submit {
use pretty_assertions::assert_eq;
use crate::app::radarr::DELETE_MOVIE_SELECTION_BLOCKS;
use crate::models::BlockSelectionState;
use crate::network::radarr_network::RadarrEvent;
use super::*;
@@ -173,7 +170,13 @@ mod tests {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Movies.into());
app.push_navigation_stack(ActiveRadarrBlock::DeleteMoviePrompt.into());
app.data.radarr_data.selected_block = ActiveRadarrBlock::DeleteMovieConfirmPrompt;
app.data.radarr_data.selected_block =
BlockSelectionState::new(&DELETE_MOVIE_SELECTION_BLOCKS);
app
.data
.radarr_data
.selected_block
.set_index(DELETE_MOVIE_SELECTION_BLOCKS.len() - 1);
app.data.radarr_data.delete_movie_files = true;
app.data.radarr_data.add_list_exclusion = true;
@@ -200,7 +203,13 @@ mod tests {
app.data.radarr_data.prompt_confirm = true;
app.data.radarr_data.delete_movie_files = true;
app.data.radarr_data.add_list_exclusion = true;
app.data.radarr_data.selected_block = ActiveRadarrBlock::DeleteMovieConfirmPrompt;
app.data.radarr_data.selected_block =
BlockSelectionState::new(&DELETE_MOVIE_SELECTION_BLOCKS);
app
.data
.radarr_data
.selected_block
.set_index(DELETE_MOVIE_SELECTION_BLOCKS.len() - 1);
DeleteMovieHandler::with(
&SUBMIT_KEY,
@@ -225,7 +234,8 @@ mod tests {
fn test_delete_movie_toggle_delete_files_submit() {
let current_route = ActiveRadarrBlock::DeleteMoviePrompt.into();
let mut app = App::default();
app.data.radarr_data.selected_block = ActiveRadarrBlock::DeleteMovieToggleDeleteFile;
app.data.radarr_data.selected_block =
BlockSelectionState::new(&DELETE_MOVIE_SELECTION_BLOCKS);
app.push_navigation_stack(ActiveRadarrBlock::DeleteMoviePrompt.into());
DeleteMovieHandler::with(
@@ -7,20 +7,20 @@ use crate::models::Scrollable;
use crate::network::radarr_network::RadarrEvent;
use crate::{handle_text_box_keys, handle_text_box_left_right_keys};
pub(super) struct EditCollectionHandler<'a> {
pub(super) struct EditCollectionHandler<'a, 'b> {
key: &'a Key,
app: &'a mut App,
app: &'a mut App<'b>,
active_radarr_block: &'a ActiveRadarrBlock,
context: &'a Option<ActiveRadarrBlock>,
}
impl<'a> KeyEventHandler<'a, ActiveRadarrBlock> for EditCollectionHandler<'a> {
impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for EditCollectionHandler<'a, 'b> {
fn with(
key: &'a Key,
app: &'a mut App,
app: &'a mut App<'b>,
active_block: &'a ActiveRadarrBlock,
context: &'a Option<ActiveRadarrBlock>,
) -> EditCollectionHandler<'a> {
) -> EditCollectionHandler<'a, 'b> {
EditCollectionHandler {
key,
app,
@@ -45,12 +45,7 @@ impl<'a> KeyEventHandler<'a, ActiveRadarrBlock> for EditCollectionHandler<'a> {
self.app.data.radarr_data.quality_profile_list.scroll_up()
}
ActiveRadarrBlock::EditCollectionPrompt => {
self.app.data.radarr_data.selected_block = self
.app
.data
.radarr_data
.selected_block
.previous_edit_collection_prompt_block()
self.app.data.radarr_data.selected_block.previous()
}
_ => (),
}
@@ -67,14 +62,7 @@ impl<'a> KeyEventHandler<'a, ActiveRadarrBlock> for EditCollectionHandler<'a> {
ActiveRadarrBlock::EditCollectionSelectQualityProfile => {
self.app.data.radarr_data.quality_profile_list.scroll_down()
}
ActiveRadarrBlock::EditCollectionPrompt => {
self.app.data.radarr_data.selected_block = self
.app
.data
.radarr_data
.selected_block
.next_edit_collection_prompt_block()
}
ActiveRadarrBlock::EditCollectionPrompt => self.app.data.radarr_data.selected_block.next(),
_ => (),
}
}
@@ -135,41 +123,53 @@ impl<'a> KeyEventHandler<'a, ActiveRadarrBlock> for EditCollectionHandler<'a> {
fn handle_submit(&mut self) {
match self.active_radarr_block {
ActiveRadarrBlock::EditCollectionPrompt => match self.app.data.radarr_data.selected_block {
ActiveRadarrBlock::EditCollectionConfirmPrompt => {
if self.app.data.radarr_data.prompt_confirm {
self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::EditCollection);
self.app.should_refresh = true;
}
ActiveRadarrBlock::EditCollectionPrompt => {
match self.app.data.radarr_data.selected_block.get_active_block() {
ActiveRadarrBlock::EditCollectionConfirmPrompt => {
if self.app.data.radarr_data.prompt_confirm {
self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::EditCollection);
self.app.should_refresh = true;
}
self.app.pop_navigation_stack();
self.app.pop_navigation_stack();
}
ActiveRadarrBlock::EditCollectionSelectMinimumAvailability
| ActiveRadarrBlock::EditCollectionSelectQualityProfile => {
self.app.push_navigation_stack(
(
*self.app.data.radarr_data.selected_block.get_active_block(),
*self.context,
)
.into(),
)
}
ActiveRadarrBlock::EditCollectionRootFolderPathInput => {
self.app.push_navigation_stack(
(
*self.app.data.radarr_data.selected_block.get_active_block(),
*self.context,
)
.into(),
);
self.app.should_ignore_quit_key = true;
}
ActiveRadarrBlock::EditCollectionToggleMonitored => {
self.app.data.radarr_data.edit_monitored =
Some(!self.app.data.radarr_data.edit_monitored.unwrap_or_default())
}
ActiveRadarrBlock::EditCollectionToggleSearchOnAdd => {
self.app.data.radarr_data.edit_search_on_add = Some(
!self
.app
.data
.radarr_data
.edit_search_on_add
.unwrap_or_default(),
)
}
_ => (),
}
ActiveRadarrBlock::EditCollectionSelectMinimumAvailability
| ActiveRadarrBlock::EditCollectionSelectQualityProfile => self
.app
.push_navigation_stack((self.app.data.radarr_data.selected_block, *self.context).into()),
ActiveRadarrBlock::EditCollectionRootFolderPathInput => {
self.app.push_navigation_stack(
(self.app.data.radarr_data.selected_block, *self.context).into(),
);
self.app.should_ignore_quit_key = true;
}
ActiveRadarrBlock::EditCollectionToggleMonitored => {
self.app.data.radarr_data.edit_monitored =
Some(!self.app.data.radarr_data.edit_monitored.unwrap_or_default())
}
ActiveRadarrBlock::EditCollectionToggleSearchOnAdd => {
self.app.data.radarr_data.edit_search_on_add = Some(
!self
.app
.data
.radarr_data
.edit_search_on_add
.unwrap_or_default(),
)
}
_ => (),
},
}
ActiveRadarrBlock::EditCollectionSelectMinimumAvailability
| ActiveRadarrBlock::EditCollectionSelectQualityProfile => self.app.pop_navigation_stack(),
ActiveRadarrBlock::EditCollectionRootFolderPathInput => {
@@ -222,6 +222,8 @@ mod tests {
use rstest::rstest;
use strum::IntoEnumIterator;
use crate::app::radarr::EDIT_COLLECTION_SELECTION_BLOCKS;
use crate::models::BlockSelectionState;
use crate::{test_enum_scroll, test_iterable_scroll};
use super::*;
@@ -247,7 +249,8 @@ mod tests {
fn test_edit_collection_prompt_scroll(#[values(Key::Up, Key::Down)] key: Key) {
let mut app = App::default();
app.data.radarr_data.selected_block =
ActiveRadarrBlock::EditCollectionSelectMinimumAvailability;
BlockSelectionState::new(&EDIT_COLLECTION_SELECTION_BLOCKS);
app.data.radarr_data.selected_block.next();
EditCollectionHandler::with(
&key,
@@ -259,13 +262,13 @@ mod tests {
if key == Key::Up {
assert_eq!(
app.data.radarr_data.selected_block,
ActiveRadarrBlock::EditCollectionToggleMonitored
app.data.radarr_data.selected_block.get_active_block(),
&ActiveRadarrBlock::EditCollectionToggleMonitored
);
} else {
assert_eq!(
app.data.radarr_data.selected_block,
ActiveRadarrBlock::EditCollectionSelectQualityProfile
app.data.radarr_data.selected_block.get_active_block(),
&ActiveRadarrBlock::EditCollectionSelectQualityProfile
);
}
}
@@ -351,7 +354,8 @@ mod tests {
use pretty_assertions::assert_eq;
use rstest::rstest;
use crate::models::Route;
use crate::app::radarr::EDIT_COLLECTION_SELECTION_BLOCKS;
use crate::models::{BlockSelectionState, Route};
use crate::network::radarr_network::RadarrEvent;
use super::*;
@@ -387,7 +391,13 @@ mod tests {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Collections.into());
app.push_navigation_stack(ActiveRadarrBlock::EditCollectionPrompt.into());
app.data.radarr_data.selected_block = ActiveRadarrBlock::EditCollectionConfirmPrompt;
app.data.radarr_data.selected_block =
BlockSelectionState::new(&EDIT_COLLECTION_SELECTION_BLOCKS);
app
.data
.radarr_data
.selected_block
.set_index(EDIT_COLLECTION_SELECTION_BLOCKS.len() - 1);
EditCollectionHandler::with(
&SUBMIT_KEY,
@@ -410,7 +420,13 @@ mod tests {
app.push_navigation_stack(ActiveRadarrBlock::Collections.into());
app.push_navigation_stack(ActiveRadarrBlock::EditCollectionPrompt.into());
app.data.radarr_data.prompt_confirm = true;
app.data.radarr_data.selected_block = ActiveRadarrBlock::EditCollectionConfirmPrompt;
app.data.radarr_data.selected_block =
BlockSelectionState::new(&EDIT_COLLECTION_SELECTION_BLOCKS);
app
.data
.radarr_data
.selected_block
.set_index(EDIT_COLLECTION_SELECTION_BLOCKS.len() - 1);
EditCollectionHandler::with(
&SUBMIT_KEY,
@@ -438,7 +454,8 @@ mod tests {
Some(ActiveRadarrBlock::Collections),
));
let mut app = App::default();
app.data.radarr_data.selected_block = ActiveRadarrBlock::EditCollectionToggleMonitored;
app.data.radarr_data.selected_block =
BlockSelectionState::new(&EDIT_COLLECTION_SELECTION_BLOCKS);
app.push_navigation_stack(current_route);
EditCollectionHandler::with(
@@ -471,7 +488,13 @@ mod tests {
Some(ActiveRadarrBlock::Collections),
));
let mut app = App::default();
app.data.radarr_data.selected_block = ActiveRadarrBlock::EditCollectionToggleSearchOnAdd;
app.data.radarr_data.selected_block =
BlockSelectionState::new(&EDIT_COLLECTION_SELECTION_BLOCKS);
app
.data
.radarr_data
.selected_block
.set_index(EDIT_COLLECTION_SELECTION_BLOCKS.len() - 2);
app.push_navigation_stack(current_route);
EditCollectionHandler::with(
@@ -498,13 +521,12 @@ mod tests {
}
#[rstest]
#[case(ActiveRadarrBlock::EditCollectionSelectMinimumAvailability, 1)]
#[case(ActiveRadarrBlock::EditCollectionSelectQualityProfile, 2)]
#[case(ActiveRadarrBlock::EditCollectionRootFolderPathInput, 3)]
fn test_edit_collection_prompt_selected_block_submit(
#[values(
ActiveRadarrBlock::EditCollectionSelectMinimumAvailability,
ActiveRadarrBlock::EditCollectionSelectQualityProfile,
ActiveRadarrBlock::EditCollectionRootFolderPathInput
)]
selected_block: ActiveRadarrBlock,
#[case] selected_block: ActiveRadarrBlock,
#[case] index: usize,
) {
let mut app = App::default();
app.push_navigation_stack(
@@ -514,7 +536,9 @@ mod tests {
)
.into(),
);
app.data.radarr_data.selected_block = selected_block;
app.data.radarr_data.selected_block =
BlockSelectionState::new(&EDIT_COLLECTION_SELECTION_BLOCKS);
app.data.radarr_data.selected_block.set_index(index);
EditCollectionHandler::with(
&SUBMIT_KEY,
@@ -7,20 +7,20 @@ use crate::models::Scrollable;
use crate::network::radarr_network::RadarrEvent;
use crate::{handle_text_box_keys, handle_text_box_left_right_keys};
pub(super) struct EditMovieHandler<'a> {
pub(super) struct EditMovieHandler<'a, 'b> {
key: &'a Key,
app: &'a mut App,
app: &'a mut App<'b>,
active_radarr_block: &'a ActiveRadarrBlock,
context: &'a Option<ActiveRadarrBlock>,
}
impl<'a> KeyEventHandler<'a, ActiveRadarrBlock> for EditMovieHandler<'a> {
impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for EditMovieHandler<'a, 'b> {
fn with(
key: &'a Key,
app: &'a mut App,
app: &'a mut App<'b>,
active_block: &'a ActiveRadarrBlock,
context: &'a Option<ActiveRadarrBlock>,
) -> EditMovieHandler<'a> {
) -> EditMovieHandler<'a, 'b> {
EditMovieHandler {
key,
app,
@@ -44,14 +44,7 @@ impl<'a> KeyEventHandler<'a, ActiveRadarrBlock> for EditMovieHandler<'a> {
ActiveRadarrBlock::EditMovieSelectQualityProfile => {
self.app.data.radarr_data.quality_profile_list.scroll_up()
}
ActiveRadarrBlock::EditMoviePrompt => {
self.app.data.radarr_data.selected_block = self
.app
.data
.radarr_data
.selected_block
.previous_edit_movie_prompt_block()
}
ActiveRadarrBlock::EditMoviePrompt => self.app.data.radarr_data.selected_block.previous(),
_ => (),
}
}
@@ -67,14 +60,7 @@ impl<'a> KeyEventHandler<'a, ActiveRadarrBlock> for EditMovieHandler<'a> {
ActiveRadarrBlock::EditMovieSelectQualityProfile => {
self.app.data.radarr_data.quality_profile_list.scroll_down()
}
ActiveRadarrBlock::EditMoviePrompt => {
self.app.data.radarr_data.selected_block = self
.app
.data
.radarr_data
.selected_block
.next_edit_movie_prompt_block()
}
ActiveRadarrBlock::EditMoviePrompt => self.app.data.radarr_data.selected_block.next(),
_ => (),
}
}
@@ -136,31 +122,41 @@ impl<'a> KeyEventHandler<'a, ActiveRadarrBlock> for EditMovieHandler<'a> {
fn handle_submit(&mut self) {
match self.active_radarr_block {
ActiveRadarrBlock::EditMoviePrompt => match self.app.data.radarr_data.selected_block {
ActiveRadarrBlock::EditMovieConfirmPrompt => {
if self.app.data.radarr_data.prompt_confirm {
self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::EditMovie);
self.app.should_refresh = true;
}
ActiveRadarrBlock::EditMoviePrompt => {
match self.app.data.radarr_data.selected_block.get_active_block() {
ActiveRadarrBlock::EditMovieConfirmPrompt => {
if self.app.data.radarr_data.prompt_confirm {
self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::EditMovie);
self.app.should_refresh = true;
}
self.app.pop_navigation_stack();
self.app.pop_navigation_stack();
}
ActiveRadarrBlock::EditMovieSelectMinimumAvailability
| ActiveRadarrBlock::EditMovieSelectQualityProfile => self.app.push_navigation_stack(
(
*self.app.data.radarr_data.selected_block.get_active_block(),
*self.context,
)
.into(),
),
ActiveRadarrBlock::EditMoviePathInput | ActiveRadarrBlock::EditMovieTagsInput => {
self.app.push_navigation_stack(
(
*self.app.data.radarr_data.selected_block.get_active_block(),
*self.context,
)
.into(),
);
self.app.should_ignore_quit_key = true;
}
ActiveRadarrBlock::EditMovieToggleMonitored => {
self.app.data.radarr_data.edit_monitored =
Some(!self.app.data.radarr_data.edit_monitored.unwrap_or_default())
}
_ => (),
}
ActiveRadarrBlock::EditMovieSelectMinimumAvailability
| ActiveRadarrBlock::EditMovieSelectQualityProfile => self
.app
.push_navigation_stack((self.app.data.radarr_data.selected_block, *self.context).into()),
ActiveRadarrBlock::EditMoviePathInput | ActiveRadarrBlock::EditMovieTagsInput => {
self.app.push_navigation_stack(
(self.app.data.radarr_data.selected_block, *self.context).into(),
);
self.app.should_ignore_quit_key = true;
}
ActiveRadarrBlock::EditMovieToggleMonitored => {
self.app.data.radarr_data.edit_monitored =
Some(!self.app.data.radarr_data.edit_monitored.unwrap_or_default())
}
_ => (),
},
}
ActiveRadarrBlock::EditMovieSelectMinimumAvailability
| ActiveRadarrBlock::EditMovieSelectQualityProfile => self.app.pop_navigation_stack(),
ActiveRadarrBlock::EditMoviePathInput | ActiveRadarrBlock::EditMovieTagsInput => {
@@ -219,6 +215,8 @@ mod tests {
use rstest::rstest;
use strum::IntoEnumIterator;
use crate::app::radarr::EDIT_MOVIE_SELECTION_BLOCKS;
use crate::models::BlockSelectionState;
use crate::{test_enum_scroll, test_iterable_scroll};
use super::*;
@@ -243,19 +241,20 @@ mod tests {
#[rstest]
fn test_edit_movie_prompt_scroll(#[values(Key::Up, Key::Down)] key: Key) {
let mut app = App::default();
app.data.radarr_data.selected_block = ActiveRadarrBlock::EditMovieSelectMinimumAvailability;
app.data.radarr_data.selected_block = BlockSelectionState::new(&EDIT_MOVIE_SELECTION_BLOCKS);
app.data.radarr_data.selected_block.next();
EditMovieHandler::with(&key, &mut app, &ActiveRadarrBlock::EditMoviePrompt, &None).handle();
if key == Key::Up {
assert_eq!(
app.data.radarr_data.selected_block,
ActiveRadarrBlock::EditMovieToggleMonitored
app.data.radarr_data.selected_block.get_active_block(),
&ActiveRadarrBlock::EditMovieToggleMonitored
);
} else {
assert_eq!(
app.data.radarr_data.selected_block,
ActiveRadarrBlock::EditMovieSelectQualityProfile
app.data.radarr_data.selected_block.get_active_block(),
&ActiveRadarrBlock::EditMovieSelectQualityProfile
);
}
}
@@ -347,7 +346,8 @@ mod tests {
use pretty_assertions::assert_eq;
use rstest::rstest;
use crate::models::Route;
use crate::app::radarr::{EDIT_COLLECTION_SELECTION_BLOCKS, EDIT_MOVIE_SELECTION_BLOCKS};
use crate::models::{BlockSelectionState, Route};
use crate::network::radarr_network::RadarrEvent;
use super::*;
@@ -407,7 +407,12 @@ mod tests {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Movies.into());
app.push_navigation_stack(ActiveRadarrBlock::EditMoviePrompt.into());
app.data.radarr_data.selected_block = ActiveRadarrBlock::EditMovieConfirmPrompt;
app.data.radarr_data.selected_block = BlockSelectionState::new(&EDIT_MOVIE_SELECTION_BLOCKS);
app
.data
.radarr_data
.selected_block
.set_index(EDIT_COLLECTION_SELECTION_BLOCKS.len() - 1);
EditMovieHandler::with(
&SUBMIT_KEY,
@@ -427,7 +432,12 @@ mod tests {
app.push_navigation_stack(ActiveRadarrBlock::Movies.into());
app.push_navigation_stack(ActiveRadarrBlock::EditMoviePrompt.into());
app.data.radarr_data.prompt_confirm = true;
app.data.radarr_data.selected_block = ActiveRadarrBlock::EditMovieConfirmPrompt;
app.data.radarr_data.selected_block = BlockSelectionState::new(&EDIT_MOVIE_SELECTION_BLOCKS);
app
.data
.radarr_data
.selected_block
.set_index(EDIT_COLLECTION_SELECTION_BLOCKS.len() - 1);
EditMovieHandler::with(
&SUBMIT_KEY,
@@ -452,7 +462,7 @@ mod tests {
Some(ActiveRadarrBlock::Movies),
));
let mut app = App::default();
app.data.radarr_data.selected_block = ActiveRadarrBlock::EditMovieToggleMonitored;
app.data.radarr_data.selected_block = BlockSelectionState::new(&EDIT_MOVIE_SELECTION_BLOCKS);
app.push_navigation_stack(current_route);
EditMovieHandler::with(
@@ -479,14 +489,13 @@ mod tests {
}
#[rstest]
#[case(ActiveRadarrBlock::EditMovieSelectMinimumAvailability, 1)]
#[case(ActiveRadarrBlock::EditMovieSelectQualityProfile, 2)]
#[case(ActiveRadarrBlock::EditMoviePathInput, 3)]
#[case(ActiveRadarrBlock::EditMovieTagsInput, 4)]
fn test_edit_movie_prompt_selected_block_submit(
#[values(
ActiveRadarrBlock::EditMovieSelectMinimumAvailability,
ActiveRadarrBlock::EditMovieSelectQualityProfile,
ActiveRadarrBlock::EditMoviePathInput,
ActiveRadarrBlock::EditMovieTagsInput
)]
selected_block: ActiveRadarrBlock,
#[case] selected_block: ActiveRadarrBlock,
#[case] index: usize,
) {
let mut app = App::default();
app.push_navigation_stack(
@@ -496,7 +505,8 @@ mod tests {
)
.into(),
);
app.data.radarr_data.selected_block = selected_block;
app.data.radarr_data.selected_block = BlockSelectionState::new(&EDIT_MOVIE_SELECTION_BLOCKS);
app.data.radarr_data.selected_block.set_index(index);
EditMovieHandler::with(
&SUBMIT_KEY,
+34 -22
View File
@@ -1,7 +1,9 @@
use crate::app::key_binding::DEFAULT_KEYBINDINGS;
use crate::app::radarr::{
ActiveRadarrBlock, ADD_MOVIE_BLOCKS, COLLECTION_DETAILS_BLOCKS, DELETE_MOVIE_BLOCKS,
EDIT_COLLECTION_BLOCKS, EDIT_MOVIE_BLOCKS, FILTER_BLOCKS, MOVIE_DETAILS_BLOCKS, SEARCH_BLOCKS,
DELETE_MOVIE_SELECTION_BLOCKS, EDIT_COLLECTION_BLOCKS, EDIT_COLLECTION_SELECTION_BLOCKS,
EDIT_MOVIE_BLOCKS, EDIT_MOVIE_SELECTION_BLOCKS, FILTER_BLOCKS, MOVIE_DETAILS_BLOCKS,
SEARCH_BLOCKS,
};
use crate::handlers::radarr_handlers::add_movie_handler::AddMovieHandler;
use crate::handlers::radarr_handlers::collection_details_handler::CollectionDetailsHandler;
@@ -10,7 +12,7 @@ use crate::handlers::radarr_handlers::edit_collection_handler::EditCollectionHan
use crate::handlers::radarr_handlers::edit_movie_handler::EditMovieHandler;
use crate::handlers::radarr_handlers::movie_details_handler::MovieDetailsHandler;
use crate::handlers::{handle_clear_errors, handle_prompt_toggle, KeyEventHandler};
use crate::models::{HorizontallyScrollableText, Scrollable};
use crate::models::{BlockSelectionState, HorizontallyScrollableText, Scrollable};
use crate::network::radarr_network::RadarrEvent;
use crate::utils::strip_non_search_characters;
use crate::{handle_text_box_keys, handle_text_box_left_right_keys, App, Key};
@@ -22,14 +24,14 @@ mod edit_collection_handler;
mod edit_movie_handler;
mod movie_details_handler;
pub(super) struct RadarrHandler<'a> {
pub(super) struct RadarrHandler<'a, 'b> {
key: &'a Key,
app: &'a mut App,
app: &'a mut App<'b>,
active_radarr_block: &'a ActiveRadarrBlock,
context: &'a Option<ActiveRadarrBlock>,
}
impl<'a> KeyEventHandler<'a, ActiveRadarrBlock> for RadarrHandler<'a> {
impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for RadarrHandler<'a, 'b> {
fn handle(&mut self) {
match self.active_radarr_block {
_ if MOVIE_DETAILS_BLOCKS.contains(self.active_radarr_block) => {
@@ -60,10 +62,10 @@ impl<'a> KeyEventHandler<'a, ActiveRadarrBlock> for RadarrHandler<'a> {
fn with(
key: &'a Key,
app: &'a mut App,
app: &'a mut App<'b>,
active_block: &'a ActiveRadarrBlock,
context: &'a Option<ActiveRadarrBlock>,
) -> RadarrHandler<'a> {
) -> RadarrHandler<'a, 'b> {
RadarrHandler {
key,
app,
@@ -222,7 +224,8 @@ impl<'a> KeyEventHandler<'a, ActiveRadarrBlock> for RadarrHandler<'a> {
self
.app
.push_navigation_stack(ActiveRadarrBlock::DeleteMoviePrompt.into());
self.app.data.radarr_data.selected_block = ActiveRadarrBlock::DeleteMovieToggleDeleteFile;
self.app.data.radarr_data.selected_block =
BlockSelectionState::new(&DELETE_MOVIE_SELECTION_BLOCKS);
}
ActiveRadarrBlock::Downloads => self
.app
@@ -239,7 +242,8 @@ impl<'a> KeyEventHandler<'a, ActiveRadarrBlock> for RadarrHandler<'a> {
ActiveRadarrBlock::Movies
| ActiveRadarrBlock::Downloads
| ActiveRadarrBlock::Collections
| ActiveRadarrBlock::RootFolders => match self.key {
| ActiveRadarrBlock::RootFolders
| ActiveRadarrBlock::System => match self.key {
_ if *self.key == DEFAULT_KEYBINDINGS.left.key => {
self.app.data.radarr_data.main_tabs.previous();
self
@@ -473,7 +477,8 @@ impl<'a> KeyEventHandler<'a, ActiveRadarrBlock> for RadarrHandler<'a> {
.into(),
);
self.app.data.radarr_data.populate_edit_movie_fields();
self.app.data.radarr_data.selected_block = ActiveRadarrBlock::EditMovieToggleMonitored;
self.app.data.radarr_data.selected_block =
BlockSelectionState::new(&EDIT_MOVIE_SELECTION_BLOCKS);
}
_ if *key == DEFAULT_KEYBINDINGS.add.key => {
self
@@ -527,7 +532,7 @@ impl<'a> KeyEventHandler<'a, ActiveRadarrBlock> for RadarrHandler<'a> {
);
self.app.data.radarr_data.populate_edit_collection_fields();
self.app.data.radarr_data.selected_block =
ActiveRadarrBlock::EditCollectionToggleMonitored;
BlockSelectionState::new(&EDIT_COLLECTION_SELECTION_BLOCKS);
}
_ if *key == DEFAULT_KEYBINDINGS.update.key => {
self
@@ -565,7 +570,7 @@ impl<'a> KeyEventHandler<'a, ActiveRadarrBlock> for RadarrHandler<'a> {
}
}
impl RadarrHandler<'_> {
impl<'a, 'b> RadarrHandler<'a, 'b> {
fn search_table<T, F>(&mut self, rows: &[T], field_selection_fn: F) -> Option<usize>
where
F: Fn(&T) -> &str,
@@ -636,6 +641,7 @@ mod radarr_handler_test_utils {
tags: vec![Number::from(1)],
..Movie::default()
}]);
radarr_data.selected_block = BlockSelectionState::new(&EDIT_MOVIE_SELECTION_BLOCKS);
app.data.radarr_data = radarr_data;
$handler::with(&DEFAULT_KEYBINDINGS.edit.key, &mut app, &$block, &None).handle();
@@ -645,8 +651,8 @@ mod radarr_handler_test_utils {
&(ActiveRadarrBlock::EditMoviePrompt, Some($context)).into()
);
assert_eq!(
app.data.radarr_data.selected_block,
ActiveRadarrBlock::EditMovieToggleMonitored
app.data.radarr_data.selected_block.get_active_block(),
&ActiveRadarrBlock::EditMovieToggleMonitored
);
assert_eq!(
app.data.radarr_data.minimum_availability_list.items,
@@ -702,6 +708,7 @@ mod radarr_handler_test_utils {
minimum_availability: MinimumAvailability::Released,
..Collection::default()
}]);
radarr_data.selected_block = BlockSelectionState::new(&EDIT_COLLECTION_SELECTION_BLOCKS);
app.data.radarr_data = radarr_data;
$handler::with(&DEFAULT_KEYBINDINGS.edit.key, &mut app, &$block, &None).handle();
@@ -711,8 +718,8 @@ mod radarr_handler_test_utils {
&(ActiveRadarrBlock::EditCollectionPrompt, Some($context)).into()
);
assert_eq!(
app.data.radarr_data.selected_block,
ActiveRadarrBlock::EditCollectionToggleMonitored
app.data.radarr_data.selected_block.get_active_block(),
&ActiveRadarrBlock::EditCollectionToggleMonitored
);
assert_eq!(
app.data.radarr_data.minimum_availability_list.items,
@@ -951,8 +958,8 @@ mod tests {
&ActiveRadarrBlock::DeleteMoviePrompt.into()
);
assert_eq!(
app.data.radarr_data.selected_block,
ActiveRadarrBlock::DeleteMovieToggleDeleteFile
app.data.radarr_data.selected_block.get_active_block(),
&ActiveRadarrBlock::DeleteMovieToggleDeleteFile
);
}
@@ -996,10 +1003,11 @@ mod tests {
use super::*;
#[rstest]
#[case(ActiveRadarrBlock::Movies, 0, ActiveRadarrBlock::RootFolders)]
#[case(ActiveRadarrBlock::Downloads, 1, ActiveRadarrBlock::Movies)]
#[case(ActiveRadarrBlock::Collections, 2, ActiveRadarrBlock::Downloads)]
#[case(ActiveRadarrBlock::Movies, 0, ActiveRadarrBlock::System)]
#[case(ActiveRadarrBlock::System, 4, ActiveRadarrBlock::RootFolders)]
#[case(ActiveRadarrBlock::RootFolders, 3, ActiveRadarrBlock::Collections)]
#[case(ActiveRadarrBlock::Collections, 2, ActiveRadarrBlock::Downloads)]
#[case(ActiveRadarrBlock::Downloads, 1, ActiveRadarrBlock::Movies)]
fn test_radarr_tab_left(
#[case] active_radarr_block: ActiveRadarrBlock,
#[case] index: usize,
@@ -1027,7 +1035,8 @@ mod tests {
#[case(ActiveRadarrBlock::Movies, 0, ActiveRadarrBlock::Downloads)]
#[case(ActiveRadarrBlock::Downloads, 1, ActiveRadarrBlock::Collections)]
#[case(ActiveRadarrBlock::Collections, 2, ActiveRadarrBlock::RootFolders)]
#[case(ActiveRadarrBlock::RootFolders, 3, ActiveRadarrBlock::Movies)]
#[case(ActiveRadarrBlock::RootFolders, 3, ActiveRadarrBlock::System)]
#[case(ActiveRadarrBlock::System, 4, ActiveRadarrBlock::Movies)]
fn test_radarr_tab_right(
#[case] active_radarr_block: ActiveRadarrBlock,
#[case] index: usize,
@@ -1549,7 +1558,10 @@ mod tests {
use crate::app::radarr::radarr_test_utils::create_test_radarr_data;
use crate::app::radarr::RadarrData;
use crate::app::radarr::EDIT_COLLECTION_SELECTION_BLOCKS;
use crate::app::radarr::EDIT_MOVIE_SELECTION_BLOCKS;
use crate::models::radarr_models::MinimumAvailability;
use crate::models::BlockSelectionState;
use crate::models::HorizontallyScrollableText;
use crate::models::StatefulTable;
@@ -4,28 +4,28 @@ use serde_json::Number;
use strum::IntoEnumIterator;
use crate::app::key_binding::DEFAULT_KEYBINDINGS;
use crate::app::radarr::ActiveRadarrBlock;
use crate::app::radarr::{ActiveRadarrBlock, EDIT_MOVIE_SELECTION_BLOCKS};
use crate::app::App;
use crate::event::Key;
use crate::handlers::{handle_prompt_toggle, KeyEventHandler};
use crate::models::radarr_models::{Language, Release, ReleaseField};
use crate::models::Scrollable;
use crate::models::{BlockSelectionState, Scrollable};
use crate::network::radarr_network::RadarrEvent;
pub(super) struct MovieDetailsHandler<'a> {
pub(super) struct MovieDetailsHandler<'a, 'b> {
key: &'a Key,
app: &'a mut App,
app: &'a mut App<'b>,
active_radarr_block: &'a ActiveRadarrBlock,
_context: &'a Option<ActiveRadarrBlock>,
}
impl<'a> KeyEventHandler<'a, ActiveRadarrBlock> for MovieDetailsHandler<'a> {
impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for MovieDetailsHandler<'a, 'b> {
fn with(
key: &'a Key,
app: &'a mut App,
app: &'a mut App<'b>,
active_block: &'a ActiveRadarrBlock,
_context: &'a Option<ActiveRadarrBlock>,
) -> MovieDetailsHandler<'a> {
) -> MovieDetailsHandler<'a, 'b> {
MovieDetailsHandler {
key,
app,
@@ -234,7 +234,8 @@ impl<'a> KeyEventHandler<'a, ActiveRadarrBlock> for MovieDetailsHandler<'a> {
.into(),
);
self.app.data.radarr_data.populate_edit_movie_fields();
self.app.data.radarr_data.selected_block = ActiveRadarrBlock::EditMovieToggleMonitored;
self.app.data.radarr_data.selected_block =
BlockSelectionState::new(&EDIT_MOVIE_SELECTION_BLOCKS);
}
_ if *key == DEFAULT_KEYBINDINGS.update.key => {
self
@@ -779,7 +780,9 @@ mod tests {
use crate::app::radarr::radarr_test_utils::create_test_radarr_data;
use crate::app::radarr::RadarrData;
use crate::app::radarr::EDIT_MOVIE_SELECTION_BLOCKS;
use crate::models::radarr_models::{MinimumAvailability, Movie};
use crate::models::BlockSelectionState;
use crate::models::HorizontallyScrollableText;
use crate::models::StatefulTable;
use crate::test_edit_movie_key;