diff --git a/src/ui/mod.rs b/src/ui/mod.rs index 23ad13b..cf85b9d 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -19,6 +19,7 @@ use crate::ui::styles::ManagarrStyle; use crate::ui::theme::Theme; use crate::ui::utils::{ background_block, borderless_block, centered_rect, logo_block, title_block, title_block_centered, + unstyled_title_block, }; use crate::ui::widgets::input_box::InputBox; use crate::ui::widgets::popup::Size; @@ -106,7 +107,9 @@ fn draw_header_row(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { } fn draw_error(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { - let block = title_block("Error | to close").failure().bold(); + let block = unstyled_title_block("Error | to close") + .failure() + .bold(); app.error.scroll_left_or_reset( area.width as usize, @@ -136,7 +139,7 @@ pub fn draw_popup( fn draw_tabs(f: &mut Frame<'_>, area: Rect, title: &str, tab_state: &TabState) -> Rect { if title.is_empty() { - f.render_widget(layout_block(), area); + f.render_widget(layout_block().default(), area); } else { f.render_widget(title_block(title), area); } diff --git a/src/ui/radarr_ui/collections/edit_collection_ui.rs b/src/ui/radarr_ui/collections/edit_collection_ui.rs index 54bab3a..5e781cf 100644 --- a/src/ui/radarr_ui/collections/edit_collection_ui.rs +++ b/src/ui/radarr_ui/collections/edit_collection_ui.rs @@ -88,6 +88,7 @@ fn draw_edit_collection_confirmation_prompt(f: &mut Frame<'_>, app: &mut App<'_> .clone() .unwrap_or_default(); let title = format!("Edit - {collection_title}"); + f.render_widget(title_block_centered(&title), area); 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; @@ -155,7 +156,6 @@ fn draw_edit_collection_confirmation_prompt(f: &mut Frame<'_>, app: &mut App<'_> .title("Cancel") .selected(!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); diff --git a/src/ui/radarr_ui/indexers/edit_indexer_ui.rs b/src/ui/radarr_ui/indexers/edit_indexer_ui.rs index 68724e2..a4a2282 100644 --- a/src/ui/radarr_ui/indexers/edit_indexer_ui.rs +++ b/src/ui/radarr_ui/indexers/edit_indexer_ui.rs @@ -49,6 +49,7 @@ fn draw_edit_indexer_prompt(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { let help_paragraph = Paragraph::new(help_text).centered(); if edit_indexer_modal_option.is_some() { + f.render_widget(block, area); let edit_indexer_modal = edit_indexer_modal_option.as_ref().unwrap(); let [_, settings_area, _, buttons_area, help_area] = Layout::vertical([ @@ -163,7 +164,6 @@ fn draw_edit_indexer_prompt(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { .title("Cancel") .selected(!yes_no_value && highlight_yes_no); - f.render_widget(block, area); f.render_widget(rss_checkbox, rss_area); f.render_widget(auto_search_checkbox, auto_search_area); f.render_widget(interactive_search_checkbox, interactive_search_area); diff --git a/src/ui/radarr_ui/indexers/indexer_settings_ui.rs b/src/ui/radarr_ui/indexers/indexer_settings_ui.rs index 3dd1972..0c2fe2e 100644 --- a/src/ui/radarr_ui/indexers/indexer_settings_ui.rs +++ b/src/ui/radarr_ui/indexers/indexer_settings_ui.rs @@ -56,6 +56,7 @@ fn draw_edit_indexer_settings_prompt(f: &mut Frame<'_>, app: &mut App<'_>, area: let help_paragraph = Paragraph::new(help_text).centered(); if indexer_settings_option.is_some() { + f.render_widget(block, area); let indexer_settings = indexer_settings_option.as_ref().unwrap(); let [_, settings_area, _, buttons_area, help_area] = Layout::vertical([ @@ -162,7 +163,6 @@ fn draw_edit_indexer_settings_prompt(f: &mut Frame<'_>, app: &mut App<'_>, area: .title("Cancel") .selected(!yes_no_value && highlight_yes_no); - f.render_widget(block, area); f.render_widget(prefer_indexer_flags_checkbox, prefer_flags_area); f.render_widget(allow_hardcoded_subs_checkbox, allow_hardcoded_subs_area); f.render_widget(save_button, save_area); diff --git a/src/ui/radarr_ui/indexers/test_all_indexers_ui.rs b/src/ui/radarr_ui/indexers/test_all_indexers_ui.rs index f7adc0d..9dcb983 100644 --- a/src/ui/radarr_ui/indexers/test_all_indexers_ui.rs +++ b/src/ui/radarr_ui/indexers/test_all_indexers_ui.rs @@ -4,7 +4,7 @@ use crate::models::servarr_data::modals::IndexerTestResultModalItem; use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; use crate::models::Route; use crate::ui::styles::ManagarrStyle; -use crate::ui::utils::{borderless_block, get_width_from_percentage, title_block}; +use crate::ui::utils::{get_width_from_percentage, title_block}; use crate::ui::widgets::managarr_table::ManagarrTable; use crate::ui::widgets::popup::Size; use crate::ui::{draw_popup, DrawUi}; @@ -71,7 +71,6 @@ fn draw_test_all_indexers_test_results(f: &mut Frame<'_>, app: &mut App<'_>, are app.data.radarr_data.indexer_test_all_results.as_mut(), test_results_row_mapping, ) - .block(borderless_block()) .loading(is_loading) .footer(Some(help_footer)) .footer_alignment(Alignment::Center) diff --git a/src/ui/radarr_ui/library/add_movie_ui.rs b/src/ui/radarr_ui/library/add_movie_ui.rs index a7e4608..9032eb3 100644 --- a/src/ui/radarr_ui/library/add_movie_ui.rs +++ b/src/ui/radarr_ui/library/add_movie_ui.rs @@ -170,7 +170,7 @@ fn draw_add_movie_search(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { .centered(); search_box.show_cursor(f, search_box_area); - f.render_widget(layout_block(), results_area); + f.render_widget(layout_block().default(), results_area); f.render_widget(search_box, search_box_area); f.render_widget(help_paragraph, help_area); } @@ -182,7 +182,7 @@ fn draw_add_movie_search(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { let error_message = Message::new("No movies found matching your query!"); let error_message_popup = Popup::new(error_message).size(Size::Message); - f.render_widget(layout_block(), results_area); + f.render_widget(layout_block().default(), results_area); f.render_widget(error_message_popup, f.area()); f.render_widget(help_paragraph, help_area); } @@ -204,7 +204,7 @@ fn draw_add_movie_search(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { search_results_row_mapping, ) .loading(is_loading) - .block(layout_block()) + .block(layout_block().default()) .headers([ "✔", "Title", diff --git a/src/ui/radarr_ui/library/edit_movie_ui.rs b/src/ui/radarr_ui/library/edit_movie_ui.rs index 18fc10c..cb4974c 100644 --- a/src/ui/radarr_ui/library/edit_movie_ui.rs +++ b/src/ui/radarr_ui/library/edit_movie_ui.rs @@ -80,6 +80,7 @@ fn draw_edit_movie_confirmation_prompt(f: &mut Frame<'_>, app: &mut App<'_>, are .overview .clone(); let title = format!("Edit - {movie_title}"); + f.render_widget(title_block_centered(&title), area); 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; @@ -157,7 +158,6 @@ fn draw_edit_movie_confirmation_prompt(f: &mut Frame<'_>, app: &mut App<'_>, are .title("Cancel") .selected(!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); diff --git a/src/ui/radarr_ui/system/system_details_ui.rs b/src/ui/radarr_ui/system/system_details_ui.rs index 4245d20..bf29a86 100644 --- a/src/ui/radarr_ui/system/system_details_ui.rs +++ b/src/ui/radarr_ui/system/system_details_ui.rs @@ -105,7 +105,6 @@ fn draw_tasks_popup(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { .primary() }; let tasks_table = ManagarrTable::new(Some(&mut app.data.radarr_data.tasks), tasks_row_mapping) - .block(borderless_block()) .loading(app.is_loading) .margin(1) .footer(help_footer) diff --git a/src/ui/sonarr_ui/indexers/edit_indexer_ui.rs b/src/ui/sonarr_ui/indexers/edit_indexer_ui.rs index 2042890..5606eeb 100644 --- a/src/ui/sonarr_ui/indexers/edit_indexer_ui.rs +++ b/src/ui/sonarr_ui/indexers/edit_indexer_ui.rs @@ -49,6 +49,7 @@ fn draw_edit_indexer_prompt(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { let help_paragraph = Paragraph::new(help_text).centered(); if edit_indexer_modal_option.is_some() { + f.render_widget(block, area); let edit_indexer_modal = edit_indexer_modal_option.as_ref().unwrap(); let [_, settings_area, _, buttons_area, help_area] = Layout::vertical([ @@ -163,7 +164,6 @@ fn draw_edit_indexer_prompt(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { .title("Cancel") .selected(!yes_no_value && highlight_yes_no); - f.render_widget(block, area); f.render_widget(rss_checkbox, rss_area); f.render_widget(auto_search_checkbox, auto_search_area); f.render_widget(interactive_search_checkbox, interactive_search_area); diff --git a/src/ui/sonarr_ui/indexers/indexer_settings_ui.rs b/src/ui/sonarr_ui/indexers/indexer_settings_ui.rs index 4d284aa..969a799 100644 --- a/src/ui/sonarr_ui/indexers/indexer_settings_ui.rs +++ b/src/ui/sonarr_ui/indexers/indexer_settings_ui.rs @@ -48,6 +48,7 @@ fn draw_edit_indexer_settings_prompt(f: &mut Frame<'_>, app: &mut App<'_>, area: let help_paragraph = Paragraph::new(help_text).centered(); if indexer_settings_option.is_some() { + f.render_widget(block, area); let indexer_settings = indexer_settings_option.as_ref().unwrap(); let [_, min_age_area, retention_area, max_size_area, rss_sync_area, _, buttons_area, help_area] = @@ -109,7 +110,6 @@ fn draw_edit_indexer_settings_prompt(f: &mut Frame<'_>, app: &mut App<'_>, area: .title("Cancel") .selected(!yes_no_value && highlight_yes_no); - f.render_widget(block, area); f.render_widget(save_button, save_area); f.render_widget(cancel_button, cancel_area); f.render_widget(help_paragraph, help_area); diff --git a/src/ui/sonarr_ui/indexers/test_all_indexers_ui.rs b/src/ui/sonarr_ui/indexers/test_all_indexers_ui.rs index 7bc3739..6876329 100644 --- a/src/ui/sonarr_ui/indexers/test_all_indexers_ui.rs +++ b/src/ui/sonarr_ui/indexers/test_all_indexers_ui.rs @@ -4,7 +4,7 @@ use crate::models::servarr_data::modals::IndexerTestResultModalItem; use crate::models::servarr_data::sonarr::sonarr_data::ActiveSonarrBlock; use crate::models::Route; use crate::ui::styles::ManagarrStyle; -use crate::ui::utils::{borderless_block, get_width_from_percentage, title_block}; +use crate::ui::utils::{get_width_from_percentage, title_block}; use crate::ui::widgets::managarr_table::ManagarrTable; use crate::ui::widgets::popup::Size; use crate::ui::{draw_popup, DrawUi}; @@ -69,7 +69,6 @@ fn draw_test_all_indexers_test_results(f: &mut Frame<'_>, app: &mut App<'_>, are app.data.sonarr_data.indexer_test_all_results.as_mut(), test_results_row_mapping, ) - .block(borderless_block()) .loading(is_loading) .footer(Some(help_footer)) .footer_alignment(Alignment::Center) diff --git a/src/ui/sonarr_ui/library/add_series_ui.rs b/src/ui/sonarr_ui/library/add_series_ui.rs index 34384d0..40335ae 100644 --- a/src/ui/sonarr_ui/library/add_series_ui.rs +++ b/src/ui/sonarr_ui/library/add_series_ui.rs @@ -156,7 +156,7 @@ fn draw_add_series_search(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { .centered(); search_box.show_cursor(f, search_box_area); - f.render_widget(layout_block(), results_area); + f.render_widget(layout_block().default(), results_area); f.render_widget(search_box, search_box_area); f.render_widget(help_paragraph, help_area); } @@ -168,7 +168,7 @@ fn draw_add_series_search(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { let error_message = Message::new("No series found matching your query!"); let error_message_popup = Popup::new(error_message).size(Size::Message); - f.render_widget(layout_block(), results_area); + f.render_widget(layout_block().default(), results_area); f.render_widget(error_message_popup, f.area()); f.render_widget(help_paragraph, help_area); } @@ -191,7 +191,7 @@ fn draw_add_series_search(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { search_results_row_mapping, ) .loading(is_loading) - .block(layout_block()) + .block(layout_block().default()) .headers([ "✔", "Title", "Year", "Network", "Seasons", "Rating", "Genres", ]) diff --git a/src/ui/sonarr_ui/library/edit_series_ui.rs b/src/ui/sonarr_ui/library/edit_series_ui.rs index 0b6fee4..5ea60e5 100644 --- a/src/ui/sonarr_ui/library/edit_series_ui.rs +++ b/src/ui/sonarr_ui/library/edit_series_ui.rs @@ -89,6 +89,8 @@ fn draw_edit_series_confirmation_prompt(f: &mut Frame<'_>, app: &mut App<'_>, ar .clone() .unwrap_or_default(); let title = format!("Edit - {series_title}"); + f.render_widget(title_block_centered(&title), area); + let yes_no_value = app.data.sonarr_data.prompt_confirm; let selected_block = app.data.sonarr_data.selected_block.get_active_block(); let highlight_yes_no = selected_block == ActiveSonarrBlock::EditSeriesConfirmPrompt; @@ -179,7 +181,6 @@ fn draw_edit_series_confirmation_prompt(f: &mut Frame<'_>, app: &mut App<'_>, ar .title("Cancel") .selected(!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(season_folder_checkbox, season_folder_area); diff --git a/src/ui/sonarr_ui/system/system_details_ui.rs b/src/ui/sonarr_ui/system/system_details_ui.rs index 72eafe2..bc12a21 100644 --- a/src/ui/sonarr_ui/system/system_details_ui.rs +++ b/src/ui/sonarr_ui/system/system_details_ui.rs @@ -104,7 +104,6 @@ fn draw_tasks_popup(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { .primary() }; let tasks_table = ManagarrTable::new(Some(&mut app.data.sonarr_data.tasks), tasks_row_mapping) - .block(borderless_block()) .loading(app.is_loading) .margin(1) .footer(help_footer) diff --git a/src/ui/utils.rs b/src/ui/utils.rs index db8c350..88f3514 100644 --- a/src/ui/utils.rs +++ b/src/ui/utils.rs @@ -24,7 +24,6 @@ pub fn background_block<'a>() -> Block<'a> { pub fn layout_block<'a>() -> Block<'a> { Block::new() - .default() .borders(Borders::ALL) .border_type(BorderType::Rounded) } @@ -70,16 +69,20 @@ pub fn title_style(title: &str) -> Span<'_> { format!(" {title} ").bold() } -pub fn title_block(title: &str) -> Block<'_> { +pub fn unstyled_title_block(title: &str) -> Block<'_> { layout_block_with_title(title_style(title)) } +pub fn title_block(title: &str) -> Block<'_> { + unstyled_title_block(title).default() +} + pub fn title_block_centered(title: &str) -> Block<'_> { title_block(title).title_alignment(Alignment::Center) } pub fn logo_block<'a>() -> Block<'a> { - layout_block().title(Span::styled( + layout_block().default().title(Span::styled( " Managarr - A Servarr management TUI ", Style::new().magenta().bold().italic(), )) diff --git a/src/ui/utils_tests.rs b/src/ui/utils_tests.rs index ea237ad..1bc077e 100644 --- a/src/ui/utils_tests.rs +++ b/src/ui/utils_tests.rs @@ -5,7 +5,7 @@ mod test { borderless_block, centered_rect, convert_to_minutes_hours_days, decorate_peer_style, get_width_from_percentage, layout_block, layout_block_bottom_border, layout_block_top_border, layout_block_top_border_with_title, layout_block_with_title, logo_block, style_block_highlight, - style_log_list_item, title_block, title_block_centered, title_style, + style_log_list_item, title_block, title_block_centered, title_style, unstyled_title_block, }; use pretty_assertions::{assert_eq, assert_str_eq}; use ratatui::layout::{Alignment, Rect}; @@ -19,7 +19,6 @@ mod test { assert_eq!( layout_block(), Block::new() - .default() .borders(Borders::ALL) .border_type(BorderType::Rounded) ); @@ -34,7 +33,6 @@ mod test { .add_modifier(Modifier::BOLD), ); let expected_block = Block::new() - .default() .borders(Borders::ALL) .border_type(BorderType::Rounded) .title(title_span.clone()); @@ -103,6 +101,19 @@ mod test { assert_eq!(title_style("test"), expected_span); } + #[test] + fn test_unstyled_title_block() { + let expected_block = Block::new() + .borders(Borders::ALL) + .border_type(BorderType::Rounded) + .title(Span::styled( + " test ", + Style::new().add_modifier(Modifier::BOLD), + )); + + assert_eq!(unstyled_title_block("test"), expected_block); + } + #[test] fn test_title_block() { let expected_block = Block::new() diff --git a/src/ui/widgets/managarr_table.rs b/src/ui/widgets/managarr_table.rs index 1b3db85..2b5e643 100644 --- a/src/ui/widgets/managarr_table.rs +++ b/src/ui/widgets/managarr_table.rs @@ -3,7 +3,9 @@ use super::message::Message; use super::popup::Size; use crate::models::stateful_table::StatefulTable; use crate::ui::styles::ManagarrStyle; -use crate::ui::utils::{centered_rect, layout_block_top_border, title_block_centered}; +use crate::ui::utils::{ + borderless_block, centered_rect, layout_block_top_border, title_block_centered, +}; use crate::ui::widgets::loading_block::LoadingBlock; use crate::ui::widgets::popup::Popup; use crate::ui::widgets::selectable_list::SelectableList; @@ -68,7 +70,7 @@ where row_mapper, footer: None, footer_alignment: Alignment::Left, - block: Block::new(), + block: borderless_block(), margin: 0, is_loading: false, highlight_rows: true, diff --git a/src/ui/widgets/managarr_table_tests.rs b/src/ui/widgets/managarr_table_tests.rs index 831cd57..f4178f7 100644 --- a/src/ui/widgets/managarr_table_tests.rs +++ b/src/ui/widgets/managarr_table_tests.rs @@ -3,11 +3,12 @@ mod tests { use crate::models::stateful_list::StatefulList; use crate::models::stateful_table::{SortOption, StatefulTable}; use crate::models::{HorizontallyScrollableText, Scrollable}; + use crate::ui::utils::borderless_block; use crate::ui::widgets::managarr_table::ManagarrTable; use pretty_assertions::assert_eq; use ratatui::layout::{Alignment, Constraint}; use ratatui::text::Text; - use ratatui::widgets::{Block, Cell, Row}; + use ratatui::widgets::{Cell, Row}; use std::sync::atomic::AtomicUsize; #[test] @@ -26,7 +27,7 @@ mod tests { assert_eq!(managarr_table.constraints, Vec::new()); assert_eq!(managarr_table.footer, None); assert_eq!(managarr_table.footer_alignment, Alignment::Left); - assert_eq!(managarr_table.block, Block::new()); + assert_eq!(managarr_table.block, borderless_block()); assert_eq!(managarr_table.margin, 0); assert!(!managarr_table.is_loading); assert!(managarr_table.highlight_rows); @@ -62,7 +63,7 @@ mod tests { assert_eq!(managarr_table.constraints, Vec::new()); assert_eq!(managarr_table.footer, None); assert_eq!(managarr_table.footer_alignment, Alignment::Left); - assert_eq!(managarr_table.block, Block::new()); + assert_eq!(managarr_table.block, borderless_block()); assert_eq!(managarr_table.margin, 0); assert!(!managarr_table.is_loading); assert!(managarr_table.highlight_rows); @@ -98,7 +99,7 @@ mod tests { assert_eq!(managarr_table.constraints, Vec::new()); assert_eq!(managarr_table.footer, None); assert_eq!(managarr_table.footer_alignment, Alignment::Left); - assert_eq!(managarr_table.block, Block::new()); + assert_eq!(managarr_table.block, borderless_block()); assert_eq!(managarr_table.margin, 0); assert!(!managarr_table.is_loading); assert!(managarr_table.highlight_rows); @@ -131,7 +132,7 @@ mod tests { assert_eq!(managarr_table.constraints, Vec::new()); assert_eq!(managarr_table.footer, None); assert_eq!(managarr_table.footer_alignment, Alignment::Left); - assert_eq!(managarr_table.block, Block::new()); + assert_eq!(managarr_table.block, borderless_block()); assert_eq!(managarr_table.margin, 0); assert!(!managarr_table.is_loading); assert!(managarr_table.highlight_rows); @@ -164,7 +165,7 @@ mod tests { assert_eq!(managarr_table.table_headers, Vec::::new()); assert_eq!(managarr_table.footer, None); assert_eq!(managarr_table.footer_alignment, Alignment::Left); - assert_eq!(managarr_table.block, Block::new()); + assert_eq!(managarr_table.block, borderless_block()); assert_eq!(managarr_table.margin, 0); assert!(!managarr_table.is_loading); assert!(managarr_table.highlight_rows);