monostep/Source/ui/SequencerMatrix.h

73 lines
1.9 KiB
C
Raw Permalink Normal View History

#pragma once
#include <JuceHeader.h>
2026-08-05 23:12:17 +02:00
class MonostepAudioProcessor;
class SequencerMatrix final : public juce::Component
{
public:
2026-08-05 23:12:17 +02:00
explicit SequencerMatrix (MonostepAudioProcessor& processor);
~SequencerMatrix() override = default;
std::function<void (int stepIdx)> onStepSelected;
std::function<void (int stepIdx, bool gate)> onGateChanged;
std::function<void (int stepIdx, int semitone)> onNoteChanged;
std::function<void (int stepIdx, float cents)> onFineChanged;
std::function<void (int stepIdx, bool slide)> onSlideChanged;
2026-08-05 23:12:17 +02:00
std::function<void (int stepIdx, bool accent)> onAccentChanged;
void setSelectedStep (int stepIdx);
int getSelectedStep() const { return selectedStep; }
void setPlayPosition (int stepIdx);
void paint (juce::Graphics&) override;
void mouseDown (const juce::MouseEvent&) override;
void mouseDrag (const juce::MouseEvent&) override;
void mouseUp (const juce::MouseEvent&) override;
private:
struct CellRect
{
int step;
int row;
bool hit;
};
CellRect cellAt (const juce::MouseEvent&) const;
juce::Rectangle<int> matrixBounds() const;
int rowForSemitone (int semitone) const;
int semitoneForRow (int row) const;
2026-08-05 23:12:17 +02:00
MonostepAudioProcessor& processor;
float labelW = 40.0f;
float headerH = 24.0f;
float headerPad = 10.0f;
2026-08-05 23:12:17 +02:00
mutable float cellW = 24.0f;
mutable float cellH = 17.0f;
int selectedStep = 0;
int playPos = -1;
bool dragging = false;
bool startedActive = false;
bool moved = false;
int lastRow = 0;
int dragStep = 0;
bool fineDragging = false;
int fineRefRow = 0;
float fineStartCents = 0.0f;
float fineLastCents = -1000.0f;
bool slideDragging = false;
bool startedSlideActive = false;
int slideLastStep = -1;
2026-08-05 23:12:17 +02:00
bool accentDragging = false;
bool startedAccentActive = false;
int accentLastStep = -1;
};