Progressbar (#25)

* Progressbar
* header
* label
* border
This commit is contained in:
Jens K.
2024-12-25 12:21:36 +01:00
committed by GitHub
parent acb627b1d7
commit ae1a48e5e8
6 changed files with 96 additions and 8 deletions

View File

@@ -393,12 +393,22 @@ impl Clock<Countdown> {
}
}
pub fn set_done(&mut self) {
fn set_done(&mut self) {
if self.current_value.is_zero() {
self.mode = Mode::Done;
}
}
pub fn get_percentage_done(&self) -> u16 {
let initial = self.initial_value.as_millis();
let elapsed = self
.initial_value
.saturating_sub(self.current_value)
.as_millis();
(elapsed * 100 / initial) as u16
}
pub fn edit_next(&mut self) {
self.edit_mode_next();
}

View File

@@ -36,7 +36,7 @@ impl Widget for Footer {
.title(
format! {"[m]enu {:} ", if self.show_menu {scrollbar::VERTICAL.end} else {scrollbar::VERTICAL.begin}},
)
.border_set(border::DOUBLE)
.border_set(border::PLAIN)
.render(border_area, buf);
// show menu
if self.show_menu {

22
src/widgets/header.rs Normal file
View File

@@ -0,0 +1,22 @@
use ratatui::{
buffer::Buffer,
layout::Rect,
widgets::{Block, Borders, Widget},
};
use crate::widgets::progressbar::Progressbar;
#[derive(Debug, Clone)]
pub struct Header {
pub percentage: Option<u16>,
}
impl Widget for Header {
fn render(self, area: Rect, buf: &mut Buffer) {
if let Some(percentage) = self.percentage {
Progressbar::new(percentage).render(area, buf);
} else {
Block::new().borders(Borders::TOP).render(area, buf);
}
}
}

View File

@@ -0,0 +1,39 @@
use ratatui::{
buffer::Buffer,
layout::{Constraint, Layout, Rect},
symbols::line,
text::Span,
widgets::Widget,
};
#[derive(Debug, Clone)]
pub struct Progressbar {
pub percentage: u16,
}
impl Progressbar {
pub fn new(percentage: u16) -> Self {
Self { percentage }
}
}
impl Widget for Progressbar {
fn render(self, area: Rect, buf: &mut Buffer) {
let label = Span::raw(format!(" {}% ", self.percentage));
let [h0, area] = Layout::horizontal([
Constraint::Length(label.width() as u16),
Constraint::Percentage(100),
])
.areas(area);
let [h1, h2] =
Layout::horizontal([Constraint::Percentage(self.percentage), Constraint::Fill(0)])
.areas(area);
// label
label.render(h0, buf);
// done
Span::from(line::THICK_HORIZONTAL.repeat(h1.width as usize)).render(h1, buf);
// rest
Span::from(line::HORIZONTAL.repeat(h2.width as usize)).render(h2, buf);
}
}