#pragma once #include #include "SliceManager.h" #include class PianoRollDisplay : public juce::Component, public juce::Timer { public: static constexpr int numRows = 12; static constexpr int baseMidiNote = 60; static constexpr float keyWidth = 50.0f; PianoRollDisplay(SliceManager& sm); ~PianoRollDisplay() override; void paint(juce::Graphics& g) override; void resized() override; void timerCallback() override; void mouseDown(const juce::MouseEvent& e) override; void mouseUp(const juce::MouseEvent& e) override; void setActiveSlice(int index); void setSelectedSlice(int index); void setTotalSamples(int total); void setOnKeyClick(std::function callback); private: SliceManager& sliceManager; int activeSlice = -1; int selectedSlice = -1; int totalSamples = 0; int pressedKey = -1; std::function onKeyClick; juce::Colour sliceColour(int sliceIndex) const; int rowToSliceIndex(int row) const; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(PianoRollDisplay) };