diff --git a/src/engine/sequencer.rs b/src/engine/sequencer.rs index a3275b9..80029ad 100644 --- a/src/engine/sequencer.rs +++ b/src/engine/sequencer.rs @@ -538,6 +538,7 @@ impl SequencerState { }); } self.audio_state.pending_starts.clear(); + self.audio_state.prev_beat = -1.0; self.buf_audio_commands.clear(); TickOutput { audio_commands: std::mem::take(&mut self.buf_audio_commands), diff --git a/src/input.rs b/src/input.rs index 62b841e..d94e45e 100644 --- a/src/input.rs +++ b/src/input.rs @@ -893,7 +893,11 @@ fn handle_patterns_page(ctx: &mut InputContext, key: KeyEvent) -> InputResult { } } KeyCode::Enter => ctx.dispatch(AppCommand::PatternsEnter), - KeyCode::Char(' ') => ctx.dispatch(AppCommand::PatternsTogglePlay), + KeyCode::Char(' ') => { + if ctx.app.patterns_nav.column == PatternsColumn::Patterns { + ctx.dispatch(AppCommand::PatternsTogglePlay); + } + } KeyCode::Char('c') if !ctrl => ctx.dispatch(AppCommand::CommitStagedChanges), KeyCode::Char('q') => { ctx.dispatch(AppCommand::OpenModal(Modal::ConfirmQuit { diff --git a/src/views/render.rs b/src/views/render.rs index 1162e17..25b4d61 100644 --- a/src/views/render.rs +++ b/src/views/render.rs @@ -158,7 +158,7 @@ pub fn render(frame: &mut Frame, app: &App, link: &LinkState, snapshot: &Sequenc }; let [header_area, _padding, body_area, _bottom_padding, footer_area] = Layout::vertical([ - Constraint::Length(1), + Constraint::Length(header_height(padded.width)), Constraint::Length(1), Constraint::Fill(1), Constraint::Length(1), @@ -225,6 +225,10 @@ 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 render_side_panel(frame: &mut Frame, app: &App, area: Rect) { let focused = app.panel.focus == PanelFocus::Side; match &app.panel.side { @@ -252,17 +256,41 @@ fn render_header( let bank = &app.project_state.project.banks[app.editor_ctx.bank]; let pattern = &bank.patterns[app.editor_ctx.pattern]; - // Layout: [Transport] [Live] [Tempo] [Bank] [Pattern] [Stats] - 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); + 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 [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) + }; // Transport block let (transport_bg, transport_text) = if app.playback.playing {