Added two new checkboxes to the delete movie UI that allows users to specify to delete the file and/or add an exclusion for the selected film on deletion. Also fixed the refresh bug in the root folders UI where you have to manually refresh to get the changes to show before 20 seconds. Also cleaned up code a bit and removed some unnecessary clone calls and references-dereferences since the types were copyable and not necessary to be referenced since they were all dereferenced anyway and copied. Made sense to just cut out the middleman on the copies.

This commit is contained in:
2023-08-08 10:50:06 -06:00
parent b7d00f4827
commit 435926f6f0
15 changed files with 618 additions and 132 deletions
+57 -5
View File
@@ -1,3 +1,5 @@
use std::iter;
use tui::backend::Backend;
use tui::layout::{Alignment, Constraint, Rect};
use tui::style::Modifier;
@@ -141,7 +143,7 @@ pub fn draw_prompt_popup_over<B: Backend>(
background_fn: fn(&mut Frame<'_, B>, &mut App, Rect),
popup_fn: fn(&mut Frame<'_, B>, &mut App, Rect),
) {
draw_popup_over(f, app, area, background_fn, popup_fn, 30, 30);
draw_popup_over(f, app, area, background_fn, popup_fn, 35, 35);
}
pub fn draw_small_popup_over<B: Backend>(
@@ -334,7 +336,7 @@ pub fn draw_prompt_box<B: Backend>(
prompt_area: Rect,
title: &str,
prompt: &str,
yes_no_value: &bool,
yes_no_value: bool,
) {
draw_prompt_box_with_content(f, prompt_area, title, prompt, None, yes_no_value);
}
@@ -345,7 +347,7 @@ pub fn draw_prompt_box_with_content<B: Backend>(
title: &str,
prompt: &str,
content: Option<Paragraph<'_>>,
yes_no_value: &bool,
yes_no_value: bool,
) {
f.render_widget(title_block_centered(title), prompt_area);
@@ -384,8 +386,58 @@ pub fn draw_prompt_box_with_content<B: Backend>(
chunks[2],
);
draw_button(f, horizontal_chunks[0], "Yes", *yes_no_value);
draw_button(f, horizontal_chunks[1], "No", !*yes_no_value);
draw_button(f, horizontal_chunks[0], "Yes", yes_no_value);
draw_button(f, horizontal_chunks[1], "No", !yes_no_value);
}
pub fn draw_prompt_box_with_checkboxes<B: Backend>(
f: &mut Frame<'_, B>,
prompt_area: Rect,
title: &str,
prompt: &str,
checkboxes: Vec<(&str, bool, bool)>,
highlight_yes_no: bool,
yes_no_value: bool,
) {
f.render_widget(title_block_centered(title), prompt_area);
let mut constraints = vec![
Constraint::Length(4),
Constraint::Min(0),
Constraint::Length(3),
];
constraints.splice(
1..1,
iter::repeat(Constraint::Length(3)).take(checkboxes.len()),
);
let chunks = vertical_chunks_with_margin(constraints, prompt_area, 1);
let prompt_paragraph = layout_paragraph_borderless(prompt);
f.render_widget(prompt_paragraph, chunks[0]);
for i in 0..checkboxes.len() {
let (label, is_checked, is_selected) = checkboxes[i];
draw_checkbox_with_label(f, chunks[i + 1], label, is_checked, is_selected);
}
let horizontal_chunks = horizontal_chunks(
vec![Constraint::Percentage(50), Constraint::Percentage(50)],
chunks[checkboxes.len() + 2],
);
draw_button(
f,
horizontal_chunks[0],
"Yes",
highlight_yes_no && yes_no_value,
);
draw_button(
f,
horizontal_chunks[1],
"No",
highlight_yes_no && !yes_no_value,
);
}
pub fn draw_checkbox<B: Backend>(
+10 -10
View File
@@ -327,9 +327,9 @@ fn draw_confirmation_prompt<B: Backend>(f: &mut Frame<'_, B>, app: &mut App, pro
};
let title = format!("Add Movie - {}", movie_title);
let prompt = movie_overview;
let yes_no_value = &app.data.radarr_data.prompt_confirm;
let selected_block = &app.data.radarr_data.selected_block;
let highlight_yes_no = *selected_block == ActiveRadarrBlock::AddMovieConfirmPrompt;
let yes_no_value = app.data.radarr_data.prompt_confirm;
let selected_block = app.data.radarr_data.selected_block;
let highlight_yes_no = selected_block == ActiveRadarrBlock::AddMovieConfirmPrompt;
let selected_monitor = app.data.radarr_data.monitor_list.current_selection();
let selected_minimum_availability = app
@@ -374,7 +374,7 @@ fn draw_confirmation_prompt<B: Backend>(f: &mut Frame<'_, B>, app: &mut App, pro
chunks[1],
"Root Folder",
&selected_root_folder.path,
*selected_block == ActiveRadarrBlock::AddMovieSelectRootFolder,
selected_block == ActiveRadarrBlock::AddMovieSelectRootFolder,
);
draw_drop_down_menu_button(
@@ -382,7 +382,7 @@ fn draw_confirmation_prompt<B: Backend>(f: &mut Frame<'_, B>, app: &mut App, pro
chunks[2],
"Monitor",
selected_monitor.to_display_str(),
*selected_block == ActiveRadarrBlock::AddMovieSelectMonitor,
selected_block == ActiveRadarrBlock::AddMovieSelectMonitor,
);
draw_drop_down_menu_button(
@@ -390,14 +390,14 @@ fn draw_confirmation_prompt<B: Backend>(f: &mut Frame<'_, B>, app: &mut App, pro
chunks[3],
"Minimum Availability",
selected_minimum_availability.to_display_str(),
*selected_block == ActiveRadarrBlock::AddMovieSelectMinimumAvailability,
selected_block == ActiveRadarrBlock::AddMovieSelectMinimumAvailability,
);
draw_drop_down_menu_button(
f,
chunks[4],
"Quality Profile",
selected_quality_profile,
*selected_block == ActiveRadarrBlock::AddMovieSelectQualityProfile,
selected_block == ActiveRadarrBlock::AddMovieSelectQualityProfile,
);
if let Route::Radarr(active_radarr_block, _) = *app.get_current_route() {
@@ -407,7 +407,7 @@ fn draw_confirmation_prompt<B: Backend>(f: &mut Frame<'_, B>, app: &mut App, pro
"Tags",
&app.data.radarr_data.edit_tags.text,
*app.data.radarr_data.edit_tags.offset.borrow(),
*selected_block == ActiveRadarrBlock::AddMovieTagsInput,
selected_block == ActiveRadarrBlock::AddMovieTagsInput,
active_radarr_block == ActiveRadarrBlock::AddMovieTagsInput,
);
}
@@ -416,12 +416,12 @@ fn draw_confirmation_prompt<B: Backend>(f: &mut Frame<'_, B>, app: &mut App, pro
f,
horizontal_chunks[0],
"Add",
*yes_no_value && highlight_yes_no,
yes_no_value && highlight_yes_no,
);
draw_button(
f,
horizontal_chunks[1],
"Cancel",
!*yes_no_value && highlight_yes_no,
!yes_no_value && highlight_yes_no,
);
}
+45
View File
@@ -0,0 +1,45 @@
use tui::backend::Backend;
use tui::layout::Rect;
use tui::Frame;
use crate::app::radarr::ActiveRadarrBlock;
use crate::app::App;
use crate::models::Route;
use crate::ui::draw_prompt_box_with_checkboxes;
pub(super) fn draw_delete_movie_prompt<B: Backend>(
f: &mut Frame<'_, B>,
app: &mut App,
prompt_area: Rect,
) {
if matches!(
*app.get_current_route(),
Route::Radarr(ActiveRadarrBlock::DeleteMoviePrompt, _)
) {
let selected_block = app.data.radarr_data.selected_block;
draw_prompt_box_with_checkboxes(
f,
prompt_area,
"Delete Movie",
format!(
"Do you really want to delete: {}?",
app.data.radarr_data.movies.current_selection().title
)
.as_str(),
vec![
(
"Delete Movie Files",
app.data.radarr_data.delete_movie_files,
selected_block == ActiveRadarrBlock::DeleteMovieToggleDeleteFile,
),
(
"Add List Exclusion",
app.data.radarr_data.add_list_exclusion,
selected_block == ActiveRadarrBlock::DeleteMovieToggleAddListExclusion,
),
],
selected_block == ActiveRadarrBlock::DeleteMovieConfirmPrompt,
app.data.radarr_data.prompt_confirm,
)
}
}
+10 -10
View File
@@ -96,9 +96,9 @@ fn draw_edit_collection_confirmation_prompt<B: Backend>(
)
};
let title = format!("Edit - {}", collection_title);
let yes_no_value = &app.data.radarr_data.prompt_confirm;
let selected_block = &app.data.radarr_data.selected_block;
let highlight_yes_no = *selected_block == ActiveRadarrBlock::EditCollectionConfirmPrompt;
let yes_no_value = app.data.radarr_data.prompt_confirm;
let selected_block = app.data.radarr_data.selected_block;
let highlight_yes_no = selected_block == ActiveRadarrBlock::EditCollectionConfirmPrompt;
let selected_minimum_availability = app
.data
@@ -141,7 +141,7 @@ fn draw_edit_collection_confirmation_prompt<B: Backend>(
chunks[1],
"Monitored",
app.data.radarr_data.edit_monitored.unwrap_or_default(),
*selected_block == ActiveRadarrBlock::EditCollectionToggleMonitored,
selected_block == ActiveRadarrBlock::EditCollectionToggleMonitored,
);
draw_drop_down_menu_button(
@@ -149,14 +149,14 @@ fn draw_edit_collection_confirmation_prompt<B: Backend>(
chunks[2],
"Minimum Availability",
selected_minimum_availability.to_display_str(),
*selected_block == ActiveRadarrBlock::EditCollectionSelectMinimumAvailability,
selected_block == ActiveRadarrBlock::EditCollectionSelectMinimumAvailability,
);
draw_drop_down_menu_button(
f,
chunks[3],
"Quality Profile",
selected_quality_profile,
*selected_block == ActiveRadarrBlock::EditCollectionSelectQualityProfile,
selected_block == ActiveRadarrBlock::EditCollectionSelectQualityProfile,
);
if let Route::Radarr(active_radarr_block, _) = *app.get_current_route() {
@@ -166,7 +166,7 @@ fn draw_edit_collection_confirmation_prompt<B: Backend>(
"Root Folder",
&app.data.radarr_data.edit_path.text,
*app.data.radarr_data.edit_path.offset.borrow(),
*selected_block == ActiveRadarrBlock::EditCollectionRootFolderPathInput,
selected_block == ActiveRadarrBlock::EditCollectionRootFolderPathInput,
active_radarr_block == ActiveRadarrBlock::EditCollectionRootFolderPathInput,
);
}
@@ -176,19 +176,19 @@ fn draw_edit_collection_confirmation_prompt<B: Backend>(
chunks[5],
"Search on Add",
app.data.radarr_data.edit_search_on_add.unwrap_or_default(),
*selected_block == ActiveRadarrBlock::EditCollectionToggleSearchOnAdd,
selected_block == ActiveRadarrBlock::EditCollectionToggleSearchOnAdd,
);
draw_button(
f,
horizontal_chunks[0],
"Save",
*yes_no_value && highlight_yes_no,
yes_no_value && highlight_yes_no,
);
draw_button(
f,
horizontal_chunks[1],
"Cancel",
!*yes_no_value && highlight_yes_no,
!yes_no_value && highlight_yes_no,
);
}
+10 -10
View File
@@ -93,9 +93,9 @@ fn draw_edit_movie_confirmation_prompt<B: Backend>(
)
};
let title = format!("Edit - {}", movie_title);
let yes_no_value = &app.data.radarr_data.prompt_confirm;
let selected_block = &app.data.radarr_data.selected_block;
let highlight_yes_no = *selected_block == ActiveRadarrBlock::EditMovieConfirmPrompt;
let yes_no_value = app.data.radarr_data.prompt_confirm;
let selected_block = app.data.radarr_data.selected_block;
let highlight_yes_no = selected_block == ActiveRadarrBlock::EditMovieConfirmPrompt;
let selected_minimum_availability = app
.data
@@ -138,7 +138,7 @@ fn draw_edit_movie_confirmation_prompt<B: Backend>(
chunks[1],
"Monitored",
app.data.radarr_data.edit_monitored.unwrap_or_default(),
*selected_block == ActiveRadarrBlock::EditMovieToggleMonitored,
selected_block == ActiveRadarrBlock::EditMovieToggleMonitored,
);
draw_drop_down_menu_button(
@@ -146,14 +146,14 @@ fn draw_edit_movie_confirmation_prompt<B: Backend>(
chunks[2],
"Minimum Availability",
selected_minimum_availability.to_display_str(),
*selected_block == ActiveRadarrBlock::EditMovieSelectMinimumAvailability,
selected_block == ActiveRadarrBlock::EditMovieSelectMinimumAvailability,
);
draw_drop_down_menu_button(
f,
chunks[3],
"Quality Profile",
selected_quality_profile,
*selected_block == ActiveRadarrBlock::EditMovieSelectQualityProfile,
selected_block == ActiveRadarrBlock::EditMovieSelectQualityProfile,
);
if let Route::Radarr(active_radarr_block, _) = *app.get_current_route() {
@@ -163,7 +163,7 @@ fn draw_edit_movie_confirmation_prompt<B: Backend>(
"Path",
&app.data.radarr_data.edit_path.text,
*app.data.radarr_data.edit_path.offset.borrow(),
*selected_block == ActiveRadarrBlock::EditMoviePathInput,
selected_block == ActiveRadarrBlock::EditMoviePathInput,
active_radarr_block == ActiveRadarrBlock::EditMoviePathInput,
);
draw_text_box_with_label(
@@ -172,7 +172,7 @@ fn draw_edit_movie_confirmation_prompt<B: Backend>(
"Tags",
&app.data.radarr_data.edit_tags.text,
*app.data.radarr_data.edit_tags.offset.borrow(),
*selected_block == ActiveRadarrBlock::EditMovieTagsInput,
selected_block == ActiveRadarrBlock::EditMovieTagsInput,
active_radarr_block == ActiveRadarrBlock::EditMovieTagsInput,
);
}
@@ -181,12 +181,12 @@ fn draw_edit_movie_confirmation_prompt<B: Backend>(
f,
horizontal_chunks[0],
"Save",
*yes_no_value && highlight_yes_no,
yes_no_value && highlight_yes_no,
);
draw_button(
f,
horizontal_chunks[1],
"Cancel",
!*yes_no_value && highlight_yes_no,
!yes_no_value && highlight_yes_no,
);
}
+9 -21
View File
@@ -10,7 +10,7 @@ use tui::widgets::{Cell, ListItem, Paragraph, Row};
use tui::Frame;
use crate::app::radarr::{
ActiveRadarrBlock, RadarrData, ADD_MOVIE_BLOCKS, COLLECTION_DETAILS_BLOCKS,
ActiveRadarrBlock, RadarrData, ADD_MOVIE_BLOCKS, COLLECTION_DETAILS_BLOCKS, DELETE_MOVIE_BLOCKS,
EDIT_COLLECTION_BLOCKS, EDIT_MOVIE_BLOCKS, FILTER_BLOCKS, MOVIE_DETAILS_BLOCKS, SEARCH_BLOCKS,
};
use crate::app::App;
@@ -19,6 +19,7 @@ use crate::models::radarr_models::{Collection, DiskSpace, DownloadRecord, Movie,
use crate::models::{HorizontallyScrollableText, Route};
use crate::ui::radarr_ui::add_movie_ui::draw_add_movie_search_popup;
use crate::ui::radarr_ui::collection_details_ui::draw_collection_details_popup;
use crate::ui::radarr_ui::delete_movie_ui::draw_delete_movie_prompt;
use crate::ui::radarr_ui::edit_collection_ui::draw_edit_collection_prompt;
use crate::ui::radarr_ui::edit_movie_ui::draw_edit_movie_prompt;
use crate::ui::radarr_ui::movie_details_ui::draw_movie_info_popup;
@@ -37,6 +38,7 @@ use crate::utils::{convert_runtime, convert_to_gb};
mod add_movie_ui;
mod collection_details_ui;
mod delete_movie_ui;
mod edit_collection_ui;
mod edit_movie_ui;
mod movie_details_ui;
@@ -150,7 +152,7 @@ pub(super) fn draw_radarr_ui<B: Backend>(f: &mut Frame<'_, B>, app: &mut App, ar
}
}
}
ActiveRadarrBlock::DeleteMoviePrompt => {
_ if DELETE_MOVIE_BLOCKS.contains(&active_radarr_block) => {
draw_prompt_popup_over(f, app, content_rect, draw_library, draw_delete_movie_prompt)
}
ActiveRadarrBlock::DeleteDownloadPrompt => draw_prompt_popup_over(
@@ -320,7 +322,7 @@ fn draw_update_all_movies_prompt<B: Backend>(
prompt_area,
"Update All Movies",
"Do you want to update info and scan your disks for all of your movies?",
&app.data.radarr_data.prompt_confirm,
app.data.radarr_data.prompt_confirm,
);
}
@@ -334,7 +336,7 @@ fn draw_update_downloads_prompt<B: Backend>(
prompt_area,
"Update Downloads",
"Do you want to update your downloads?",
&app.data.radarr_data.prompt_confirm,
app.data.radarr_data.prompt_confirm,
);
}
@@ -348,21 +350,7 @@ fn draw_update_all_collections_prompt<B: Backend>(
prompt_area,
"Update All Collections",
"Do you want to update all of your collections?",
&app.data.radarr_data.prompt_confirm,
);
}
fn draw_delete_movie_prompt<B: Backend>(f: &mut Frame<'_, B>, app: &mut App, prompt_area: Rect) {
draw_prompt_box(
f,
prompt_area,
"Delete Movie",
format!(
"Do you really want to delete: {}?",
app.data.radarr_data.movies.current_selection().title
)
.as_str(),
&app.data.radarr_data.prompt_confirm,
app.data.radarr_data.prompt_confirm,
);
}
@@ -376,7 +364,7 @@ fn draw_delete_download_prompt<B: Backend>(f: &mut Frame<'_, B>, app: &mut App,
app.data.radarr_data.downloads.current_selection().title
)
.as_str(),
&app.data.radarr_data.prompt_confirm,
app.data.radarr_data.prompt_confirm,
);
}
@@ -394,7 +382,7 @@ fn draw_delete_root_folder_prompt<B: Backend>(
app.data.radarr_data.root_folders.current_selection().path
)
.as_str(),
&app.data.radarr_data.prompt_confirm,
app.data.radarr_data.prompt_confirm,
);
}
+4 -4
View File
@@ -93,7 +93,7 @@ fn draw_search_movie_prompt<B: Backend>(f: &mut Frame<'_, B>, app: &mut App, pro
app.data.radarr_data.movies.current_selection().title
)
.as_str(),
&app.data.radarr_data.prompt_confirm,
app.data.radarr_data.prompt_confirm,
);
}
@@ -107,7 +107,7 @@ fn draw_update_and_scan_prompt<B: Backend>(f: &mut Frame<'_, B>, app: &mut App,
app.data.radarr_data.movies.current_selection().title
)
.as_str(),
&app.data.radarr_data.prompt_confirm,
app.data.radarr_data.prompt_confirm,
);
}
@@ -521,7 +521,7 @@ fn draw_manual_search_confirm_prompt<B: Backend>(
title,
&prompt,
Some(content_paragraph),
&app.data.radarr_data.prompt_confirm,
app.data.radarr_data.prompt_confirm,
);
} else {
draw_prompt_box(
@@ -529,7 +529,7 @@ fn draw_manual_search_confirm_prompt<B: Backend>(
prompt_area,
title,
&prompt,
&app.data.radarr_data.prompt_confirm,
app.data.radarr_data.prompt_confirm,
);
}
}