@@ -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();
|
||||
}
|
||||
|
||||
@@ -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
22
src/widgets/header.rs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
39
src/widgets/progressbar.rs
Normal file
39
src/widgets/progressbar.rs
Normal 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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user