Fix layout
This commit is contained in:
73
crates/ratatui/src/active_patterns.rs
Normal file
73
crates/ratatui/src/active_patterns.rs
Normal file
@@ -0,0 +1,73 @@
|
||||
use crate::theme;
|
||||
use ratatui::buffer::Buffer;
|
||||
use ratatui::layout::Rect;
|
||||
use ratatui::widgets::Widget;
|
||||
|
||||
pub struct ActivePatterns<'a> {
|
||||
patterns: &'a [(usize, usize, usize)], // (bank, pattern, iter)
|
||||
current_step: Option<(usize, usize)>, // (current_step, total_steps)
|
||||
}
|
||||
|
||||
impl<'a> ActivePatterns<'a> {
|
||||
pub fn new(patterns: &'a [(usize, usize, usize)]) -> Self {
|
||||
Self {
|
||||
patterns,
|
||||
current_step: None,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn with_step(mut self, current: usize, total: usize) -> Self {
|
||||
self.current_step = Some((current, total));
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
impl Widget for ActivePatterns<'_> {
|
||||
fn render(self, area: Rect, buf: &mut Buffer) {
|
||||
if area.width < 10 || area.height == 0 {
|
||||
return;
|
||||
}
|
||||
let theme = theme::get();
|
||||
|
||||
let max_pattern_rows = if self.current_step.is_some() {
|
||||
area.height.saturating_sub(1) as usize
|
||||
} else {
|
||||
area.height as usize
|
||||
};
|
||||
|
||||
for (row, &(bank, pattern, iter)) in self.patterns.iter().enumerate() {
|
||||
if row >= max_pattern_rows {
|
||||
break;
|
||||
}
|
||||
let text = format!("B{:02}:{:02} ({:02})", bank + 1, pattern + 1, iter.min(99));
|
||||
let y = area.y + row as u16;
|
||||
let bg = if row % 2 == 0 {
|
||||
theme.table.row_even
|
||||
} else {
|
||||
theme.table.row_odd
|
||||
};
|
||||
|
||||
let mut chars = text.chars();
|
||||
for col in 0..area.width as usize {
|
||||
let ch = chars.next().unwrap_or(' ');
|
||||
buf[(area.x + col as u16, y)]
|
||||
.set_char(ch)
|
||||
.set_fg(theme.ui.text_primary)
|
||||
.set_bg(bg);
|
||||
}
|
||||
}
|
||||
|
||||
if let Some((current, total)) = self.current_step {
|
||||
let text = format!("{:02}/{:02}", current + 1, total);
|
||||
let y = area.y + area.height.saturating_sub(1);
|
||||
let mut chars = text.chars();
|
||||
for col in 0..area.width as usize {
|
||||
let ch = chars.next().unwrap_or(' ');
|
||||
buf[(area.x + col as u16, y)]
|
||||
.set_char(ch)
|
||||
.set_fg(theme.ui.text_primary)
|
||||
.set_bg(theme.table.row_even);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,3 +1,4 @@
|
||||
mod active_patterns;
|
||||
mod confirm;
|
||||
mod editor;
|
||||
mod file_browser;
|
||||
@@ -12,6 +13,7 @@ mod text_input;
|
||||
pub mod theme;
|
||||
mod vu_meter;
|
||||
|
||||
pub use active_patterns::ActivePatterns;
|
||||
pub use confirm::ConfirmModal;
|
||||
pub use editor::{CompletionCandidate, Editor};
|
||||
pub use file_browser::FileBrowserModal;
|
||||
|
||||
Reference in New Issue
Block a user