Refactored the Edit/Add modals into their own structs so that adding similar modals in the future is more consistent, uses less RAM (since it's wrapped in an Option now), and is easier to implement. This comes with an initial example of the IndexerSettings UI that needs its own modal now. The modal has been created but it is still not used just yet so that's the next step.

This commit is contained in:
2023-08-08 10:50:07 -06:00
parent e2e4bf16e4
commit 2d624e2648
80 changed files with 3264 additions and 1114 deletions
@@ -8,7 +8,9 @@ use crate::app::context_clues::{build_context_clue_string, BARE_POPUP_CONTEXT_CL
use crate::app::radarr::radarr_context_clues::COLLECTION_DETAILS_CONTEXT_CLUES;
use crate::app::App;
use crate::models::radarr_models::CollectionMovie;
use crate::models::servarr_data::radarr_data::{ActiveRadarrBlock, COLLECTION_DETAILS_BLOCKS};
use crate::models::servarr_data::radarr::radarr_data::{
ActiveRadarrBlock, COLLECTION_DETAILS_BLOCKS,
};
use crate::models::Route;
use crate::ui::radarr_ui::collections::draw_collections;
use crate::ui::utils::{
@@ -2,7 +2,9 @@
mod tests {
use strum::IntoEnumIterator;
use crate::models::servarr_data::radarr_data::{ActiveRadarrBlock, COLLECTION_DETAILS_BLOCKS};
use crate::models::servarr_data::radarr::radarr_data::{
ActiveRadarrBlock, COLLECTION_DETAILS_BLOCKS,
};
use crate::ui::radarr_ui::collections::collection_details_ui::CollectionDetailsUi;
use crate::ui::DrawUi;
@@ -2,7 +2,7 @@
mod tests {
use strum::IntoEnumIterator;
use crate::models::servarr_data::radarr_data::{
use crate::models::servarr_data::radarr::radarr_data::{
ActiveRadarrBlock, COLLECTIONS_BLOCKS, COLLECTION_DETAILS_BLOCKS, EDIT_COLLECTION_BLOCKS,
};
use crate::ui::radarr_ui::collections::CollectionsUi;
@@ -1,24 +1,23 @@
use tui::backend::Backend;
use tui::layout::{Constraint, Rect};
use tui::widgets::ListItem;
use tui::Frame;
use crate::app::App;
use crate::models::servarr_data::radarr_data::{
use crate::models::servarr_data::radarr::modals::EditCollectionModal;
use crate::models::servarr_data::radarr::radarr_data::{
ActiveRadarrBlock, COLLECTION_DETAILS_BLOCKS, EDIT_COLLECTION_BLOCKS,
};
use crate::models::Route;
use crate::ui::radarr_ui::collections::collection_details_ui::CollectionDetailsUi;
use crate::ui::radarr_ui::collections::draw_collections;
use crate::ui::radarr_ui::{
draw_select_minimum_availability_popup, draw_select_quality_profile_popup,
};
use crate::ui::utils::{
horizontal_chunks, layout_paragraph_borderless, title_block_centered, vertical_chunks_with_margin,
};
use crate::ui::{
draw_button, draw_checkbox_with_label, draw_drop_down_menu_button, draw_drop_down_popup,
draw_large_popup_over_background_fn_with_ui, draw_medium_popup_over, draw_popup,
draw_text_box_with_label, DrawUi,
draw_selectable_list, draw_text_box_with_label, DrawUi,
};
#[cfg(test)]
@@ -46,7 +45,7 @@ impl DrawUi for EditCollectionUi {
app,
prompt_area,
draw_edit_collection_confirmation_prompt,
draw_select_minimum_availability_popup,
draw_edit_collection_select_minimum_availability_popup,
);
}
ActiveRadarrBlock::EditCollectionSelectQualityProfile => {
@@ -55,7 +54,7 @@ impl DrawUi for EditCollectionUi {
app,
prompt_area,
draw_edit_collection_confirmation_prompt,
draw_select_quality_profile_popup,
draw_edit_collection_select_quality_profile_popup,
);
}
ActiveRadarrBlock::EditCollectionPrompt
@@ -141,17 +140,16 @@ fn draw_edit_collection_confirmation_prompt<B: Backend>(
let yes_no_value = app.data.radarr_data.prompt_confirm;
let selected_block = app.data.radarr_data.selected_block.get_active_block();
let highlight_yes_no = selected_block == &ActiveRadarrBlock::EditCollectionConfirmPrompt;
let EditCollectionModal {
minimum_availability_list,
quality_profile_list,
monitored,
search_on_add,
path,
} = app.data.radarr_data.edit_collection_modal.as_ref().unwrap();
let selected_minimum_availability = app
.data
.radarr_data
.minimum_availability_list
.current_selection();
let selected_quality_profile = app
.data
.radarr_data
.quality_profile_list
.current_selection();
let selected_minimum_availability = minimum_availability_list.current_selection();
let selected_quality_profile = quality_profile_list.current_selection();
f.render_widget(title_block_centered(&title), prompt_area);
@@ -182,7 +180,7 @@ fn draw_edit_collection_confirmation_prompt<B: Backend>(
f,
chunks[1],
"Monitored",
app.data.radarr_data.edit_monitored.unwrap_or_default(),
monitored.unwrap_or_default(),
selected_block == &ActiveRadarrBlock::EditCollectionToggleMonitored,
);
@@ -206,8 +204,8 @@ fn draw_edit_collection_confirmation_prompt<B: Backend>(
f,
chunks[4],
"Root Folder",
&app.data.radarr_data.edit_path.text,
*app.data.radarr_data.edit_path.offset.borrow(),
&path.text,
*path.offset.borrow(),
selected_block == &ActiveRadarrBlock::EditCollectionRootFolderPathInput,
active_radarr_block == ActiveRadarrBlock::EditCollectionRootFolderPathInput,
);
@@ -217,7 +215,7 @@ fn draw_edit_collection_confirmation_prompt<B: Backend>(
f,
chunks[5],
"Search on Add",
app.data.radarr_data.edit_search_on_add.unwrap_or_default(),
search_on_add.unwrap_or_default(),
selected_block == &ActiveRadarrBlock::EditCollectionToggleSearchOnAdd,
);
@@ -234,3 +232,41 @@ fn draw_edit_collection_confirmation_prompt<B: Backend>(
!yes_no_value && highlight_yes_no,
);
}
fn draw_edit_collection_select_minimum_availability_popup<B: Backend>(
f: &mut Frame<'_, B>,
app: &mut App<'_>,
popup_area: Rect,
) {
draw_selectable_list(
f,
popup_area,
&mut app
.data
.radarr_data
.edit_collection_modal
.as_mut()
.unwrap()
.minimum_availability_list,
|minimum_availability| ListItem::new(minimum_availability.to_display_str().to_owned()),
);
}
fn draw_edit_collection_select_quality_profile_popup<B: Backend>(
f: &mut Frame<'_, B>,
app: &mut App<'_>,
popup_area: Rect,
) {
draw_selectable_list(
f,
popup_area,
&mut app
.data
.radarr_data
.edit_collection_modal
.as_mut()
.unwrap()
.quality_profile_list,
|quality_profile| ListItem::new(quality_profile.clone()),
);
}
@@ -2,7 +2,9 @@
mod tests {
use strum::IntoEnumIterator;
use crate::models::servarr_data::radarr_data::{ActiveRadarrBlock, EDIT_COLLECTION_BLOCKS};
use crate::models::servarr_data::radarr::radarr_data::{
ActiveRadarrBlock, EDIT_COLLECTION_BLOCKS,
};
use crate::ui::radarr_ui::collections::edit_collection_ui::EditCollectionUi;
use crate::ui::DrawUi;
+1 -1
View File
@@ -7,7 +7,7 @@ pub(super) use collection_details_ui::draw_collection_details;
use crate::app::App;
use crate::models::radarr_models::Collection;
use crate::models::servarr_data::radarr_data::{ActiveRadarrBlock, COLLECTIONS_BLOCKS};
use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, COLLECTIONS_BLOCKS};
use crate::models::Route;
use crate::ui::radarr_ui::collections::collection_details_ui::CollectionDetailsUi;
use crate::ui::radarr_ui::collections::edit_collection_ui::EditCollectionUi;
@@ -2,7 +2,7 @@
mod tests {
use strum::IntoEnumIterator;
use crate::models::servarr_data::radarr_data::{ActiveRadarrBlock, DOWNLOADS_BLOCKS};
use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, DOWNLOADS_BLOCKS};
use crate::ui::radarr_ui::downloads::DownloadsUi;
use crate::ui::DrawUi;
+1 -1
View File
@@ -5,7 +5,7 @@ use tui::Frame;
use crate::app::App;
use crate::models::radarr_models::DownloadRecord;
use crate::models::servarr_data::radarr_data::{ActiveRadarrBlock, DOWNLOADS_BLOCKS};
use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, DOWNLOADS_BLOCKS};
use crate::models::{HorizontallyScrollableText, Route};
use crate::ui::utils::{get_width_from_percentage, layout_block_top_border, style_primary};
use crate::ui::{draw_prompt_box, draw_prompt_popup_over, draw_table, DrawUi, TableProps};
@@ -1,11 +1,21 @@
use std::iter;
use tui::backend::Backend;
use tui::layout::Rect;
use tui::layout::{Constraint, Rect};
use tui::Frame;
use crate::app::App;
use crate::models::servarr_data::radarr_data::INDEXER_SETTINGS_BLOCKS;
use crate::models::servarr_data::radarr::radarr_data::{
ActiveRadarrBlock, INDEXER_SETTINGS_BLOCKS,
};
use crate::models::Route;
use crate::ui::DrawUi;
use crate::ui::radarr_ui::indexers::draw_indexers;
use crate::ui::utils::{
horizontal_chunks, horizontal_chunks_with_margin, title_block_centered, vertical_chunks,
vertical_chunks_with_margin,
};
use crate::ui::{
draw_button, draw_checkbox_with_label, draw_popup_over, draw_text_box_with_label, loading, DrawUi,
};
#[cfg(test)]
#[path = "indexer_settings_ui_tests.rs"]
@@ -22,5 +32,159 @@ impl DrawUi for IndexerSettingsUi {
false
}
fn draw<B: Backend>(_f: &mut Frame<'_, B>, _app: &mut App<'_>, _content_rect: Rect) {}
fn draw<B: Backend>(f: &mut Frame<'_, B>, app: &mut App<'_>, content_rect: Rect) {
draw_popup_over(
f,
app,
content_rect,
draw_indexers,
draw_edit_indexer_settings_prompt,
60,
40,
);
}
}
fn draw_edit_indexer_settings_prompt<B: Backend>(
f: &mut Frame<'_, B>,
app: &mut App<'_>,
prompt_area: Rect,
) {
let block = title_block_centered("Configure All Indexer Settings");
let yes_no_value = app.data.radarr_data.prompt_confirm;
let selected_block = app.data.radarr_data.selected_block.get_active_block();
let highlight_yes_no = selected_block == &ActiveRadarrBlock::IndexerSettingsConfirmPrompt;
let indexer_settings_option = &app.data.radarr_data.indexer_settings;
if indexer_settings_option.is_some() {
let indexer_settings = indexer_settings_option.as_ref().unwrap();
f.render_widget(block, prompt_area);
let chunks = vertical_chunks_with_margin(
vec![Constraint::Min(0), Constraint::Length(3)],
prompt_area,
1,
);
let split_chunks = horizontal_chunks_with_margin(
vec![Constraint::Ratio(1, 2), Constraint::Ratio(1, 2)],
chunks[0],
1,
);
let left_chunks = vertical_chunks(
vec![
Constraint::Length(3),
Constraint::Length(3),
Constraint::Length(3),
Constraint::Length(3),
Constraint::Min(0),
],
split_chunks[0],
);
let right_chunks = vertical_chunks(
vec![
Constraint::Length(3),
Constraint::Length(3),
Constraint::Length(3),
Constraint::Length(3),
Constraint::Min(0),
],
split_chunks[1],
);
if let Route::Radarr(active_radarr_block, _) = *app.get_current_route() {
draw_text_box_with_label(
f,
left_chunks[0],
"Minimum Age",
&indexer_settings.minimum_age.to_string(),
0,
selected_block == &ActiveRadarrBlock::IndexerSettingsMinimumAgeInput,
active_radarr_block == ActiveRadarrBlock::IndexerSettingsMinimumAgeInput,
);
draw_text_box_with_label(
f,
left_chunks[1],
"Retention",
&indexer_settings.retention.to_string(),
0,
selected_block == &ActiveRadarrBlock::IndexerSettingsRetentionInput,
active_radarr_block == ActiveRadarrBlock::IndexerSettingsRetentionInput,
);
draw_text_box_with_label(
f,
left_chunks[2],
"Maximum Size",
&indexer_settings.maximum_size.to_string(),
0,
selected_block == &ActiveRadarrBlock::IndexerSettingsMaximumSizeInput,
active_radarr_block == ActiveRadarrBlock::IndexerSettingsMaximumSizeInput,
);
draw_text_box_with_label(
f,
right_chunks[0],
"Availability Delay",
&indexer_settings.availability_delay.to_string(),
0,
selected_block == &ActiveRadarrBlock::IndexerSettingsAvailabilityDelayInput,
active_radarr_block == ActiveRadarrBlock::IndexerSettingsAvailabilityDelayInput,
);
draw_text_box_with_label(
f,
right_chunks[1],
"RSS Sync Interval",
&indexer_settings.rss_sync_interval.to_string(),
0,
selected_block == &ActiveRadarrBlock::IndexerSettingsRssSyncIntervalInput,
active_radarr_block == ActiveRadarrBlock::IndexerSettingsRssSyncIntervalInput,
);
draw_text_box_with_label(
f,
right_chunks[2],
"Whitelisted Subtitle Tags",
&indexer_settings.whitelisted_hardcoded_subs.to_string(),
0,
selected_block == &ActiveRadarrBlock::IndexerSettingsWhitelistedSubtitleTagsInput,
active_radarr_block == ActiveRadarrBlock::IndexerSettingsWhitelistedSubtitleTagsInput,
);
}
draw_checkbox_with_label(
f,
left_chunks[3],
"Prefer Indexer Flags",
indexer_settings.prefer_indexer_flags,
selected_block == &ActiveRadarrBlock::IndexerSettingsTogglePreferIndexerFlags,
);
draw_checkbox_with_label(
f,
right_chunks[3],
"Allow Hardcoded Subs",
indexer_settings.allow_hardcoded_subs,
selected_block == &ActiveRadarrBlock::IndexerSettingsToggleAllowHardcodedSubs,
);
let button_chunks = horizontal_chunks(
iter::repeat(Constraint::Ratio(1, 4)).take(4).collect(),
// vec![Constraint::Percentage(50), Constraint::Percentage(50)],
chunks[1],
);
draw_button(
f,
button_chunks[1],
"Save",
yes_no_value && highlight_yes_no,
);
draw_button(
f,
button_chunks[2],
"Cancel",
!yes_no_value && highlight_yes_no,
);
} else {
loading(f, block, prompt_area, app.is_loading);
}
}
@@ -2,7 +2,9 @@
mod tests {
use strum::IntoEnumIterator;
use crate::models::servarr_data::radarr_data::{ActiveRadarrBlock, INDEXER_SETTINGS_BLOCKS};
use crate::models::servarr_data::radarr::radarr_data::{
ActiveRadarrBlock, INDEXER_SETTINGS_BLOCKS,
};
use crate::ui::radarr_ui::indexers::indexer_settings_ui::IndexerSettingsUi;
use crate::ui::DrawUi;
@@ -2,7 +2,7 @@
mod tests {
use strum::IntoEnumIterator;
use crate::models::servarr_data::radarr_data::{
use crate::models::servarr_data::radarr::radarr_data::{
ActiveRadarrBlock, INDEXERS_BLOCKS, INDEXER_SETTINGS_BLOCKS,
};
use crate::ui::radarr_ui::indexers::IndexersUi;
+1 -1
View File
@@ -6,7 +6,7 @@ use tui::Frame;
use crate::app::App;
use crate::models::radarr_models::Indexer;
use crate::models::servarr_data::radarr_data::{ActiveRadarrBlock, INDEXERS_BLOCKS};
use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, INDEXERS_BLOCKS};
use crate::models::Route;
use crate::ui::radarr_ui::indexers::indexer_settings_ui::IndexerSettingsUi;
use crate::ui::utils::{layout_block_top_border, style_failure, style_primary, style_success};
+96 -36
View File
@@ -7,14 +7,11 @@ use tui::Frame;
use crate::app::context_clues::{build_context_clue_string, BARE_POPUP_CONTEXT_CLUES};
use crate::app::radarr::radarr_context_clues::ADD_MOVIE_SEARCH_RESULTS_CONTEXT_CLUES;
use crate::models::radarr_models::AddMovieSearchResult;
use crate::models::servarr_data::radarr_data::{ActiveRadarrBlock, ADD_MOVIE_BLOCKS};
use crate::models::servarr_data::radarr::modals::AddMovieModal;
use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, ADD_MOVIE_BLOCKS};
use crate::models::Route;
use crate::ui::radarr_ui::collections::{draw_collection_details, draw_collections};
use crate::ui::radarr_ui::library::draw_library;
use crate::ui::radarr_ui::{
draw_select_minimum_availability_popup, draw_select_quality_profile_popup,
draw_select_root_folder_popup,
};
use crate::ui::utils::{
borderless_block, get_width_from_percentage, horizontal_chunks, layout_block,
layout_paragraph_borderless, style_help, style_primary, title_block_centered,
@@ -284,7 +281,7 @@ fn draw_confirmation_popup<B: Backend>(f: &mut Frame<'_, B>, app: &mut App<'_>,
app,
prompt_area,
draw_confirmation_prompt,
draw_select_monitor_popup,
draw_add_movie_select_monitor_popup,
);
}
ActiveRadarrBlock::AddMovieSelectMinimumAvailability => {
@@ -293,7 +290,7 @@ fn draw_confirmation_popup<B: Backend>(f: &mut Frame<'_, B>, app: &mut App<'_>,
app,
prompt_area,
draw_confirmation_prompt,
draw_select_minimum_availability_popup,
draw_add_movie_select_minimum_availability_popup,
);
}
ActiveRadarrBlock::AddMovieSelectQualityProfile => {
@@ -302,7 +299,7 @@ fn draw_confirmation_popup<B: Backend>(f: &mut Frame<'_, B>, app: &mut App<'_>,
app,
prompt_area,
draw_confirmation_prompt,
draw_select_quality_profile_popup,
draw_add_movie_select_quality_profile_popup,
);
}
ActiveRadarrBlock::AddMovieSelectRootFolder => {
@@ -311,7 +308,7 @@ fn draw_confirmation_popup<B: Backend>(f: &mut Frame<'_, B>, app: &mut App<'_>,
app,
prompt_area,
draw_confirmation_prompt,
draw_select_root_folder_popup,
draw_add_movie_select_root_folder_popup,
);
}
ActiveRadarrBlock::AddMoviePrompt | ActiveRadarrBlock::AddMovieTagsInput => {
@@ -322,19 +319,6 @@ fn draw_confirmation_popup<B: Backend>(f: &mut Frame<'_, B>, app: &mut App<'_>,
}
}
fn draw_select_monitor_popup<B: Backend>(
f: &mut Frame<'_, B>,
app: &mut App<'_>,
popup_area: Rect,
) {
draw_selectable_list(
f,
popup_area,
&mut app.data.radarr_data.monitor_list,
|monitor| ListItem::new(monitor.to_display_str().to_owned()),
);
}
fn draw_confirmation_prompt<B: Backend>(
f: &mut Frame<'_, B>,
app: &mut App<'_>,
@@ -380,19 +364,19 @@ fn draw_confirmation_prompt<B: Backend>(
let yes_no_value = app.data.radarr_data.prompt_confirm;
let selected_block = app.data.radarr_data.selected_block.get_active_block();
let highlight_yes_no = selected_block == &ActiveRadarrBlock::AddMovieConfirmPrompt;
let AddMovieModal {
monitor_list,
minimum_availability_list,
quality_profile_list,
root_folder_list,
tags,
..
} = app.data.radarr_data.add_movie_modal.as_ref().unwrap();
let selected_monitor = app.data.radarr_data.monitor_list.current_selection();
let selected_minimum_availability = app
.data
.radarr_data
.minimum_availability_list
.current_selection();
let selected_quality_profile = app
.data
.radarr_data
.quality_profile_list
.current_selection();
let selected_root_folder = app.data.radarr_data.root_folder_list.current_selection();
let selected_monitor = monitor_list.current_selection();
let selected_minimum_availability = minimum_availability_list.current_selection();
let selected_quality_profile = quality_profile_list.current_selection();
let selected_root_folder = root_folder_list.current_selection();
f.render_widget(title_block_centered(&title), prompt_area);
@@ -455,8 +439,8 @@ fn draw_confirmation_prompt<B: Backend>(
f,
chunks[5],
"Tags",
&app.data.radarr_data.edit_tags.text,
*app.data.radarr_data.edit_tags.offset.borrow(),
&tags.text,
*tags.offset.borrow(),
selected_block == &ActiveRadarrBlock::AddMovieTagsInput,
active_radarr_block == ActiveRadarrBlock::AddMovieTagsInput,
);
@@ -475,3 +459,79 @@ fn draw_confirmation_prompt<B: Backend>(
!yes_no_value && highlight_yes_no,
);
}
fn draw_add_movie_select_monitor_popup<B: Backend>(
f: &mut Frame<'_, B>,
app: &mut App<'_>,
popup_area: Rect,
) {
draw_selectable_list(
f,
popup_area,
&mut app
.data
.radarr_data
.add_movie_modal
.as_mut()
.unwrap()
.monitor_list,
|monitor| ListItem::new(monitor.to_display_str().to_owned()),
);
}
fn draw_add_movie_select_minimum_availability_popup<B: Backend>(
f: &mut Frame<'_, B>,
app: &mut App<'_>,
popup_area: Rect,
) {
draw_selectable_list(
f,
popup_area,
&mut app
.data
.radarr_data
.add_movie_modal
.as_mut()
.unwrap()
.minimum_availability_list,
|minimum_availability| ListItem::new(minimum_availability.to_display_str().to_owned()),
);
}
fn draw_add_movie_select_quality_profile_popup<B: Backend>(
f: &mut Frame<'_, B>,
app: &mut App<'_>,
popup_area: Rect,
) {
draw_selectable_list(
f,
popup_area,
&mut app
.data
.radarr_data
.add_movie_modal
.as_mut()
.unwrap()
.quality_profile_list,
|quality_profile| ListItem::new(quality_profile.clone()),
);
}
fn draw_add_movie_select_root_folder_popup<B: Backend>(
f: &mut Frame<'_, B>,
app: &mut App<'_>,
popup_area: Rect,
) {
draw_selectable_list(
f,
popup_area,
&mut app
.data
.radarr_data
.add_movie_modal
.as_mut()
.unwrap()
.root_folder_list,
|root_folder| ListItem::new(root_folder.path.to_owned()),
);
}
@@ -2,7 +2,7 @@
mod tests {
use strum::IntoEnumIterator;
use crate::models::servarr_data::radarr_data::{ActiveRadarrBlock, ADD_MOVIE_BLOCKS};
use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, ADD_MOVIE_BLOCKS};
use crate::ui::radarr_ui::library::add_movie_ui::AddMovieUi;
use crate::ui::DrawUi;
+1 -1
View File
@@ -3,7 +3,7 @@ use tui::layout::Rect;
use tui::Frame;
use crate::app::App;
use crate::models::servarr_data::radarr_data::{ActiveRadarrBlock, DELETE_MOVIE_BLOCKS};
use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, DELETE_MOVIE_BLOCKS};
use crate::models::Route;
use crate::ui::radarr_ui::library::draw_library;
use crate::ui::{draw_prompt_box_with_checkboxes, draw_prompt_popup_over, DrawUi};
@@ -2,7 +2,7 @@
mod tests {
use strum::IntoEnumIterator;
use crate::models::servarr_data::radarr_data::{ActiveRadarrBlock, DELETE_MOVIE_BLOCKS};
use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, DELETE_MOVIE_BLOCKS};
use crate::ui::radarr_ui::library::delete_movie_ui::DeleteMovieUi;
use crate::ui::DrawUi;
+59 -22
View File
@@ -1,24 +1,24 @@
use tui::backend::Backend;
use tui::layout::{Constraint, Rect};
use tui::widgets::ListItem;
use tui::Frame;
use crate::app::App;
use crate::models::servarr_data::radarr_data::{
use crate::models::servarr_data::radarr::modals::EditMovieModal;
use crate::models::servarr_data::radarr::radarr_data::{
ActiveRadarrBlock, EDIT_MOVIE_BLOCKS, MOVIE_DETAILS_BLOCKS,
};
use crate::models::Route;
use crate::ui::radarr_ui::library::draw_library;
use crate::ui::radarr_ui::library::movie_details_ui::MovieDetailsUi;
use crate::ui::radarr_ui::{
draw_select_minimum_availability_popup, draw_select_quality_profile_popup,
};
use crate::ui::utils::{
horizontal_chunks, layout_paragraph_borderless, title_block_centered, vertical_chunks_with_margin,
};
use crate::ui::{
draw_button, draw_checkbox_with_label, draw_drop_down_menu_button, draw_drop_down_popup,
draw_large_popup_over_background_fn_with_ui, draw_medium_popup_over, draw_popup,
draw_text_box_with_label, DrawUi,
draw_selectable_list, draw_text_box_with_label, DrawUi,
};
#[cfg(test)]
@@ -46,7 +46,7 @@ impl DrawUi for EditMovieUi {
app,
prompt_area,
draw_edit_movie_confirmation_prompt,
draw_select_minimum_availability_popup,
draw_edit_movie_select_minimum_availability_popup,
);
}
ActiveRadarrBlock::EditMovieSelectQualityProfile => {
@@ -55,7 +55,7 @@ impl DrawUi for EditMovieUi {
app,
prompt_area,
draw_edit_movie_confirmation_prompt,
draw_select_quality_profile_popup,
draw_edit_movie_select_quality_profile_popup,
);
}
ActiveRadarrBlock::EditMoviePrompt
@@ -134,17 +134,16 @@ fn draw_edit_movie_confirmation_prompt<B: Backend>(
let yes_no_value = app.data.radarr_data.prompt_confirm;
let selected_block = app.data.radarr_data.selected_block.get_active_block();
let highlight_yes_no = selected_block == &ActiveRadarrBlock::EditMovieConfirmPrompt;
let EditMovieModal {
minimum_availability_list,
quality_profile_list,
monitored,
path,
tags,
} = app.data.radarr_data.edit_movie_modal.as_ref().unwrap();
let selected_minimum_availability = app
.data
.radarr_data
.minimum_availability_list
.current_selection();
let selected_quality_profile = app
.data
.radarr_data
.quality_profile_list
.current_selection();
let selected_minimum_availability = minimum_availability_list.current_selection();
let selected_quality_profile = quality_profile_list.current_selection();
f.render_widget(title_block_centered(&title), prompt_area);
@@ -175,7 +174,7 @@ fn draw_edit_movie_confirmation_prompt<B: Backend>(
f,
chunks[1],
"Monitored",
app.data.radarr_data.edit_monitored.unwrap_or_default(),
monitored.unwrap_or_default(),
selected_block == &ActiveRadarrBlock::EditMovieToggleMonitored,
);
@@ -199,8 +198,8 @@ fn draw_edit_movie_confirmation_prompt<B: Backend>(
f,
chunks[4],
"Path",
&app.data.radarr_data.edit_path.text,
*app.data.radarr_data.edit_path.offset.borrow(),
&path.text,
*path.offset.borrow(),
selected_block == &ActiveRadarrBlock::EditMoviePathInput,
active_radarr_block == ActiveRadarrBlock::EditMoviePathInput,
);
@@ -208,8 +207,8 @@ fn draw_edit_movie_confirmation_prompt<B: Backend>(
f,
chunks[5],
"Tags",
&app.data.radarr_data.edit_tags.text,
*app.data.radarr_data.edit_tags.offset.borrow(),
&tags.text,
*tags.offset.borrow(),
selected_block == &ActiveRadarrBlock::EditMovieTagsInput,
active_radarr_block == ActiveRadarrBlock::EditMovieTagsInput,
);
@@ -228,3 +227,41 @@ fn draw_edit_movie_confirmation_prompt<B: Backend>(
!yes_no_value && highlight_yes_no,
);
}
fn draw_edit_movie_select_minimum_availability_popup<B: Backend>(
f: &mut Frame<'_, B>,
app: &mut App<'_>,
popup_area: Rect,
) {
draw_selectable_list(
f,
popup_area,
&mut app
.data
.radarr_data
.edit_movie_modal
.as_mut()
.unwrap()
.minimum_availability_list,
|minimum_availability| ListItem::new(minimum_availability.to_display_str().to_owned()),
);
}
fn draw_edit_movie_select_quality_profile_popup<B: Backend>(
f: &mut Frame<'_, B>,
app: &mut App<'_>,
popup_area: Rect,
) {
draw_selectable_list(
f,
popup_area,
&mut app
.data
.radarr_data
.edit_movie_modal
.as_mut()
.unwrap()
.quality_profile_list,
|quality_profile| ListItem::new(quality_profile.clone()),
);
}
@@ -2,7 +2,7 @@
mod tests {
use strum::IntoEnumIterator;
use crate::models::servarr_data::radarr_data::{ActiveRadarrBlock, EDIT_MOVIE_BLOCKS};
use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, EDIT_MOVIE_BLOCKS};
use crate::ui::radarr_ui::library::edit_movie_ui::EditMovieUi;
use crate::ui::DrawUi;
+1 -1
View File
@@ -2,7 +2,7 @@
mod tests {
use strum::IntoEnumIterator;
use crate::models::servarr_data::radarr_data::{
use crate::models::servarr_data::radarr::radarr_data::{
ActiveRadarrBlock, ADD_MOVIE_BLOCKS, DELETE_MOVIE_BLOCKS, EDIT_MOVIE_BLOCKS, LIBRARY_BLOCKS,
MOVIE_DETAILS_BLOCKS,
};
+1 -1
View File
@@ -5,7 +5,7 @@ use tui::Frame;
use crate::app::App;
use crate::models::radarr_models::Movie;
use crate::models::servarr_data::radarr_data::{ActiveRadarrBlock, LIBRARY_BLOCKS};
use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, LIBRARY_BLOCKS};
use crate::models::Route;
use crate::ui::radarr_ui::library::add_movie_ui::AddMovieUi;
use crate::ui::radarr_ui::library::delete_movie_ui::DeleteMovieUi;
+1 -1
View File
@@ -9,7 +9,7 @@ use tui::Frame;
use crate::app::App;
use crate::models::radarr_models::{Credit, MovieHistoryItem, Release, ReleaseField};
use crate::models::servarr_data::radarr_data::{ActiveRadarrBlock, MOVIE_DETAILS_BLOCKS};
use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, MOVIE_DETAILS_BLOCKS};
use crate::models::Route;
use crate::ui::radarr_ui::library::draw_library;
use crate::ui::utils::{
@@ -2,7 +2,7 @@
mod tests {
use strum::IntoEnumIterator;
use crate::models::servarr_data::radarr_data::{ActiveRadarrBlock, MOVIE_DETAILS_BLOCKS};
use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, MOVIE_DETAILS_BLOCKS};
use crate::ui::radarr_ui::library::movie_details_ui::MovieDetailsUi;
use crate::ui::DrawUi;
+1 -42
View File
@@ -5,18 +5,16 @@ use tui::backend::Backend;
use tui::layout::{Alignment, Constraint, Rect};
use tui::style::{Color, Style};
use tui::text::Text;
use tui::widgets::ListItem;
use tui::widgets::Paragraph;
use tui::Frame;
use crate::app::App;
use crate::logos::RADARR_LOGO;
use crate::models::radarr_models::{DiskSpace, DownloadRecord, Movie, RootFolder};
use crate::models::servarr_data::radarr_data::{
use crate::models::servarr_data::radarr::radarr_data::{
ActiveRadarrBlock, RadarrData, FILTER_BLOCKS, SEARCH_BLOCKS,
};
use crate::models::Route;
use crate::ui::draw_selectable_list;
use crate::ui::draw_tabs;
use crate::ui::loading;
use crate::ui::radarr_ui::collections::CollectionsUi;
@@ -232,45 +230,6 @@ fn determine_row_style(downloads_vec: &[DownloadRecord], movie: &Movie) -> Style
}
}
fn draw_select_minimum_availability_popup<B: Backend>(
f: &mut Frame<'_, B>,
app: &mut App<'_>,
popup_area: Rect,
) {
draw_selectable_list(
f,
popup_area,
&mut app.data.radarr_data.minimum_availability_list,
|minimum_availability| ListItem::new(minimum_availability.to_display_str().to_owned()),
);
}
fn draw_select_quality_profile_popup<B: Backend>(
f: &mut Frame<'_, B>,
app: &mut App<'_>,
popup_area: Rect,
) {
draw_selectable_list(
f,
popup_area,
&mut app.data.radarr_data.quality_profile_list,
|quality_profile| ListItem::new(quality_profile.clone()),
);
}
fn draw_select_root_folder_popup<B: Backend>(
f: &mut Frame<'_, B>,
app: &mut App<'_>,
popup_area: Rect,
) {
draw_selectable_list(
f,
popup_area,
&mut app.data.radarr_data.root_folder_list,
|root_folder| ListItem::new(root_folder.path.to_owned()),
);
}
fn draw_search_box<B: Backend>(f: &mut Frame<'_, B>, app: &mut App<'_>, area: Rect) {
let chunks =
vertical_chunks_with_margin(vec![Constraint::Length(3), Constraint::Min(0)], area, 1);
+1 -1
View File
@@ -2,7 +2,7 @@
mod tests {
use strum::IntoEnumIterator;
use crate::models::servarr_data::radarr_data::ActiveRadarrBlock;
use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock;
use crate::ui::radarr_ui::RadarrUi;
use crate::ui::DrawUi;
+1 -1
View File
@@ -5,7 +5,7 @@ use tui::Frame;
use crate::app::App;
use crate::models::radarr_models::RootFolder;
use crate::models::servarr_data::radarr_data::{ActiveRadarrBlock, ROOT_FOLDERS_BLOCKS};
use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, ROOT_FOLDERS_BLOCKS};
use crate::models::Route;
use crate::ui::utils::{
borderless_block, layout_block_top_border, show_cursor, style_default, style_help, style_primary,
@@ -2,7 +2,7 @@
mod tests {
use strum::IntoEnumIterator;
use crate::models::servarr_data::radarr_data::{ActiveRadarrBlock, ROOT_FOLDERS_BLOCKS};
use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, ROOT_FOLDERS_BLOCKS};
use crate::ui::radarr_ui::root_folders::RootFoldersUi;
use crate::ui::DrawUi;
+1 -1
View File
@@ -13,7 +13,7 @@ use tui::{
use crate::app::App;
use crate::models::radarr_models::Task;
use crate::models::servarr_data::radarr_data::ActiveRadarrBlock;
use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock;
use crate::ui::radarr_ui::radarr_ui_utils::{
convert_to_minutes_hours_days, determine_log_style_by_level,
};
+1 -1
View File
@@ -7,7 +7,7 @@ use tui::Frame;
use crate::app::context_clues::{build_context_clue_string, BARE_POPUP_CONTEXT_CLUES};
use crate::app::radarr::radarr_context_clues::SYSTEM_TASKS_CONTEXT_CLUES;
use crate::app::App;
use crate::models::servarr_data::radarr_data::{ActiveRadarrBlock, SYSTEM_DETAILS_BLOCKS};
use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, SYSTEM_DETAILS_BLOCKS};
use crate::models::Route;
use crate::ui::radarr_ui::radarr_ui_utils::determine_log_style_by_level;
use crate::ui::radarr_ui::system::{
@@ -2,7 +2,9 @@
mod tests {
use strum::IntoEnumIterator;
use crate::models::servarr_data::radarr_data::{ActiveRadarrBlock, SYSTEM_DETAILS_BLOCKS};
use crate::models::servarr_data::radarr::radarr_data::{
ActiveRadarrBlock, SYSTEM_DETAILS_BLOCKS,
};
use crate::ui::radarr_ui::system::system_details_ui::SystemDetailsUi;
use crate::ui::DrawUi;
+3 -1
View File
@@ -2,7 +2,9 @@
mod tests {
use strum::IntoEnumIterator;
use crate::models::servarr_data::radarr_data::{ActiveRadarrBlock, SYSTEM_DETAILS_BLOCKS};
use crate::models::servarr_data::radarr::radarr_data::{
ActiveRadarrBlock, SYSTEM_DETAILS_BLOCKS,
};
use crate::ui::radarr_ui::system::SystemUi;
use crate::ui::DrawUi;