From d856e84b93c8fb13ca59fb6f162a2a960f08b080 Mon Sep 17 00:00:00 2001 From: Dark-Alex-17 Date: Tue, 8 Aug 2023 10:50:04 -0600 Subject: [PATCH] Added downloads info box to context and increased network API refresh calls to every 15 seconds --- src/app/mod.rs | 2 +- src/ui/mod.rs | 22 +++--------- src/ui/radarr_ui.rs | 88 +++++++++++++++++++++++++++++++-------------- src/ui/utils.rs | 14 ++++++-- 4 files changed, 78 insertions(+), 48 deletions(-) diff --git a/src/app/mod.rs b/src/app/mod.rs index f0d3fc9..8e81f0c 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -126,7 +126,7 @@ impl Default for App { title: "Managarr", tick_until_poll: 20, tick_count: 0, - network_tick_frequency: Duration::from_secs(5), + network_tick_frequency: Duration::from_secs(10), last_tick: Instant::now(), is_loading: false, is_routing: false, diff --git a/src/ui/mod.rs b/src/ui/mod.rs index 32ebb01..3acb9be 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -21,7 +21,7 @@ static HIGHLIGHT_SYMBOL: &str = "=> "; pub fn ui(f: &mut Frame, app: &mut App) { let main_chunks = vertical_chunks_with_margin( - vec![Constraint::Length(20), Constraint::Length(0)], + vec![Constraint::Length(16), Constraint::Length(0)], f.size(), 1, ); @@ -89,23 +89,9 @@ pub fn draw_large_popup_over( } fn draw_context_row(f: &mut Frame<'_, B>, app: &App, area: Rect) { - let chunks = horizontal_chunks( - vec![ - Constraint::Percentage(23), - Constraint::Percentage(23), - Constraint::Percentage(23), - Constraint::Percentage(23), - Constraint::Length(20), - ], - area, - ); - - radarr_ui::draw_stats(f, app, chunks[0]); - f.render_widget(Block::default().borders(Borders::ALL), chunks[1]); - f.render_widget(Block::default().borders(Borders::ALL), chunks[2]); - f.render_widget(Block::default().borders(Borders::ALL), chunks[3]); - - radarr_ui::draw_logo(f, chunks[4]); + match app.get_current_route().clone() { + Route::Radarr(_) => radarr_ui::draw_radarr_context_row(f, app, area), + } } pub fn loading(f: &mut Frame<'_, B>, block: Block<'_>, area: Rect, is_loading: bool) { diff --git a/src/ui/radarr_ui.rs b/src/ui/radarr_ui.rs index 32ff2d2..b761300 100644 --- a/src/ui/radarr_ui.rs +++ b/src/ui/radarr_ui.rs @@ -1,21 +1,21 @@ +use std::iter; use std::ops::Sub; use chrono::{Duration, Utc}; -use log::debug; use tui::backend::Backend; use tui::layout::{Alignment, Constraint, Rect}; use tui::style::{Color, Modifier, Style}; use tui::text::{Span, Spans, Text}; -use tui::widgets::{Block, Borders, Cell, LineGauge, Paragraph, Row, Table, Wrap}; -use tui::{symbols, Frame}; +use tui::widgets::{Block, Borders, Cell, Paragraph, Row, Table, Wrap}; +use tui::Frame; use crate::app::radarr::RadarrData; use crate::app::App; use crate::logos::RADARR_LOGO; -use crate::network::radarr_network::Movie; +use crate::network::radarr_network::{DownloadRecord, Movie}; use crate::ui::utils::{ - style_default, style_highlight, style_primary, style_secondary, style_tertiary, title_block, - vertical_chunks, vertical_chunks_with_margin, + horizontal_chunks_with_margin, line_gague, style_default, style_highlight, style_primary, + style_secondary, style_tertiary, title_block, vertical_chunks_with_margin, }; use crate::ui::{loading, HIGHLIGHT_SYMBOL}; use crate::utils::{convert_runtime, convert_to_gb}; @@ -80,6 +80,52 @@ pub(super) fn draw_radarr_ui(f: &mut Frame<'_, B>, app: &mut App, ar } } +pub(super) fn draw_radarr_context_row(f: &mut Frame<'_, B>, app: &App, area: Rect) { + let chunks = horizontal_chunks_with_margin( + vec![ + Constraint::Ratio(1, 3), + Constraint::Ratio(1, 3), + Constraint::Ratio(1, 3), + ], + area, + 1, + ); + + draw_stats(f, app, chunks[0]); + f.render_widget(Block::default().borders(Borders::ALL), chunks[1]); + draw_downloads(f, app, chunks[2]); +} + +pub(super) fn draw_downloads(f: &mut Frame<'_, B>, app: &App, area: Rect) { + let block = title_block("Downloads"); + let downloads_vec = &app.data.radarr_data.downloads.items; + + if !downloads_vec.is_empty() { + f.render_widget(block, area); + + let constraints = iter::repeat(Constraint::Min(2)) + .take(downloads_vec.len()) + .collect::>(); + + let chunks = vertical_chunks_with_margin(constraints, area, 1); + + for i in 0..downloads_vec.len() { + let DownloadRecord { + title, + sizeleft, + size, + .. + } = &downloads_vec[i]; + let percent = 1f64 - (sizeleft.as_f64().unwrap() / size.as_f64().unwrap()); + let download_gague = line_gague(title, percent); + + f.render_widget(download_gague, chunks[i]); + } + } else { + loading(f, block, area, app.is_loading); + } +} + pub(super) fn draw_movie_details(f: &mut Frame<'_, B>, app: &App, area: Rect) { let block = title_block("Movie Details"); let movie_details = app.data.radarr_data.movie_details.get_text(); @@ -129,6 +175,7 @@ pub(super) fn draw_stats(f: &mut Frame<'_, B>, app: &App, area: Rect let chunks = vertical_chunks_with_margin( vec![ + Constraint::Percentage(60), Constraint::Length(1), Constraint::Length(1), Constraint::Min(2), @@ -163,33 +210,20 @@ pub(super) fn draw_stats(f: &mut Frame<'_, B>, app: &App, area: Rect ))) .block(Block::default()); - let space_gauge = LineGauge::default() - .block(Block::default().title("Storage:")) - .gauge_style(Style::default().fg(Color::Cyan)) - .line_set(symbols::line::THICK) - .ratio(ratio) - .label(Spans::from(format!("{:.0}%", ratio * 100.0))); + let space_gauge = line_gague("Storage:", ratio); + let logo = Paragraph::new(Text::from(RADARR_LOGO)) + .block(Block::default()) + .alignment(Alignment::Center); - f.render_widget(version_paragraph, chunks[0]); - f.render_widget(uptime_paragraph, chunks[1]); - f.render_widget(space_gauge, chunks[2]); + f.render_widget(logo, chunks[0]); + f.render_widget(version_paragraph, chunks[1]); + f.render_widget(uptime_paragraph, chunks[2]); + f.render_widget(space_gauge, chunks[3]); } else { loading(f, block, area, app.is_loading); } } -pub(super) fn draw_logo(f: &mut Frame<'_, B>, area: Rect) { - let chunks = vertical_chunks( - vec![Constraint::Percentage(60), Constraint::Percentage(40)], - area, - ); - let logo = Paragraph::new(Text::from(RADARR_LOGO)) - .block(Block::default()) - .alignment(Alignment::Center); - - f.render_widget(logo, chunks[0]); -} - fn determine_row_style(app: &App, movie: &Movie) -> Style { let downloads_vec = &app.data.radarr_data.downloads.items; diff --git a/src/ui/utils.rs b/src/ui/utils.rs index ea400ec..d81eaa0 100644 --- a/src/ui/utils.rs +++ b/src/ui/utils.rs @@ -1,7 +1,8 @@ use tui::layout::{Constraint, Direction, Layout, Rect}; use tui::style::{Color, Modifier, Style}; -use tui::text::Span; -use tui::widgets::{Block, Borders}; +use tui::symbols; +use tui::text::{Span, Spans}; +use tui::widgets::{Block, Borders, LineGauge}; pub fn horizontal_chunks(constraints: Vec, size: Rect) -> Vec { Layout::default() @@ -114,3 +115,12 @@ pub fn centered_rect(percent_x: u16, percent_y: u16, r: Rect) -> Rect { ) .split(popup_layout[1])[1] } + +pub fn line_gague(title: &str, ratio: f64) -> LineGauge { + LineGauge::default() + .block(Block::default().title(title)) + .gauge_style(Style::default().fg(Color::Cyan)) + .line_set(symbols::line::THICK) + .ratio(ratio) + .label(Spans::from(format!("{:.0}%", ratio * 100.0))) +}