Feat: optimizations
This commit is contained in:
@@ -4,6 +4,7 @@ use ratatui::style::{Color, Modifier, Style};
|
||||
use ratatui::text::{Line as RLine, Span};
|
||||
use ratatui::widgets::{Block, Borders, List, ListItem, Padding, Paragraph, Wrap};
|
||||
use ratatui::Frame;
|
||||
#[cfg(not(feature = "desktop"))]
|
||||
use tui_big_text::{BigText, PixelSize};
|
||||
|
||||
use crate::app::App;
|
||||
@@ -173,7 +174,10 @@ fn render_topics(frame: &mut Frame, app: &App, area: Rect) {
|
||||
}
|
||||
|
||||
const WELCOME_TOPIC: usize = 0;
|
||||
#[cfg(not(feature = "desktop"))]
|
||||
const BIG_TITLE_HEIGHT: u16 = 6;
|
||||
#[cfg(feature = "desktop")]
|
||||
const BIG_TITLE_HEIGHT: u16 = 3;
|
||||
|
||||
fn render_content(frame: &mut Frame, app: &App, area: Rect) {
|
||||
let theme = theme::get();
|
||||
@@ -186,19 +190,34 @@ fn render_content(frame: &mut Frame, app: &App, area: Rect) {
|
||||
let [title_area, rest] =
|
||||
Layout::vertical([Constraint::Length(BIG_TITLE_HEIGHT), Constraint::Fill(1)])
|
||||
.areas(area);
|
||||
|
||||
#[cfg(not(feature = "desktop"))]
|
||||
let big_title = BigText::builder()
|
||||
.pixel_size(PixelSize::Quadrant)
|
||||
.style(Style::new().fg(theme.markdown.h1).bold())
|
||||
.lines(vec!["CAGIRE".into()])
|
||||
.centered()
|
||||
.build();
|
||||
#[cfg(feature = "desktop")]
|
||||
let big_title = Paragraph::new(RLine::from(Span::styled(
|
||||
"CAGIRE",
|
||||
Style::new().fg(theme.markdown.h1).bold(),
|
||||
)))
|
||||
.alignment(ratatui::layout::Alignment::Center);
|
||||
|
||||
let subtitle = Paragraph::new(RLine::from(Span::styled(
|
||||
"A Forth Sequencer",
|
||||
Style::new().fg(theme.ui.text_primary),
|
||||
)))
|
||||
.alignment(ratatui::layout::Alignment::Center);
|
||||
|
||||
#[cfg(not(feature = "desktop"))]
|
||||
let [big_area, subtitle_area] =
|
||||
Layout::vertical([Constraint::Length(4), Constraint::Length(2)]).areas(title_area);
|
||||
#[cfg(feature = "desktop")]
|
||||
let [big_area, subtitle_area] =
|
||||
Layout::vertical([Constraint::Length(1), Constraint::Length(2)]).areas(title_area);
|
||||
|
||||
frame.render_widget(big_title, big_area);
|
||||
frame.render_widget(subtitle, subtitle_area);
|
||||
rest
|
||||
|
||||
@@ -212,10 +212,10 @@ pub fn highlight_line_with_runtime(
|
||||
|
||||
let is_selected = selected_spans
|
||||
.iter()
|
||||
.any(|span| overlaps(token.start, token.end, span.start, span.end));
|
||||
.any(|span| overlaps(token.start, token.end, span.start as usize, span.end as usize));
|
||||
let is_executed = executed_spans
|
||||
.iter()
|
||||
.any(|span| overlaps(token.start, token.end, span.start, span.end));
|
||||
.any(|span| overlaps(token.start, token.end, span.start as usize, span.end as usize));
|
||||
|
||||
let mut style = token.kind.style();
|
||||
if token.varargs {
|
||||
|
||||
@@ -196,7 +196,7 @@ fn render_tile(
|
||||
};
|
||||
|
||||
let link_color = step.and_then(|s| s.source).map(|src| {
|
||||
let i = src % 5;
|
||||
let i = src as usize % 5;
|
||||
(theme.tile.link_bright[i], theme.tile.link_dim[i])
|
||||
});
|
||||
|
||||
@@ -236,7 +236,7 @@ fn render_tile(
|
||||
|
||||
// For linked steps, get the name from the source step
|
||||
let step_name = if let Some(src) = source_idx {
|
||||
pattern.step(src).and_then(|s| s.name.as_ref())
|
||||
pattern.step(src as usize).and_then(|s| s.name.as_ref())
|
||||
} else {
|
||||
step.and_then(|s| s.name.as_ref())
|
||||
};
|
||||
|
||||
@@ -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,
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user