feat: center and split

This commit is contained in:
Christoph J. Scherr 2024-07-09 12:12:03 +02:00 committed by PlexSheep
parent da29f6796c
commit 7f81f884e4
1 changed files with 55 additions and 18 deletions

View File

@ -1,14 +1,20 @@
use ratatui::crossterm::{ use chrono::SubsecRound;
event::{self, DisableMouseCapture, EnableMouseCapture, Event, KeyCode, KeyModifiers},
execute,
terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen},
};
use ratatui::{ use ratatui::{
backend::CrosstermBackend, backend::CrosstermBackend,
crossterm::event::poll,
layout::{Constraint, Direction, Layout, Rect},
widgets::{Block, Borders}, widgets::{Block, Borders},
Terminal, Terminal,
}; };
use std::io; use ratatui::{
crossterm::{
event::{self, DisableMouseCapture, EnableMouseCapture, Event, KeyCode, KeyModifiers},
execute,
terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen},
},
style::Stylize,
};
use std::{io, time::Duration};
const TITLE: &str = "Crock"; const TITLE: &str = "Crock";
@ -21,23 +27,29 @@ fn main() -> Result<(), io::Error> {
let mut terminal = Terminal::new(backend)?; let mut terminal = Terminal::new(backend)?;
loop { loop {
let time = chrono::Utc::now().round_subsecs(0);
terminal.draw(|f| { terminal.draw(|f| {
let size = f.size(); let w = ratatui::widgets::Paragraph::new(format!(
let block = Block::default().title(TITLE).borders(Borders::ALL); "{}\n\n{}",
let inner = block.inner(size); time.time(),
f.render_widget(block, size); time.date_naive()
let w = ratatui::widgets::Paragraph::new(format!("{}", chrono::Utc::now())); ))
f.render_widget(w, inner); .centered()
.red();
f.render_widget(w, centered_rect(f.size(), 40, 20));
})?; })?;
if poll(Duration::from_millis(100))? {
if let Event::Key(key) = event::read()? { if let Event::Key(key) = event::read()? {
if key.code == KeyCode::Char('q') if key.code == KeyCode::Char('q')
|| key.code == KeyCode::Esc || key.code == KeyCode::Esc
|| (key.modifiers.contains(KeyModifiers::CONTROL) && key.code == KeyCode::Char('c')) || (key.modifiers.contains(KeyModifiers::CONTROL)
&& key.code == KeyCode::Char('c'))
{ {
break; break;
} }
} }
} }
}
// restore terminal // restore terminal
disable_raw_mode()?; disable_raw_mode()?;
@ -50,3 +62,28 @@ fn main() -> Result<(), io::Error> {
Ok(()) Ok(())
} }
/// # Usage
///
/// ```rust
/// let rect = centered_rect(f.size(), 50, 50);
/// ```
fn centered_rect(r: Rect, percent_x: u16, percent_y: u16) -> Rect {
let popup_layout = Layout::default()
.direction(Direction::Vertical)
.constraints([
Constraint::Percentage((100 - percent_y) / 2),
Constraint::Percentage(percent_y),
Constraint::Percentage((100 - percent_y) / 2),
])
.split(r);
Layout::default()
.direction(Direction::Horizontal)
.constraints([
Constraint::Percentage((100 - percent_x) / 2),
Constraint::Percentage(percent_x),
Constraint::Percentage((100 - percent_x) / 2),
])
.split(popup_layout[1])[1]
}