Began the Great Widget Refactor of 2024 and introduced custom widgets for buttons, checkboxes, and input boxes. Up next: loading and table widgets

This commit is contained in:
2024-02-09 16:36:54 -07:00
parent 9b0c272e76
commit 68de986c48
11 changed files with 667 additions and 627 deletions
@@ -8,13 +8,17 @@ use crate::models::servarr_data::radarr::radarr_data::{
ActiveRadarrBlock, COLLECTION_DETAILS_BLOCKS, EDIT_COLLECTION_BLOCKS,
};
use crate::models::Route;
use crate::render_selectable_input_box;
use crate::ui::radarr_ui::collections::collection_details_ui::CollectionDetailsUi;
use crate::ui::radarr_ui::collections::draw_collections;
use crate::ui::styles::ManagarrStyle;
use crate::ui::utils::{layout_paragraph_borderless, title_block_centered};
use crate::ui::widgets::button::Button;
use crate::ui::widgets::checkbox::Checkbox;
use crate::ui::widgets::input_box::InputBox;
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_selectable_list, draw_text_box_with_label, DrawUi, LabeledTextBoxProps,
draw_drop_down_popup, draw_large_popup_over_background_fn_with_ui, draw_medium_popup_over,
draw_popup, draw_selectable_list, DrawUi,
};
#[cfg(test)]
@@ -126,12 +130,9 @@ fn draw_edit_collection_confirmation_prompt(f: &mut Frame<'_>, app: &mut App<'_>
search_on_add,
path,
} = app.data.radarr_data.edit_collection_modal.as_ref().unwrap();
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), area);
let [paragraph_area, monitored_area, min_availability_area, quality_profile_area, root_folder_area, search_on_add_area, _, buttons_area] =
Layout::vertical([
Constraint::Length(6),
@@ -145,63 +146,52 @@ fn draw_edit_collection_confirmation_prompt(f: &mut Frame<'_>, app: &mut App<'_>
])
.margin(1)
.areas(area);
let prompt_paragraph = layout_paragraph_borderless(&collection_overview);
f.render_widget(prompt_paragraph, paragraph_area);
let [save_area, cancel_area] =
Layout::horizontal([Constraint::Percentage(50), Constraint::Percentage(50)])
.areas(buttons_area);
draw_checkbox_with_label(
f,
monitored_area,
"Monitored",
monitored.unwrap_or_default(),
selected_block == &ActiveRadarrBlock::EditCollectionToggleMonitored,
);
draw_drop_down_menu_button(
f,
min_availability_area,
"Minimum Availability",
selected_minimum_availability.to_display_str(),
selected_block == &ActiveRadarrBlock::EditCollectionSelectMinimumAvailability,
);
draw_drop_down_menu_button(
f,
quality_profile_area,
"Quality Profile",
selected_quality_profile,
selected_block == &ActiveRadarrBlock::EditCollectionSelectQualityProfile,
);
let prompt_paragraph = layout_paragraph_borderless(&collection_overview);
let monitored_checkbox = Checkbox::new("Monitored")
.highlighted(selected_block == &ActiveRadarrBlock::EditCollectionToggleMonitored)
.checked(monitored.unwrap_or_default());
let min_availability_drop_down_button = Button::new()
.title(selected_minimum_availability.to_display_str())
.label("Minimum Availability")
.icon("")
.selected(selected_block == &ActiveRadarrBlock::EditCollectionSelectMinimumAvailability);
let quality_profile_drop_down_button = Button::new()
.title(selected_quality_profile)
.label("Quality Profile")
.icon("")
.selected(selected_block == &ActiveRadarrBlock::EditCollectionSelectQualityProfile);
if let Route::Radarr(active_radarr_block, _) = *app.get_current_route() {
draw_text_box_with_label(
f,
LabeledTextBoxProps {
area: root_folder_area,
label: "Root Folder",
text: &path.text,
offset: *path.offset.borrow(),
is_selected: selected_block == &ActiveRadarrBlock::EditCollectionRootFolderPathInput,
should_show_cursor: active_radarr_block
== ActiveRadarrBlock::EditCollectionRootFolderPathInput,
cursor_after_string: true,
},
);
let root_folder_input_box = InputBox::new(&path.text)
.offset(*path.offset.borrow())
.label("Root Folder")
.highlighted(selected_block == &ActiveRadarrBlock::EditCollectionRootFolderPathInput)
.selected(active_radarr_block == ActiveRadarrBlock::EditCollectionRootFolderPathInput);
render_selectable_input_box!(root_folder_input_box, f, root_folder_area);
}
draw_checkbox_with_label(
f,
search_on_add_area,
"Search on Add",
search_on_add.unwrap_or_default(),
selected_block == &ActiveRadarrBlock::EditCollectionToggleSearchOnAdd,
);
let search_on_add_checkbox = Checkbox::new("Search on Add")
.highlighted(selected_block == &ActiveRadarrBlock::EditCollectionToggleSearchOnAdd)
.checked(search_on_add.unwrap_or_default());
let save_button = Button::new()
.title("Save")
.selected(yes_no_value && highlight_yes_no);
let cancel_button = Button::new()
.title("Cancel")
.selected(!yes_no_value && highlight_yes_no);
draw_button(f, save_area, "Save", yes_no_value && highlight_yes_no);
draw_button(f, cancel_area, "Cancel", !yes_no_value && highlight_yes_no);
f.render_widget(title_block_centered(&title), area);
f.render_widget(prompt_paragraph, paragraph_area);
f.render_widget(monitored_checkbox, monitored_area);
f.render_widget(min_availability_drop_down_button, min_availability_area);
f.render_widget(quality_profile_drop_down_button, quality_profile_area);
f.render_widget(search_on_add_checkbox, search_on_add_area);
f.render_widget(save_button, save_area);
f.render_widget(cancel_button, cancel_area);
}
fn draw_edit_collection_select_minimum_availability_popup(