Added downloads info box to context and increased network API refresh calls to every 15 seconds

This commit is contained in:
2023-08-08 10:50:04 -06:00
parent ec980ea32c
commit d856e84b93
4 changed files with 78 additions and 48 deletions
+1 -1
View File
@@ -126,7 +126,7 @@ impl Default for App {
title: "Managarr", title: "Managarr",
tick_until_poll: 20, tick_until_poll: 20,
tick_count: 0, tick_count: 0,
network_tick_frequency: Duration::from_secs(5), network_tick_frequency: Duration::from_secs(10),
last_tick: Instant::now(), last_tick: Instant::now(),
is_loading: false, is_loading: false,
is_routing: false, is_routing: false,
+4 -18
View File
@@ -21,7 +21,7 @@ static HIGHLIGHT_SYMBOL: &str = "=> ";
pub fn ui<B: Backend>(f: &mut Frame<B>, app: &mut App) { pub fn ui<B: Backend>(f: &mut Frame<B>, app: &mut App) {
let main_chunks = vertical_chunks_with_margin( let main_chunks = vertical_chunks_with_margin(
vec![Constraint::Length(20), Constraint::Length(0)], vec![Constraint::Length(16), Constraint::Length(0)],
f.size(), f.size(),
1, 1,
); );
@@ -89,23 +89,9 @@ pub fn draw_large_popup_over<B: Backend>(
} }
fn draw_context_row<B: Backend>(f: &mut Frame<'_, B>, app: &App, area: Rect) { fn draw_context_row<B: Backend>(f: &mut Frame<'_, B>, app: &App, area: Rect) {
let chunks = horizontal_chunks( match app.get_current_route().clone() {
vec![ Route::Radarr(_) => radarr_ui::draw_radarr_context_row(f, app, area),
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]);
} }
pub fn loading<B: Backend>(f: &mut Frame<'_, B>, block: Block<'_>, area: Rect, is_loading: bool) { pub fn loading<B: Backend>(f: &mut Frame<'_, B>, block: Block<'_>, area: Rect, is_loading: bool) {
+60 -26
View File
@@ -1,21 +1,21 @@
use std::iter;
use std::ops::Sub; use std::ops::Sub;
use chrono::{Duration, Utc}; use chrono::{Duration, Utc};
use log::debug;
use tui::backend::Backend; use tui::backend::Backend;
use tui::layout::{Alignment, Constraint, Rect}; use tui::layout::{Alignment, Constraint, Rect};
use tui::style::{Color, Modifier, Style}; use tui::style::{Color, Modifier, Style};
use tui::text::{Span, Spans, Text}; use tui::text::{Span, Spans, Text};
use tui::widgets::{Block, Borders, Cell, LineGauge, Paragraph, Row, Table, Wrap}; use tui::widgets::{Block, Borders, Cell, Paragraph, Row, Table, Wrap};
use tui::{symbols, Frame}; use tui::Frame;
use crate::app::radarr::RadarrData; use crate::app::radarr::RadarrData;
use crate::app::App; use crate::app::App;
use crate::logos::RADARR_LOGO; use crate::logos::RADARR_LOGO;
use crate::network::radarr_network::Movie; use crate::network::radarr_network::{DownloadRecord, Movie};
use crate::ui::utils::{ use crate::ui::utils::{
style_default, style_highlight, style_primary, style_secondary, style_tertiary, title_block, horizontal_chunks_with_margin, line_gague, style_default, style_highlight, style_primary,
vertical_chunks, vertical_chunks_with_margin, style_secondary, style_tertiary, title_block, vertical_chunks_with_margin,
}; };
use crate::ui::{loading, HIGHLIGHT_SYMBOL}; use crate::ui::{loading, HIGHLIGHT_SYMBOL};
use crate::utils::{convert_runtime, convert_to_gb}; use crate::utils::{convert_runtime, convert_to_gb};
@@ -80,6 +80,52 @@ pub(super) fn draw_radarr_ui<B: Backend>(f: &mut Frame<'_, B>, app: &mut App, ar
} }
} }
pub(super) fn draw_radarr_context_row<B: Backend>(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<B: Backend>(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::<Vec<Constraint>>();
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<B: Backend>(f: &mut Frame<'_, B>, app: &App, area: Rect) { pub(super) fn draw_movie_details<B: Backend>(f: &mut Frame<'_, B>, app: &App, area: Rect) {
let block = title_block("Movie Details"); let block = title_block("Movie Details");
let movie_details = app.data.radarr_data.movie_details.get_text(); let movie_details = app.data.radarr_data.movie_details.get_text();
@@ -129,6 +175,7 @@ pub(super) fn draw_stats<B: Backend>(f: &mut Frame<'_, B>, app: &App, area: Rect
let chunks = vertical_chunks_with_margin( let chunks = vertical_chunks_with_margin(
vec![ vec![
Constraint::Percentage(60),
Constraint::Length(1), Constraint::Length(1),
Constraint::Length(1), Constraint::Length(1),
Constraint::Min(2), Constraint::Min(2),
@@ -163,31 +210,18 @@ pub(super) fn draw_stats<B: Backend>(f: &mut Frame<'_, B>, app: &App, area: Rect
))) )))
.block(Block::default()); .block(Block::default());
let space_gauge = LineGauge::default() let space_gauge = line_gague("Storage:", ratio);
.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)));
f.render_widget(version_paragraph, chunks[0]);
f.render_widget(uptime_paragraph, chunks[1]);
f.render_widget(space_gauge, chunks[2]);
} else {
loading(f, block, area, app.is_loading);
}
}
pub(super) fn draw_logo<B: Backend>(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)) let logo = Paragraph::new(Text::from(RADARR_LOGO))
.block(Block::default()) .block(Block::default())
.alignment(Alignment::Center); .alignment(Alignment::Center);
f.render_widget(logo, chunks[0]); 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);
}
} }
fn determine_row_style(app: &App, movie: &Movie) -> Style { fn determine_row_style(app: &App, movie: &Movie) -> Style {
+12 -2
View File
@@ -1,7 +1,8 @@
use tui::layout::{Constraint, Direction, Layout, Rect}; use tui::layout::{Constraint, Direction, Layout, Rect};
use tui::style::{Color, Modifier, Style}; use tui::style::{Color, Modifier, Style};
use tui::text::Span; use tui::symbols;
use tui::widgets::{Block, Borders}; use tui::text::{Span, Spans};
use tui::widgets::{Block, Borders, LineGauge};
pub fn horizontal_chunks(constraints: Vec<Constraint>, size: Rect) -> Vec<Rect> { pub fn horizontal_chunks(constraints: Vec<Constraint>, size: Rect) -> Vec<Rect> {
Layout::default() Layout::default()
@@ -114,3 +115,12 @@ pub fn centered_rect(percent_x: u16, percent_y: u16, r: Rect) -> Rect {
) )
.split(popup_layout[1])[1] .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)))
}