Feat: optimizations

This commit is contained in:
2026-02-05 23:15:46 +01:00
parent 5a83c4c1d1
commit 53167e35b6
22 changed files with 175 additions and 215 deletions

View File

@@ -3,7 +3,7 @@ use std::time::{Duration, Instant};
use ratatui::layout::{Alignment, Constraint, Layout, Rect};
use ratatui::style::{Modifier, Style};
use ratatui::text::{Line, Span};
use ratatui::widgets::{Block, Borders, Cell, Paragraph, Row, Table};
use ratatui::widgets::{Block, Borders, Cell, Padding, Paragraph, Row, Table};
use ratatui::Frame;
use crate::app::App;
@@ -28,15 +28,17 @@ fn adjust_spans_for_line(
line_start: usize,
line_len: usize,
) -> Vec<SourceSpan> {
let ls = line_start as u32;
let ll = line_len as u32;
spans
.iter()
.filter_map(|s| {
if s.end <= line_start || s.start >= line_start + line_len {
if s.end <= ls || s.start >= ls + ll {
return None;
}
Some(SourceSpan {
start: s.start.max(line_start) - line_start,
end: (s.end.min(line_start + line_len)) - line_start,
start: s.start.max(ls) - ls,
end: (s.end.min(ls + ll)) - ls,
})
})
.collect()
@@ -158,12 +160,8 @@ pub fn render(frame: &mut Frame, app: &App, link: &LinkState, snapshot: &Sequenc
}
}
fn header_height(width: u16) -> u16 {
if width >= 80 {
1
} else {
2
}
fn header_height(_width: u16) -> u16 {
3
}
fn render_side_panel(frame: &mut Frame, app: &App, area: Rect) {
@@ -231,35 +229,18 @@ fn render_header(
let bank = &app.project_state.project.banks[app.editor_ctx.bank];
let pattern = &bank.patterns[app.editor_ctx.pattern];
let (transport_area, live_area, tempo_area, bank_area, pattern_area, stats_area) =
if area.height == 1 {
let [t, l, tp, b, p, s] = Layout::horizontal([
Constraint::Min(12),
Constraint::Length(9),
Constraint::Min(14),
Constraint::Fill(1),
Constraint::Fill(2),
Constraint::Min(20),
])
.areas(area);
(t, l, tp, b, p, s)
} else {
let [line1, line2] =
Layout::vertical([Constraint::Length(1), Constraint::Length(1)]).areas(area);
let pad = Padding::vertical(1);
let [t, l, tp, s] = Layout::horizontal([
Constraint::Min(12),
Constraint::Length(9),
Constraint::Fill(1),
Constraint::Min(20),
])
.areas(line1);
let [b, p] =
Layout::horizontal([Constraint::Fill(1), Constraint::Fill(2)]).areas(line2);
(t, l, tp, b, p, s)
};
let [transport_area, live_area, tempo_area, bank_area, pattern_area, stats_area] =
Layout::horizontal([
Constraint::Min(12),
Constraint::Length(9),
Constraint::Min(14),
Constraint::Fill(1),
Constraint::Fill(2),
Constraint::Min(20),
])
.areas(area);
// Transport block
let (transport_bg, transport_text) = if app.playback.playing {
@@ -270,7 +251,7 @@ fn render_header(
let transport_style = Style::new().bg(transport_bg).fg(theme.ui.text_primary);
frame.render_widget(
Paragraph::new(transport_text)
.style(transport_style)
.block(Block::default().padding(pad).style(transport_style))
.alignment(Alignment::Center),
transport_area,
);
@@ -285,7 +266,7 @@ fn render_header(
let fill_style = Style::new().bg(theme.status.fill_bg).fg(fill_fg);
frame.render_widget(
Paragraph::new(if fill { "F" } else { "·" })
.style(fill_style)
.block(Block::default().padding(pad).style(fill_style))
.alignment(Alignment::Center),
live_area,
);
@@ -297,7 +278,7 @@ fn render_header(
.add_modifier(Modifier::BOLD);
frame.render_widget(
Paragraph::new(format!(" {:.1} BPM ", link.tempo()))
.style(tempo_style)
.block(Block::default().padding(pad).style(tempo_style))
.alignment(Alignment::Center),
tempo_area,
);
@@ -313,7 +294,7 @@ fn render_header(
.fg(theme.ui.text_primary);
frame.render_widget(
Paragraph::new(bank_name)
.style(bank_style)
.block(Block::default().padding(pad).style(bank_style))
.alignment(Alignment::Center),
bank_area,
);
@@ -346,7 +327,7 @@ fn render_header(
.fg(theme.ui.text_primary);
frame.render_widget(
Paragraph::new(pattern_text)
.style(pattern_style)
.block(Block::default().padding(pad).style(pattern_style))
.alignment(Alignment::Center),
pattern_area,
);
@@ -361,7 +342,7 @@ fn render_header(
.fg(theme.header.stats_fg);
frame.render_widget(
Paragraph::new(stats_text)
.style(stats_style)
.block(Block::default().padding(pad).style(stats_style))
.alignment(Alignment::Right),
stats_area,
);