use crate::app::context_clues::{ build_context_clue_string, BLOCKLIST_CONTEXT_CLUES, DOWNLOADS_CONTEXT_CLUES, INDEXERS_CONTEXT_CLUES, ROOT_FOLDERS_CONTEXT_CLUES, SYSTEM_CONTEXT_CLUES, }; use crate::app::radarr::radarr_context_clues::{ COLLECTIONS_CONTEXT_CLUES, LIBRARY_CONTEXT_CLUES, MANUAL_MOVIE_SEARCH_CONTEXTUAL_CONTEXT_CLUES, MANUAL_MOVIE_SEARCH_CONTEXT_CLUES, MOVIE_DETAILS_CONTEXT_CLUES, }; use crate::models::radarr_models::{ AddMovieSearchResult, BlocklistItem, Collection, CollectionMovie, DownloadRecord, IndexerSettings, Movie, RadarrTask, }; use crate::models::servarr_data::modals::{EditIndexerModal, IndexerTestResultModalItem}; use crate::models::servarr_data::radarr::modals::{ AddMovieModal, EditCollectionModal, EditMovieModal, MovieDetailsModal, }; use crate::models::servarr_models::{DiskSpace, Indexer, QueueEvent, RootFolder}; use crate::models::stateful_list::StatefulList; use crate::models::stateful_table::StatefulTable; use crate::models::{ BlockSelectionState, HorizontallyScrollableText, Route, ScrollableText, TabRoute, TabState, }; use crate::network::radarr_network::RadarrEvent; use bimap::BiMap; use chrono::{DateTime, Utc}; use strum::EnumIter; #[cfg(test)] #[path = "radarr_data_tests.rs"] mod radarr_data_tests; #[cfg(test)] #[path = "radarr_test_utils.rs"] pub mod radarr_test_utils; pub struct RadarrData<'a> { pub root_folders: StatefulTable, pub disk_space_vec: Vec, pub version: String, pub start_time: DateTime, pub movies: StatefulTable, pub selected_block: BlockSelectionState<'a, ActiveRadarrBlock>, pub downloads: StatefulTable, pub indexers: StatefulTable, pub blocklist: StatefulTable, pub quality_profile_map: BiMap, pub tags_map: BiMap, pub collections: StatefulTable, pub collection_movies: StatefulTable, pub logs: StatefulList, pub log_details: StatefulList, pub tasks: StatefulTable, pub queued_events: StatefulTable, pub updates: ScrollableText, pub main_tabs: TabState, pub movie_info_tabs: TabState, pub add_movie_search: Option, pub add_movie_modal: Option, pub add_searched_movies: Option>, pub edit_movie_modal: Option, pub edit_collection_modal: Option, pub edit_indexer_modal: Option, pub edit_root_folder: Option, pub indexer_settings: Option, pub indexer_test_errors: Option, pub indexer_test_all_results: Option>, pub movie_details_modal: Option, pub prompt_confirm: bool, pub prompt_confirm_action: Option, pub delete_movie_files: bool, pub add_list_exclusion: bool, } impl RadarrData<'_> { pub fn reset_delete_movie_preferences(&mut self) { self.delete_movie_files = false; self.add_list_exclusion = false; } pub fn reset_movie_info_tabs(&mut self) { self.movie_details_modal = None; self.movie_info_tabs.index = 0; } } impl<'a> Default for RadarrData<'a> { fn default() -> RadarrData<'a> { RadarrData { root_folders: StatefulTable::default(), disk_space_vec: Vec::new(), version: String::new(), start_time: DateTime::default(), movies: StatefulTable::default(), selected_block: BlockSelectionState::default(), downloads: StatefulTable::default(), indexers: StatefulTable::default(), blocklist: StatefulTable::default(), quality_profile_map: BiMap::default(), tags_map: BiMap::default(), collections: StatefulTable::default(), collection_movies: StatefulTable::default(), logs: StatefulList::default(), log_details: StatefulList::default(), tasks: StatefulTable::default(), queued_events: StatefulTable::default(), updates: ScrollableText::default(), add_movie_search: None, add_movie_modal: None, add_searched_movies: None, edit_movie_modal: None, edit_collection_modal: None, edit_indexer_modal: None, edit_root_folder: None, indexer_settings: None, indexer_test_errors: None, indexer_test_all_results: None, movie_details_modal: None, prompt_confirm: false, prompt_confirm_action: None, delete_movie_files: false, add_list_exclusion: false, main_tabs: TabState::new(vec![ TabRoute { title: "Library", route: ActiveRadarrBlock::Movies.into(), help: String::new(), contextual_help: Some(build_context_clue_string(&LIBRARY_CONTEXT_CLUES)), }, TabRoute { title: "Collections", route: ActiveRadarrBlock::Collections.into(), help: String::new(), contextual_help: Some(build_context_clue_string(&COLLECTIONS_CONTEXT_CLUES)), }, TabRoute { title: "Downloads", route: ActiveRadarrBlock::Downloads.into(), help: String::new(), contextual_help: Some(build_context_clue_string(&DOWNLOADS_CONTEXT_CLUES)), }, TabRoute { title: "Blocklist", route: ActiveRadarrBlock::Blocklist.into(), help: String::new(), contextual_help: Some(build_context_clue_string(&BLOCKLIST_CONTEXT_CLUES)), }, TabRoute { title: "Root Folders", route: ActiveRadarrBlock::RootFolders.into(), help: String::new(), contextual_help: Some(build_context_clue_string(&ROOT_FOLDERS_CONTEXT_CLUES)), }, TabRoute { title: "Indexers", route: ActiveRadarrBlock::Indexers.into(), help: String::new(), contextual_help: Some(build_context_clue_string(&INDEXERS_CONTEXT_CLUES)), }, TabRoute { title: "System", route: ActiveRadarrBlock::System.into(), help: String::new(), contextual_help: Some(build_context_clue_string(&SYSTEM_CONTEXT_CLUES)), }, ]), movie_info_tabs: TabState::new(vec![ TabRoute { title: "Details", route: ActiveRadarrBlock::MovieDetails.into(), help: build_context_clue_string(&MOVIE_DETAILS_CONTEXT_CLUES), contextual_help: None, }, TabRoute { title: "History", route: ActiveRadarrBlock::MovieHistory.into(), help: build_context_clue_string(&MOVIE_DETAILS_CONTEXT_CLUES), contextual_help: None, }, TabRoute { title: "File", route: ActiveRadarrBlock::FileInfo.into(), help: build_context_clue_string(&MOVIE_DETAILS_CONTEXT_CLUES), contextual_help: None, }, TabRoute { title: "Cast", route: ActiveRadarrBlock::Cast.into(), help: build_context_clue_string(&MOVIE_DETAILS_CONTEXT_CLUES), contextual_help: None, }, TabRoute { title: "Crew", route: ActiveRadarrBlock::Crew.into(), help: build_context_clue_string(&MOVIE_DETAILS_CONTEXT_CLUES), contextual_help: None, }, TabRoute { title: "Manual Search", route: ActiveRadarrBlock::ManualSearch.into(), help: build_context_clue_string(&MANUAL_MOVIE_SEARCH_CONTEXT_CLUES), contextual_help: Some(build_context_clue_string( &MANUAL_MOVIE_SEARCH_CONTEXTUAL_CONTEXT_CLUES, )), }, ]), } } } #[derive(Clone, Copy, PartialEq, Eq, Debug, Default, EnumIter)] pub enum ActiveRadarrBlock { AddMovieAlreadyInLibrary, AddMovieSearchInput, AddMovieSearchResults, AddMoviePrompt, AddMovieSelectMinimumAvailability, AddMovieSelectQualityProfile, AddMovieSelectMonitor, AddMovieSelectRootFolder, AddMovieConfirmPrompt, AddMovieTagsInput, AddMovieEmptySearchResults, AddRootFolderPrompt, AutomaticallySearchMoviePrompt, Blocklist, BlocklistClearAllItemsPrompt, BlocklistItemDetails, BlocklistSortPrompt, Collections, CollectionsSortPrompt, CollectionDetails, Cast, Crew, DeleteBlocklistItemPrompt, DeleteDownloadPrompt, DeleteIndexerPrompt, DeleteMoviePrompt, DeleteMovieConfirmPrompt, DeleteMovieToggleDeleteFile, DeleteMovieToggleAddListExclusion, DeleteRootFolderPrompt, Downloads, EditCollectionPrompt, EditCollectionConfirmPrompt, EditCollectionRootFolderPathInput, EditCollectionSelectMinimumAvailability, EditCollectionSelectQualityProfile, EditCollectionToggleSearchOnAdd, EditCollectionToggleMonitored, EditIndexerPrompt, EditIndexerConfirmPrompt, EditIndexerApiKeyInput, EditIndexerNameInput, EditIndexerSeedRatioInput, EditIndexerToggleEnableRss, EditIndexerToggleEnableAutomaticSearch, EditIndexerToggleEnableInteractiveSearch, EditIndexerPriorityInput, EditIndexerUrlInput, EditIndexerTagsInput, EditMoviePrompt, EditMovieConfirmPrompt, EditMoviePathInput, EditMovieSelectMinimumAvailability, EditMovieSelectQualityProfile, EditMovieTagsInput, EditMovieToggleMonitored, FileInfo, FilterCollections, FilterCollectionsError, FilterMovies, FilterMoviesError, Indexers, AllIndexerSettingsPrompt, IndexerSettingsAvailabilityDelayInput, IndexerSettingsConfirmPrompt, IndexerSettingsMaximumSizeInput, IndexerSettingsMinimumAgeInput, IndexerSettingsRetentionInput, IndexerSettingsRssSyncIntervalInput, IndexerSettingsToggleAllowHardcodedSubs, IndexerSettingsTogglePreferIndexerFlags, IndexerSettingsWhitelistedSubtitleTagsInput, ManualSearch, ManualSearchSortPrompt, ManualSearchConfirmPrompt, MovieDetails, MovieHistory, #[default] Movies, MoviesSortPrompt, RootFolders, System, SystemLogs, SystemQueuedEvents, SystemTasks, SystemTaskStartConfirmPrompt, SystemUpdates, TestIndexer, TestAllIndexers, UpdateAndScanPrompt, UpdateAllCollectionsPrompt, UpdateAllMoviesPrompt, UpdateDownloadsPrompt, SearchCollection, SearchCollectionError, SearchMovie, SearchMovieError, ViewMovieOverview, } pub static LIBRARY_BLOCKS: [ActiveRadarrBlock; 7] = [ ActiveRadarrBlock::Movies, ActiveRadarrBlock::MoviesSortPrompt, ActiveRadarrBlock::SearchMovie, ActiveRadarrBlock::SearchMovieError, ActiveRadarrBlock::FilterMovies, ActiveRadarrBlock::FilterMoviesError, ActiveRadarrBlock::UpdateAllMoviesPrompt, ]; pub static COLLECTIONS_BLOCKS: [ActiveRadarrBlock; 7] = [ ActiveRadarrBlock::Collections, ActiveRadarrBlock::CollectionsSortPrompt, ActiveRadarrBlock::SearchCollection, ActiveRadarrBlock::SearchCollectionError, ActiveRadarrBlock::FilterCollections, ActiveRadarrBlock::FilterCollectionsError, ActiveRadarrBlock::UpdateAllCollectionsPrompt, ]; pub static INDEXERS_BLOCKS: [ActiveRadarrBlock; 3] = [ ActiveRadarrBlock::DeleteIndexerPrompt, ActiveRadarrBlock::Indexers, ActiveRadarrBlock::TestIndexer, ]; pub static ROOT_FOLDERS_BLOCKS: [ActiveRadarrBlock; 3] = [ ActiveRadarrBlock::RootFolders, ActiveRadarrBlock::AddRootFolderPrompt, ActiveRadarrBlock::DeleteRootFolderPrompt, ]; pub static BLOCKLIST_BLOCKS: [ActiveRadarrBlock; 5] = [ ActiveRadarrBlock::Blocklist, ActiveRadarrBlock::BlocklistItemDetails, ActiveRadarrBlock::DeleteBlocklistItemPrompt, ActiveRadarrBlock::BlocklistClearAllItemsPrompt, ActiveRadarrBlock::BlocklistSortPrompt, ]; pub static ADD_MOVIE_BLOCKS: [ActiveRadarrBlock; 10] = [ ActiveRadarrBlock::AddMovieSearchInput, ActiveRadarrBlock::AddMovieSearchResults, ActiveRadarrBlock::AddMovieEmptySearchResults, ActiveRadarrBlock::AddMoviePrompt, ActiveRadarrBlock::AddMovieSelectMinimumAvailability, ActiveRadarrBlock::AddMovieSelectMonitor, ActiveRadarrBlock::AddMovieSelectQualityProfile, ActiveRadarrBlock::AddMovieSelectRootFolder, ActiveRadarrBlock::AddMovieAlreadyInLibrary, ActiveRadarrBlock::AddMovieTagsInput, ]; pub const ADD_MOVIE_SELECTION_BLOCKS: &[&[ActiveRadarrBlock]] = &[ &[ActiveRadarrBlock::AddMovieSelectRootFolder], &[ActiveRadarrBlock::AddMovieSelectMonitor], &[ActiveRadarrBlock::AddMovieSelectMinimumAvailability], &[ActiveRadarrBlock::AddMovieSelectQualityProfile], &[ActiveRadarrBlock::AddMovieTagsInput], &[ActiveRadarrBlock::AddMovieConfirmPrompt], ]; pub static EDIT_COLLECTION_BLOCKS: [ActiveRadarrBlock; 7] = [ ActiveRadarrBlock::EditCollectionPrompt, ActiveRadarrBlock::EditCollectionConfirmPrompt, ActiveRadarrBlock::EditCollectionRootFolderPathInput, ActiveRadarrBlock::EditCollectionSelectMinimumAvailability, ActiveRadarrBlock::EditCollectionSelectQualityProfile, ActiveRadarrBlock::EditCollectionToggleSearchOnAdd, ActiveRadarrBlock::EditCollectionToggleMonitored, ]; pub const EDIT_COLLECTION_SELECTION_BLOCKS: &[&[ActiveRadarrBlock]] = &[ &[ActiveRadarrBlock::EditCollectionToggleMonitored], &[ActiveRadarrBlock::EditCollectionSelectMinimumAvailability], &[ActiveRadarrBlock::EditCollectionSelectQualityProfile], &[ActiveRadarrBlock::EditCollectionRootFolderPathInput], &[ActiveRadarrBlock::EditCollectionToggleSearchOnAdd], &[ActiveRadarrBlock::EditCollectionConfirmPrompt], ]; pub static EDIT_MOVIE_BLOCKS: [ActiveRadarrBlock; 7] = [ ActiveRadarrBlock::EditMoviePrompt, ActiveRadarrBlock::EditMovieConfirmPrompt, ActiveRadarrBlock::EditMoviePathInput, ActiveRadarrBlock::EditMovieSelectMinimumAvailability, ActiveRadarrBlock::EditMovieSelectQualityProfile, ActiveRadarrBlock::EditMovieTagsInput, ActiveRadarrBlock::EditMovieToggleMonitored, ]; pub const EDIT_MOVIE_SELECTION_BLOCKS: &[&[ActiveRadarrBlock]] = &[ &[ActiveRadarrBlock::EditMovieToggleMonitored], &[ActiveRadarrBlock::EditMovieSelectMinimumAvailability], &[ActiveRadarrBlock::EditMovieSelectQualityProfile], &[ActiveRadarrBlock::EditMoviePathInput], &[ActiveRadarrBlock::EditMovieTagsInput], &[ActiveRadarrBlock::EditMovieConfirmPrompt], ]; pub static DOWNLOADS_BLOCKS: [ActiveRadarrBlock; 3] = [ ActiveRadarrBlock::Downloads, ActiveRadarrBlock::DeleteDownloadPrompt, ActiveRadarrBlock::UpdateDownloadsPrompt, ]; pub static MOVIE_DETAILS_BLOCKS: [ActiveRadarrBlock; 10] = [ ActiveRadarrBlock::MovieDetails, ActiveRadarrBlock::MovieHistory, ActiveRadarrBlock::FileInfo, ActiveRadarrBlock::Cast, ActiveRadarrBlock::Crew, ActiveRadarrBlock::AutomaticallySearchMoviePrompt, ActiveRadarrBlock::UpdateAndScanPrompt, ActiveRadarrBlock::ManualSearch, ActiveRadarrBlock::ManualSearchSortPrompt, ActiveRadarrBlock::ManualSearchConfirmPrompt, ]; pub static COLLECTION_DETAILS_BLOCKS: [ActiveRadarrBlock; 2] = [ ActiveRadarrBlock::CollectionDetails, ActiveRadarrBlock::ViewMovieOverview, ]; pub static DELETE_MOVIE_BLOCKS: [ActiveRadarrBlock; 4] = [ ActiveRadarrBlock::DeleteMoviePrompt, ActiveRadarrBlock::DeleteMovieConfirmPrompt, ActiveRadarrBlock::DeleteMovieToggleDeleteFile, ActiveRadarrBlock::DeleteMovieToggleAddListExclusion, ]; pub const DELETE_MOVIE_SELECTION_BLOCKS: &[&[ActiveRadarrBlock]] = &[ &[ActiveRadarrBlock::DeleteMovieToggleDeleteFile], &[ActiveRadarrBlock::DeleteMovieToggleAddListExclusion], &[ActiveRadarrBlock::DeleteMovieConfirmPrompt], ]; pub static EDIT_INDEXER_BLOCKS: [ActiveRadarrBlock; 11] = [ ActiveRadarrBlock::EditIndexerPrompt, ActiveRadarrBlock::EditIndexerConfirmPrompt, ActiveRadarrBlock::EditIndexerApiKeyInput, ActiveRadarrBlock::EditIndexerNameInput, ActiveRadarrBlock::EditIndexerSeedRatioInput, ActiveRadarrBlock::EditIndexerToggleEnableRss, ActiveRadarrBlock::EditIndexerToggleEnableAutomaticSearch, ActiveRadarrBlock::EditIndexerToggleEnableInteractiveSearch, ActiveRadarrBlock::EditIndexerPriorityInput, ActiveRadarrBlock::EditIndexerUrlInput, ActiveRadarrBlock::EditIndexerTagsInput, ]; pub const EDIT_INDEXER_TORRENT_SELECTION_BLOCKS: &[&[ActiveRadarrBlock]] = &[ &[ ActiveRadarrBlock::EditIndexerNameInput, ActiveRadarrBlock::EditIndexerUrlInput, ], &[ ActiveRadarrBlock::EditIndexerToggleEnableRss, ActiveRadarrBlock::EditIndexerApiKeyInput, ], &[ ActiveRadarrBlock::EditIndexerToggleEnableAutomaticSearch, ActiveRadarrBlock::EditIndexerSeedRatioInput, ], &[ ActiveRadarrBlock::EditIndexerToggleEnableInteractiveSearch, ActiveRadarrBlock::EditIndexerTagsInput, ], &[ ActiveRadarrBlock::EditIndexerPriorityInput, ActiveRadarrBlock::EditIndexerConfirmPrompt, ], &[ ActiveRadarrBlock::EditIndexerConfirmPrompt, ActiveRadarrBlock::EditIndexerConfirmPrompt, ], ]; pub const EDIT_INDEXER_NZB_SELECTION_BLOCKS: &[&[ActiveRadarrBlock]] = &[ &[ ActiveRadarrBlock::EditIndexerNameInput, ActiveRadarrBlock::EditIndexerUrlInput, ], &[ ActiveRadarrBlock::EditIndexerToggleEnableRss, ActiveRadarrBlock::EditIndexerApiKeyInput, ], &[ ActiveRadarrBlock::EditIndexerToggleEnableAutomaticSearch, ActiveRadarrBlock::EditIndexerTagsInput, ], &[ ActiveRadarrBlock::EditIndexerToggleEnableInteractiveSearch, ActiveRadarrBlock::EditIndexerPriorityInput, ], &[ ActiveRadarrBlock::EditIndexerConfirmPrompt, ActiveRadarrBlock::EditIndexerConfirmPrompt, ], ]; pub static INDEXER_SETTINGS_BLOCKS: [ActiveRadarrBlock; 10] = [ ActiveRadarrBlock::AllIndexerSettingsPrompt, ActiveRadarrBlock::IndexerSettingsAvailabilityDelayInput, ActiveRadarrBlock::IndexerSettingsConfirmPrompt, ActiveRadarrBlock::IndexerSettingsMaximumSizeInput, ActiveRadarrBlock::IndexerSettingsMinimumAgeInput, ActiveRadarrBlock::IndexerSettingsRetentionInput, ActiveRadarrBlock::IndexerSettingsRssSyncIntervalInput, ActiveRadarrBlock::IndexerSettingsToggleAllowHardcodedSubs, ActiveRadarrBlock::IndexerSettingsTogglePreferIndexerFlags, ActiveRadarrBlock::IndexerSettingsWhitelistedSubtitleTagsInput, ]; pub const INDEXER_SETTINGS_SELECTION_BLOCKS: &[&[ActiveRadarrBlock]] = &[ &[ ActiveRadarrBlock::IndexerSettingsMinimumAgeInput, ActiveRadarrBlock::IndexerSettingsAvailabilityDelayInput, ], &[ ActiveRadarrBlock::IndexerSettingsRetentionInput, ActiveRadarrBlock::IndexerSettingsRssSyncIntervalInput, ], &[ ActiveRadarrBlock::IndexerSettingsMaximumSizeInput, ActiveRadarrBlock::IndexerSettingsWhitelistedSubtitleTagsInput, ], &[ ActiveRadarrBlock::IndexerSettingsTogglePreferIndexerFlags, ActiveRadarrBlock::IndexerSettingsToggleAllowHardcodedSubs, ], &[ ActiveRadarrBlock::IndexerSettingsConfirmPrompt, ActiveRadarrBlock::IndexerSettingsConfirmPrompt, ], ]; pub static SYSTEM_DETAILS_BLOCKS: [ActiveRadarrBlock; 5] = [ ActiveRadarrBlock::SystemLogs, ActiveRadarrBlock::SystemQueuedEvents, ActiveRadarrBlock::SystemTasks, ActiveRadarrBlock::SystemTaskStartConfirmPrompt, ActiveRadarrBlock::SystemUpdates, ]; impl From for Route { fn from(active_radarr_block: ActiveRadarrBlock) -> Route { Route::Radarr(active_radarr_block, None) } } impl From<(ActiveRadarrBlock, Option)> for Route { fn from(value: (ActiveRadarrBlock, Option)) -> Route { Route::Radarr(value.0, value.1) } }