Tweaked the key mappings so that it is now easier to change key mappings and update the corresponding UI elements as well
This commit is contained in:
@@ -4,6 +4,7 @@ mod tests {
|
||||
use pretty_assertions::{assert_eq, assert_str_eq};
|
||||
use tokio::sync::mpsc;
|
||||
|
||||
use crate::app::key_binding::{build_keymapping_string, SERVARR_KEYMAPPINGS};
|
||||
use crate::app::radarr::{ActiveRadarrBlock, RadarrData};
|
||||
use crate::app::{App, Data, RadarrConfig, DEFAULT_ROUTE};
|
||||
use crate::models::{HorizontallyScrollableText, Route, TabRoute};
|
||||
@@ -26,13 +27,16 @@ mod tests {
|
||||
TabRoute {
|
||||
title: "Radarr",
|
||||
route: ActiveRadarrBlock::Movies.into(),
|
||||
help: "<↑↓> scroll | ←→ change tab | <tab> change servarr | <q> quit ",
|
||||
help: format!(
|
||||
"<↑↓> scroll | ←→ change tab | {} ",
|
||||
build_keymapping_string(&SERVARR_KEYMAPPINGS)
|
||||
),
|
||||
contextual_help: None,
|
||||
},
|
||||
TabRoute {
|
||||
title: "Sonarr",
|
||||
route: Route::Sonarr,
|
||||
help: "<tab> change servarr | <q> quit ",
|
||||
help: format!("{} ", build_keymapping_string(&SERVARR_KEYMAPPINGS)),
|
||||
contextual_help: None,
|
||||
},
|
||||
]
|
||||
|
||||
+49
-25
@@ -1,5 +1,15 @@
|
||||
use crate::event::Key;
|
||||
|
||||
pub(in crate::app) type KeyMapping = (KeyBinding, &'static str);
|
||||
|
||||
pub fn build_keymapping_string(key_mappings: &[(KeyBinding, &str)]) -> String {
|
||||
key_mappings
|
||||
.iter()
|
||||
.map(|(key_binding, desc)| format!("{} {}", key_binding.key, desc))
|
||||
.collect::<Vec<String>>()
|
||||
.join(" | ")
|
||||
}
|
||||
|
||||
macro_rules! generate_keybindings {
|
||||
($($field:ident),+) => {
|
||||
pub struct KeyBindings {
|
||||
@@ -28,12 +38,14 @@ generate_keybindings! {
|
||||
events,
|
||||
home,
|
||||
end,
|
||||
tab,
|
||||
delete,
|
||||
submit,
|
||||
quit,
|
||||
esc
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy)]
|
||||
pub struct KeyBinding {
|
||||
pub key: Key,
|
||||
pub desc: &'static str,
|
||||
@@ -42,94 +54,106 @@ pub struct KeyBinding {
|
||||
pub const DEFAULT_KEYBINDINGS: KeyBindings = KeyBindings {
|
||||
add: KeyBinding {
|
||||
key: Key::Char('a'),
|
||||
desc: "Add",
|
||||
desc: "add",
|
||||
},
|
||||
up: KeyBinding {
|
||||
key: Key::Up,
|
||||
desc: "Scroll up",
|
||||
desc: "up",
|
||||
},
|
||||
down: KeyBinding {
|
||||
key: Key::Down,
|
||||
desc: "Scroll down",
|
||||
desc: "down",
|
||||
},
|
||||
left: KeyBinding {
|
||||
key: Key::Left,
|
||||
desc: "Move left",
|
||||
desc: "left",
|
||||
},
|
||||
right: KeyBinding {
|
||||
key: Key::Right,
|
||||
desc: "Move right",
|
||||
desc: "right",
|
||||
},
|
||||
backspace: KeyBinding {
|
||||
key: Key::Backspace,
|
||||
desc: "Backspace",
|
||||
desc: "backspace",
|
||||
},
|
||||
search: KeyBinding {
|
||||
key: Key::Char('s'),
|
||||
desc: "Search",
|
||||
desc: "search",
|
||||
},
|
||||
settings: KeyBinding {
|
||||
key: Key::Char('s'),
|
||||
desc: "Settings",
|
||||
desc: "settings",
|
||||
},
|
||||
filter: KeyBinding {
|
||||
key: Key::Char('f'),
|
||||
desc: "Filter",
|
||||
desc: "filter",
|
||||
},
|
||||
sort: KeyBinding {
|
||||
key: Key::Char('o'),
|
||||
desc: "Sort",
|
||||
desc: "sort",
|
||||
},
|
||||
edit: KeyBinding {
|
||||
key: Key::Char('e'),
|
||||
desc: "Edit",
|
||||
desc: "edit",
|
||||
},
|
||||
events: KeyBinding {
|
||||
key: Key::Char('e'),
|
||||
desc: "Events",
|
||||
desc: "events",
|
||||
},
|
||||
logs: KeyBinding {
|
||||
key: Key::Char('l'),
|
||||
desc: "Logs",
|
||||
desc: "logs",
|
||||
},
|
||||
tasks: KeyBinding {
|
||||
key: Key::Char('t'),
|
||||
desc: "Tasks",
|
||||
desc: "tasks",
|
||||
},
|
||||
restrictions: KeyBinding {
|
||||
key: Key::Char('t'),
|
||||
desc: "Restrictions",
|
||||
key: Key::Char('R'),
|
||||
desc: "restrictions",
|
||||
},
|
||||
refresh: KeyBinding {
|
||||
key: Key::Char('r'),
|
||||
desc: "Refresh",
|
||||
key: Key::Ctrl('r'),
|
||||
desc: "refresh",
|
||||
},
|
||||
update: KeyBinding {
|
||||
key: Key::Char('u'),
|
||||
desc: "Update",
|
||||
desc: "update",
|
||||
},
|
||||
home: KeyBinding {
|
||||
key: Key::Home,
|
||||
desc: "Home",
|
||||
desc: "home",
|
||||
},
|
||||
end: KeyBinding {
|
||||
key: Key::End,
|
||||
desc: "End",
|
||||
desc: "end",
|
||||
},
|
||||
tab: KeyBinding {
|
||||
key: Key::Tab,
|
||||
desc: "tab",
|
||||
},
|
||||
delete: KeyBinding {
|
||||
key: Key::Delete,
|
||||
desc: "Delete selected item",
|
||||
desc: "delete",
|
||||
},
|
||||
submit: KeyBinding {
|
||||
key: Key::Enter,
|
||||
desc: "Select",
|
||||
desc: "submit",
|
||||
},
|
||||
quit: KeyBinding {
|
||||
key: Key::Char('q'),
|
||||
desc: "Quit",
|
||||
desc: "quit",
|
||||
},
|
||||
esc: KeyBinding {
|
||||
key: Key::Esc,
|
||||
desc: "Exit current menu",
|
||||
desc: "close",
|
||||
},
|
||||
};
|
||||
|
||||
pub static SERVARR_KEYMAPPINGS: [KeyMapping; 2] = [
|
||||
(DEFAULT_KEYBINDINGS.tab, "change servarr"),
|
||||
(DEFAULT_KEYBINDINGS.quit, DEFAULT_KEYBINDINGS.quit.desc),
|
||||
];
|
||||
|
||||
pub static BARE_POPUP_KEY_MAPPINGS: [KeyMapping; 1] =
|
||||
[(DEFAULT_KEYBINDINGS.esc, DEFAULT_KEYBINDINGS.esc.desc)];
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
use crate::app::key_binding::{build_keymapping_string, DEFAULT_KEYBINDINGS};
|
||||
use pretty_assertions::assert_str_eq;
|
||||
|
||||
#[test]
|
||||
fn test_build_keymapping_string() {
|
||||
let test_keys_array = [
|
||||
(DEFAULT_KEYBINDINGS.add, "add"),
|
||||
(DEFAULT_KEYBINDINGS.delete, "delete"),
|
||||
];
|
||||
|
||||
assert_str_eq!(
|
||||
build_keymapping_string(&test_keys_array),
|
||||
"<a> add | <del> delete"
|
||||
);
|
||||
}
|
||||
}
|
||||
+8
-2
@@ -9,10 +9,13 @@ use crate::app::radarr::{ActiveRadarrBlock, RadarrData};
|
||||
use crate::models::{HorizontallyScrollableText, Route, TabRoute, TabState};
|
||||
use crate::network::NetworkEvent;
|
||||
|
||||
use self::key_binding::{build_keymapping_string, SERVARR_KEYMAPPINGS};
|
||||
|
||||
#[cfg(test)]
|
||||
#[path = "app_tests.rs"]
|
||||
mod app_tests;
|
||||
pub mod key_binding;
|
||||
mod key_binding_tests;
|
||||
pub mod radarr;
|
||||
|
||||
const DEFAULT_ROUTE: Route = Route::Radarr(ActiveRadarrBlock::Movies, None);
|
||||
@@ -137,13 +140,16 @@ impl<'a> Default for App<'a> {
|
||||
TabRoute {
|
||||
title: "Radarr",
|
||||
route: ActiveRadarrBlock::Movies.into(),
|
||||
help: "<↑↓> scroll | ←→ change tab | <tab> change servarr | <q> quit ",
|
||||
help: format!(
|
||||
"<↑↓> scroll | ←→ change tab | {} ",
|
||||
build_keymapping_string(&SERVARR_KEYMAPPINGS)
|
||||
),
|
||||
contextual_help: None,
|
||||
},
|
||||
TabRoute {
|
||||
title: "Sonarr",
|
||||
route: Route::Sonarr,
|
||||
help: "<tab> change servarr | <q> quit ",
|
||||
help: format!("{} ", build_keymapping_string(&SERVARR_KEYMAPPINGS)),
|
||||
contextual_help: None,
|
||||
},
|
||||
]),
|
||||
|
||||
@@ -15,6 +15,16 @@ use crate::models::{
|
||||
};
|
||||
use crate::network::radarr_network::RadarrEvent;
|
||||
|
||||
use self::radarr_key_mappings::{
|
||||
COLLECTIONS_KEY_MAPPINGS, DOWNLOADS_KEY_MAPPINGS, INDEXERS_KEY_MAPPINGS, LIBRARY_KEY_MAPPINGS,
|
||||
MANUAL_MOVIE_SEARCH_CONTEXTUAL_KEY_MAPPINGS, MANUAL_MOVIE_SEARCH_KEY_MAPPINGS,
|
||||
MOVIE_DETAILS_KEY_MAPPINGS, ROOT_FOLDERS_KEY_MAPPINGS, SYSTEM_KEY_MAPPINGS,
|
||||
};
|
||||
|
||||
use super::key_binding::build_keymapping_string;
|
||||
|
||||
pub mod radarr_key_mappings;
|
||||
|
||||
#[cfg(test)]
|
||||
#[path = "radarr_tests.rs"]
|
||||
mod radarr_tests;
|
||||
@@ -251,130 +261,132 @@ impl<'a> RadarrData<'a> {
|
||||
impl<'a> Default for RadarrData<'a> {
|
||||
fn default() -> RadarrData<'a> {
|
||||
RadarrData {
|
||||
root_folders: StatefulTable::default(),
|
||||
disk_space_vec: Vec::new(),
|
||||
version: String::default(),
|
||||
start_time: DateTime::default(),
|
||||
movies: StatefulTable::default(),
|
||||
add_searched_movies: StatefulTable::default(),
|
||||
monitor_list: StatefulList::default(),
|
||||
minimum_availability_list: StatefulList::default(),
|
||||
quality_profile_list: StatefulList::default(),
|
||||
root_folder_list: StatefulList::default(),
|
||||
selected_block: BlockSelectionState::default(),
|
||||
filtered_movies: StatefulTable::default(),
|
||||
downloads: StatefulTable::default(),
|
||||
indexers: StatefulTable::default(),
|
||||
indexer_settings: None,
|
||||
quality_profile_map: BiMap::default(),
|
||||
tags_map: BiMap::default(),
|
||||
file_details: String::default(),
|
||||
audio_details: String::default(),
|
||||
video_details: String::default(),
|
||||
movie_details: ScrollableText::default(),
|
||||
movie_history: StatefulTable::default(),
|
||||
movie_cast: StatefulTable::default(),
|
||||
movie_crew: StatefulTable::default(),
|
||||
movie_releases: StatefulTable::default(),
|
||||
movie_releases_sort: StatefulList::default(),
|
||||
collections: StatefulTable::default(),
|
||||
filtered_collections: StatefulTable::default(),
|
||||
collection_movies: StatefulTable::default(),
|
||||
logs: StatefulList::default(),
|
||||
log_details: StatefulList::default(),
|
||||
tasks: StatefulTable::default(),
|
||||
queued_events: StatefulTable::default(),
|
||||
updates: ScrollableText::default(),
|
||||
prompt_confirm_action: None,
|
||||
search: HorizontallyScrollableText::default(),
|
||||
filter: HorizontallyScrollableText::default(),
|
||||
edit_path: HorizontallyScrollableText::default(),
|
||||
edit_tags: HorizontallyScrollableText::default(),
|
||||
edit_monitored: None,
|
||||
edit_search_on_add: None,
|
||||
sort_ascending: None,
|
||||
is_searching: false,
|
||||
is_filtering: false,
|
||||
prompt_confirm: false,
|
||||
delete_movie_files: false,
|
||||
add_list_exclusion: false,
|
||||
main_tabs: TabState::new(vec![
|
||||
TabRoute {
|
||||
title: "Library",
|
||||
route: ActiveRadarrBlock::Movies.into(),
|
||||
help: "",
|
||||
contextual_help: Some("<a> add | <e> edit | <del> delete | <s> search | <f> filter | <r> refresh | <u> update all | <enter> details | <esc> cancel filter"),
|
||||
},
|
||||
TabRoute {
|
||||
title: "Downloads",
|
||||
route: ActiveRadarrBlock::Downloads.into(),
|
||||
help: "",
|
||||
contextual_help: Some("<r> refresh | <del> delete"),
|
||||
},
|
||||
TabRoute {
|
||||
title: "Collections",
|
||||
route: ActiveRadarrBlock::Collections.into(),
|
||||
help: "",
|
||||
contextual_help: Some("<s> search | <e> edit | <f> filter | <r> refresh | <u> update all | <enter> details | <esc> cancel filter"),
|
||||
},
|
||||
TabRoute {
|
||||
title: "Root Folders",
|
||||
route: ActiveRadarrBlock::RootFolders.into(),
|
||||
help: "",
|
||||
contextual_help: Some("<a> add | <del> delete | <r> refresh"),
|
||||
},
|
||||
TabRoute {
|
||||
title: "Indexers",
|
||||
route: ActiveRadarrBlock::Indexers.into(),
|
||||
help: "",
|
||||
contextual_help: Some("<a> add | <enter> edit | <s> settings | <t> restrictions | <del> delete | <r> refresh"),
|
||||
},
|
||||
TabRoute {
|
||||
title: "System",
|
||||
route: ActiveRadarrBlock::System.into(),
|
||||
help: "",
|
||||
contextual_help: Some("<t> open tasks | <e> open events | <l> open logs | <u> open updates | <r> refresh"),
|
||||
},
|
||||
]),
|
||||
movie_info_tabs: TabState::new(vec![
|
||||
TabRoute {
|
||||
title: "Details",
|
||||
route: ActiveRadarrBlock::MovieDetails.into(),
|
||||
help: "<r> refresh | <u> update | <e> edit | <s> auto search | <esc> close",
|
||||
contextual_help: None,
|
||||
},
|
||||
TabRoute {
|
||||
title: "History",
|
||||
route: ActiveRadarrBlock::MovieHistory.into(),
|
||||
help: "<r> refresh | <u> update | <e> edit | <s> auto search | <esc> close",
|
||||
contextual_help: None,
|
||||
},
|
||||
TabRoute {
|
||||
title: "File",
|
||||
route: ActiveRadarrBlock::FileInfo.into(),
|
||||
help: "<r> refresh | <u> update | <e> edit | <s> auto search | <esc> close",
|
||||
contextual_help: None,
|
||||
},
|
||||
TabRoute {
|
||||
title: "Cast",
|
||||
route: ActiveRadarrBlock::Cast.into(),
|
||||
help: "<r> refresh | <u> update | <e> edit | <s> auto search | <esc> close",
|
||||
contextual_help: None,
|
||||
},
|
||||
TabRoute {
|
||||
title: "Crew",
|
||||
route: ActiveRadarrBlock::Crew.into(),
|
||||
help: "<r> refresh | <u> update | <e> edit | <s> auto search | <esc> close",
|
||||
contextual_help: None,
|
||||
},
|
||||
TabRoute {
|
||||
title: "Manual Search",
|
||||
route: ActiveRadarrBlock::ManualSearch.into(),
|
||||
help: "<r> refresh | <u> update | <e> edit | <o> sort | <s> auto search | <esc> close",
|
||||
contextual_help: Some("<enter> details"),
|
||||
},
|
||||
]),
|
||||
}
|
||||
root_folders: StatefulTable::default(),
|
||||
disk_space_vec: Vec::new(),
|
||||
version: String::default(),
|
||||
start_time: DateTime::default(),
|
||||
movies: StatefulTable::default(),
|
||||
add_searched_movies: StatefulTable::default(),
|
||||
monitor_list: StatefulList::default(),
|
||||
minimum_availability_list: StatefulList::default(),
|
||||
quality_profile_list: StatefulList::default(),
|
||||
root_folder_list: StatefulList::default(),
|
||||
selected_block: BlockSelectionState::default(),
|
||||
filtered_movies: StatefulTable::default(),
|
||||
downloads: StatefulTable::default(),
|
||||
indexers: StatefulTable::default(),
|
||||
indexer_settings: None,
|
||||
quality_profile_map: BiMap::default(),
|
||||
tags_map: BiMap::default(),
|
||||
file_details: String::default(),
|
||||
audio_details: String::default(),
|
||||
video_details: String::default(),
|
||||
movie_details: ScrollableText::default(),
|
||||
movie_history: StatefulTable::default(),
|
||||
movie_cast: StatefulTable::default(),
|
||||
movie_crew: StatefulTable::default(),
|
||||
movie_releases: StatefulTable::default(),
|
||||
movie_releases_sort: StatefulList::default(),
|
||||
collections: StatefulTable::default(),
|
||||
filtered_collections: StatefulTable::default(),
|
||||
collection_movies: StatefulTable::default(),
|
||||
logs: StatefulList::default(),
|
||||
log_details: StatefulList::default(),
|
||||
tasks: StatefulTable::default(),
|
||||
queued_events: StatefulTable::default(),
|
||||
updates: ScrollableText::default(),
|
||||
prompt_confirm_action: None,
|
||||
search: HorizontallyScrollableText::default(),
|
||||
filter: HorizontallyScrollableText::default(),
|
||||
edit_path: HorizontallyScrollableText::default(),
|
||||
edit_tags: HorizontallyScrollableText::default(),
|
||||
edit_monitored: None,
|
||||
edit_search_on_add: None,
|
||||
sort_ascending: None,
|
||||
is_searching: false,
|
||||
is_filtering: false,
|
||||
prompt_confirm: false,
|
||||
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_keymapping_string(&LIBRARY_KEY_MAPPINGS)),
|
||||
},
|
||||
TabRoute {
|
||||
title: "Downloads",
|
||||
route: ActiveRadarrBlock::Downloads.into(),
|
||||
help: String::new(),
|
||||
contextual_help: Some(build_keymapping_string(&DOWNLOADS_KEY_MAPPINGS)),
|
||||
},
|
||||
TabRoute {
|
||||
title: "Collections",
|
||||
route: ActiveRadarrBlock::Collections.into(),
|
||||
help: String::new(),
|
||||
contextual_help: Some(build_keymapping_string(&COLLECTIONS_KEY_MAPPINGS)),
|
||||
},
|
||||
TabRoute {
|
||||
title: "Root Folders",
|
||||
route: ActiveRadarrBlock::RootFolders.into(),
|
||||
help: String::new(),
|
||||
contextual_help: Some(build_keymapping_string(&ROOT_FOLDERS_KEY_MAPPINGS)),
|
||||
},
|
||||
TabRoute {
|
||||
title: "Indexers",
|
||||
route: ActiveRadarrBlock::Indexers.into(),
|
||||
help: String::new(),
|
||||
contextual_help: Some(build_keymapping_string(&INDEXERS_KEY_MAPPINGS)),
|
||||
},
|
||||
TabRoute {
|
||||
title: "System",
|
||||
route: ActiveRadarrBlock::System.into(),
|
||||
help: String::new(),
|
||||
contextual_help: Some(build_keymapping_string(&SYSTEM_KEY_MAPPINGS)),
|
||||
},
|
||||
]),
|
||||
movie_info_tabs: TabState::new(vec![
|
||||
TabRoute {
|
||||
title: "Details",
|
||||
route: ActiveRadarrBlock::MovieDetails.into(),
|
||||
help: build_keymapping_string(&MOVIE_DETAILS_KEY_MAPPINGS),
|
||||
contextual_help: None,
|
||||
},
|
||||
TabRoute {
|
||||
title: "History",
|
||||
route: ActiveRadarrBlock::MovieHistory.into(),
|
||||
help: build_keymapping_string(&MOVIE_DETAILS_KEY_MAPPINGS),
|
||||
contextual_help: None,
|
||||
},
|
||||
TabRoute {
|
||||
title: "File",
|
||||
route: ActiveRadarrBlock::FileInfo.into(),
|
||||
help: build_keymapping_string(&MOVIE_DETAILS_KEY_MAPPINGS),
|
||||
contextual_help: None,
|
||||
},
|
||||
TabRoute {
|
||||
title: "Cast",
|
||||
route: ActiveRadarrBlock::Cast.into(),
|
||||
help: build_keymapping_string(&MOVIE_DETAILS_KEY_MAPPINGS),
|
||||
contextual_help: None,
|
||||
},
|
||||
TabRoute {
|
||||
title: "Crew",
|
||||
route: ActiveRadarrBlock::Crew.into(),
|
||||
help: build_keymapping_string(&MOVIE_DETAILS_KEY_MAPPINGS),
|
||||
contextual_help: None,
|
||||
},
|
||||
TabRoute {
|
||||
title: "Manual Search",
|
||||
route: ActiveRadarrBlock::ManualSearch.into(),
|
||||
help: build_keymapping_string(&MANUAL_MOVIE_SEARCH_KEY_MAPPINGS),
|
||||
contextual_help: Some(build_keymapping_string(
|
||||
&MANUAL_MOVIE_SEARCH_CONTEXTUAL_KEY_MAPPINGS,
|
||||
)),
|
||||
},
|
||||
]),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,116 @@
|
||||
use crate::app::key_binding::{KeyMapping, DEFAULT_KEYBINDINGS};
|
||||
|
||||
pub static LIBRARY_KEY_MAPPINGS: [KeyMapping; 9] = [
|
||||
(DEFAULT_KEYBINDINGS.add, DEFAULT_KEYBINDINGS.add.desc),
|
||||
(DEFAULT_KEYBINDINGS.edit, DEFAULT_KEYBINDINGS.edit.desc),
|
||||
(DEFAULT_KEYBINDINGS.delete, DEFAULT_KEYBINDINGS.delete.desc),
|
||||
(DEFAULT_KEYBINDINGS.search, DEFAULT_KEYBINDINGS.search.desc),
|
||||
(DEFAULT_KEYBINDINGS.filter, DEFAULT_KEYBINDINGS.filter.desc),
|
||||
(
|
||||
DEFAULT_KEYBINDINGS.refresh,
|
||||
DEFAULT_KEYBINDINGS.refresh.desc,
|
||||
),
|
||||
(DEFAULT_KEYBINDINGS.update, "update all"),
|
||||
(DEFAULT_KEYBINDINGS.submit, "details"),
|
||||
(DEFAULT_KEYBINDINGS.esc, "cancel filter"),
|
||||
];
|
||||
|
||||
pub static DOWNLOADS_KEY_MAPPINGS: [KeyMapping; 2] = [
|
||||
(
|
||||
DEFAULT_KEYBINDINGS.refresh,
|
||||
DEFAULT_KEYBINDINGS.refresh.desc,
|
||||
),
|
||||
(DEFAULT_KEYBINDINGS.delete, DEFAULT_KEYBINDINGS.delete.desc),
|
||||
];
|
||||
|
||||
pub static COLLECTIONS_KEY_MAPPINGS: [KeyMapping; 7] = [
|
||||
(DEFAULT_KEYBINDINGS.search, DEFAULT_KEYBINDINGS.search.desc),
|
||||
(DEFAULT_KEYBINDINGS.edit, DEFAULT_KEYBINDINGS.edit.desc),
|
||||
(DEFAULT_KEYBINDINGS.filter, DEFAULT_KEYBINDINGS.filter.desc),
|
||||
(
|
||||
DEFAULT_KEYBINDINGS.refresh,
|
||||
DEFAULT_KEYBINDINGS.refresh.desc,
|
||||
),
|
||||
(DEFAULT_KEYBINDINGS.update, "update all"),
|
||||
(DEFAULT_KEYBINDINGS.submit, "details"),
|
||||
(DEFAULT_KEYBINDINGS.esc, "cancel filter"),
|
||||
];
|
||||
|
||||
pub static ROOT_FOLDERS_KEY_MAPPINGS: [KeyMapping; 3] = [
|
||||
(DEFAULT_KEYBINDINGS.add, DEFAULT_KEYBINDINGS.add.desc),
|
||||
(DEFAULT_KEYBINDINGS.delete, DEFAULT_KEYBINDINGS.delete.desc),
|
||||
(
|
||||
DEFAULT_KEYBINDINGS.refresh,
|
||||
DEFAULT_KEYBINDINGS.refresh.desc,
|
||||
),
|
||||
];
|
||||
|
||||
pub static INDEXERS_KEY_MAPPINGS: [KeyMapping; 6] = [
|
||||
(DEFAULT_KEYBINDINGS.add, DEFAULT_KEYBINDINGS.add.desc),
|
||||
(DEFAULT_KEYBINDINGS.edit, DEFAULT_KEYBINDINGS.edit.desc),
|
||||
(
|
||||
DEFAULT_KEYBINDINGS.settings,
|
||||
DEFAULT_KEYBINDINGS.settings.desc,
|
||||
),
|
||||
(
|
||||
DEFAULT_KEYBINDINGS.restrictions,
|
||||
DEFAULT_KEYBINDINGS.restrictions.desc,
|
||||
),
|
||||
(DEFAULT_KEYBINDINGS.delete, DEFAULT_KEYBINDINGS.delete.desc),
|
||||
(
|
||||
DEFAULT_KEYBINDINGS.refresh,
|
||||
DEFAULT_KEYBINDINGS.refresh.desc,
|
||||
),
|
||||
];
|
||||
|
||||
pub static SYSTEM_KEY_MAPPINGS: [KeyMapping; 5] = [
|
||||
(DEFAULT_KEYBINDINGS.tasks, "open tasks"),
|
||||
(DEFAULT_KEYBINDINGS.events, "open events"),
|
||||
(DEFAULT_KEYBINDINGS.logs, "open logs"),
|
||||
(DEFAULT_KEYBINDINGS.update, "open updates"),
|
||||
(
|
||||
DEFAULT_KEYBINDINGS.refresh,
|
||||
DEFAULT_KEYBINDINGS.refresh.desc,
|
||||
),
|
||||
];
|
||||
|
||||
pub static MOVIE_DETAILS_KEY_MAPPINGS: [KeyMapping; 5] = [
|
||||
(
|
||||
DEFAULT_KEYBINDINGS.refresh,
|
||||
DEFAULT_KEYBINDINGS.refresh.desc,
|
||||
),
|
||||
(DEFAULT_KEYBINDINGS.update, DEFAULT_KEYBINDINGS.update.desc),
|
||||
(DEFAULT_KEYBINDINGS.edit, DEFAULT_KEYBINDINGS.edit.desc),
|
||||
(DEFAULT_KEYBINDINGS.search, "auto search"),
|
||||
(DEFAULT_KEYBINDINGS.esc, DEFAULT_KEYBINDINGS.esc.desc),
|
||||
];
|
||||
|
||||
pub static MANUAL_MOVIE_SEARCH_KEY_MAPPINGS: [KeyMapping; 6] = [
|
||||
(
|
||||
DEFAULT_KEYBINDINGS.refresh,
|
||||
DEFAULT_KEYBINDINGS.refresh.desc,
|
||||
),
|
||||
(DEFAULT_KEYBINDINGS.update, DEFAULT_KEYBINDINGS.update.desc),
|
||||
(DEFAULT_KEYBINDINGS.edit, DEFAULT_KEYBINDINGS.edit.desc),
|
||||
(DEFAULT_KEYBINDINGS.sort, DEFAULT_KEYBINDINGS.sort.desc),
|
||||
(DEFAULT_KEYBINDINGS.search, "auto search"),
|
||||
(DEFAULT_KEYBINDINGS.esc, DEFAULT_KEYBINDINGS.esc.desc),
|
||||
];
|
||||
|
||||
pub static MANUAL_MOVIE_SEARCH_CONTEXTUAL_KEY_MAPPINGS: [KeyMapping; 1] =
|
||||
[(DEFAULT_KEYBINDINGS.submit, "details")];
|
||||
|
||||
pub static ADD_MOVIE_SEARCH_RESULTS_KEY_MAPPINGS: [KeyMapping; 2] = [
|
||||
(DEFAULT_KEYBINDINGS.submit, "details"),
|
||||
(DEFAULT_KEYBINDINGS.esc, "edit search"),
|
||||
];
|
||||
|
||||
pub static SYSTEM_TASKS_KEY_MAPPINGS: [KeyMapping; 2] = [
|
||||
(DEFAULT_KEYBINDINGS.submit, "start task"),
|
||||
(DEFAULT_KEYBINDINGS.esc, DEFAULT_KEYBINDINGS.esc.desc),
|
||||
];
|
||||
|
||||
pub static COLLECTION_DETAILS_KEY_MAPPINGS: [KeyMapping; 2] = [
|
||||
(DEFAULT_KEYBINDINGS.submit, "show overview/add movie"),
|
||||
(DEFAULT_KEYBINDINGS.esc, DEFAULT_KEYBINDINGS.esc.desc),
|
||||
];
|
||||
@@ -8,6 +8,13 @@ mod tests {
|
||||
use serde_json::Number;
|
||||
use strum::IntoEnumIterator;
|
||||
|
||||
use crate::app::key_binding::build_keymapping_string;
|
||||
use crate::app::radarr::radarr_key_mappings::{
|
||||
COLLECTIONS_KEY_MAPPINGS, DOWNLOADS_KEY_MAPPINGS, INDEXERS_KEY_MAPPINGS,
|
||||
LIBRARY_KEY_MAPPINGS, MANUAL_MOVIE_SEARCH_CONTEXTUAL_KEY_MAPPINGS,
|
||||
MANUAL_MOVIE_SEARCH_KEY_MAPPINGS, MOVIE_DETAILS_KEY_MAPPINGS, ROOT_FOLDERS_KEY_MAPPINGS,
|
||||
SYSTEM_KEY_MAPPINGS,
|
||||
};
|
||||
use crate::app::radarr::radarr_test_utils::utils::create_test_radarr_data;
|
||||
use crate::app::radarr::{ActiveRadarrBlock, RadarrData};
|
||||
use crate::models::radarr_models::{
|
||||
@@ -316,8 +323,10 @@ mod tests {
|
||||
ActiveRadarrBlock::Movies.into()
|
||||
);
|
||||
assert!(radarr_data.main_tabs.tabs[0].help.is_empty());
|
||||
assert_eq!(radarr_data.main_tabs.tabs[0].contextual_help,
|
||||
Some("<a> add | <e> edit | <del> delete | <s> search | <f> filter | <r> refresh | <u> update all | <enter> details | <esc> cancel filter"));
|
||||
assert_eq!(
|
||||
radarr_data.main_tabs.tabs[0].contextual_help,
|
||||
Some(build_keymapping_string(&LIBRARY_KEY_MAPPINGS))
|
||||
);
|
||||
|
||||
assert_str_eq!(radarr_data.main_tabs.tabs[1].title, "Downloads");
|
||||
assert_eq!(
|
||||
@@ -327,7 +336,7 @@ mod tests {
|
||||
assert!(radarr_data.main_tabs.tabs[1].help.is_empty());
|
||||
assert_eq!(
|
||||
radarr_data.main_tabs.tabs[1].contextual_help,
|
||||
Some("<r> refresh | <del> delete")
|
||||
Some(build_keymapping_string(&DOWNLOADS_KEY_MAPPINGS))
|
||||
);
|
||||
|
||||
assert_str_eq!(radarr_data.main_tabs.tabs[2].title, "Collections");
|
||||
@@ -336,8 +345,10 @@ mod tests {
|
||||
ActiveRadarrBlock::Collections.into()
|
||||
);
|
||||
assert!(radarr_data.main_tabs.tabs[2].help.is_empty());
|
||||
assert_eq!(radarr_data.main_tabs.tabs[2].contextual_help,
|
||||
Some("<s> search | <e> edit | <f> filter | <r> refresh | <u> update all | <enter> details | <esc> cancel filter"));
|
||||
assert_eq!(
|
||||
radarr_data.main_tabs.tabs[2].contextual_help,
|
||||
Some(build_keymapping_string(&COLLECTIONS_KEY_MAPPINGS))
|
||||
);
|
||||
|
||||
assert_str_eq!(radarr_data.main_tabs.tabs[3].title, "Root Folders");
|
||||
assert_eq!(
|
||||
@@ -347,7 +358,7 @@ mod tests {
|
||||
assert!(radarr_data.main_tabs.tabs[3].help.is_empty());
|
||||
assert_eq!(
|
||||
radarr_data.main_tabs.tabs[3].contextual_help,
|
||||
Some("<a> add | <del> delete | <r> refresh")
|
||||
Some(build_keymapping_string(&ROOT_FOLDERS_KEY_MAPPINGS))
|
||||
);
|
||||
|
||||
assert_str_eq!(radarr_data.main_tabs.tabs[4].title, "Indexers");
|
||||
@@ -358,9 +369,7 @@ mod tests {
|
||||
assert!(radarr_data.main_tabs.tabs[4].help.is_empty());
|
||||
assert_eq!(
|
||||
radarr_data.main_tabs.tabs[4].contextual_help,
|
||||
Some(
|
||||
"<a> add | <enter> edit | <s> settings | <t> restrictions | <del> delete | <r> refresh"
|
||||
)
|
||||
Some(build_keymapping_string(&INDEXERS_KEY_MAPPINGS))
|
||||
);
|
||||
|
||||
assert_str_eq!(radarr_data.main_tabs.tabs[5].title, "System");
|
||||
@@ -371,7 +380,7 @@ mod tests {
|
||||
assert!(radarr_data.main_tabs.tabs[5].help.is_empty());
|
||||
assert_eq!(
|
||||
radarr_data.main_tabs.tabs[5].contextual_help,
|
||||
Some("<t> open tasks | <e> open events | <l> open logs | <u> open updates | <r> refresh")
|
||||
Some(build_keymapping_string(&SYSTEM_KEY_MAPPINGS))
|
||||
);
|
||||
|
||||
assert_eq!(radarr_data.movie_info_tabs.tabs.len(), 6);
|
||||
@@ -383,7 +392,7 @@ mod tests {
|
||||
);
|
||||
assert_str_eq!(
|
||||
radarr_data.movie_info_tabs.tabs[0].help,
|
||||
"<r> refresh | <u> update | <e> edit | <s> auto search | <esc> close"
|
||||
build_keymapping_string(&MOVIE_DETAILS_KEY_MAPPINGS)
|
||||
);
|
||||
assert!(radarr_data.movie_info_tabs.tabs[0]
|
||||
.contextual_help
|
||||
@@ -396,7 +405,7 @@ mod tests {
|
||||
);
|
||||
assert_str_eq!(
|
||||
radarr_data.movie_info_tabs.tabs[1].help,
|
||||
"<r> refresh | <u> update | <e> edit | <s> auto search | <esc> close"
|
||||
build_keymapping_string(&MOVIE_DETAILS_KEY_MAPPINGS)
|
||||
);
|
||||
assert!(radarr_data.movie_info_tabs.tabs[1]
|
||||
.contextual_help
|
||||
@@ -409,7 +418,7 @@ mod tests {
|
||||
);
|
||||
assert_str_eq!(
|
||||
radarr_data.movie_info_tabs.tabs[2].help,
|
||||
"<r> refresh | <u> update | <e> edit | <s> auto search | <esc> close"
|
||||
build_keymapping_string(&MOVIE_DETAILS_KEY_MAPPINGS)
|
||||
);
|
||||
assert!(radarr_data.movie_info_tabs.tabs[2]
|
||||
.contextual_help
|
||||
@@ -422,7 +431,7 @@ mod tests {
|
||||
);
|
||||
assert_str_eq!(
|
||||
radarr_data.movie_info_tabs.tabs[3].help,
|
||||
"<r> refresh | <u> update | <e> edit | <s> auto search | <esc> close"
|
||||
build_keymapping_string(&MOVIE_DETAILS_KEY_MAPPINGS)
|
||||
);
|
||||
assert!(radarr_data.movie_info_tabs.tabs[3]
|
||||
.contextual_help
|
||||
@@ -435,7 +444,7 @@ mod tests {
|
||||
);
|
||||
assert_str_eq!(
|
||||
radarr_data.movie_info_tabs.tabs[4].help,
|
||||
"<r> refresh | <u> update | <e> edit | <s> auto search | <esc> close"
|
||||
build_keymapping_string(&MOVIE_DETAILS_KEY_MAPPINGS)
|
||||
);
|
||||
assert!(radarr_data.movie_info_tabs.tabs[4]
|
||||
.contextual_help
|
||||
@@ -448,11 +457,13 @@ mod tests {
|
||||
);
|
||||
assert_str_eq!(
|
||||
radarr_data.movie_info_tabs.tabs[5].help,
|
||||
"<r> refresh | <u> update | <e> edit | <o> sort | <s> auto search | <esc> close"
|
||||
build_keymapping_string(&MANUAL_MOVIE_SEARCH_KEY_MAPPINGS)
|
||||
);
|
||||
assert_eq!(
|
||||
radarr_data.movie_info_tabs.tabs[5].contextual_help,
|
||||
Some("<enter> details")
|
||||
Some(build_keymapping_string(
|
||||
&MANUAL_MOVIE_SEARCH_CONTEXTUAL_KEY_MAPPINGS
|
||||
))
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user