weGraph.h (3159B)
1 #pragma once 2 3 #include "weTypes.h" 4 #include "juce_gui_basics/juce_gui_basics.h" 5 6 #include "baseLib/event.h" 7 8 namespace xtJucePlugin 9 { 10 class GraphData; 11 class WaveEditor; 12 13 class Graph : public juce::Component, public juce::DragAndDropTarget, public juce::FileDragAndDropTarget 14 { 15 public: 16 static constexpr uint32_t InvalidIndex = ~0; 17 18 explicit Graph(WaveEditor& _editor); 19 20 WaveEditor& getEditor() const { return m_editor; } 21 22 void paint(juce::Graphics& g) override; 23 void parentHierarchyChanged() override; 24 25 template<size_t Size> void paint(const std::array<float, Size>& _data, juce::Graphics& _g, const int _x, const int _y, const int _width, const int _height) const 26 { 27 paint(_data.data(), Size, _g, _x, _y, _width, _height); 28 } 29 30 void paint(const float* _data, size_t _size, juce::Graphics& _g, int _x, int _y, int _width, int _height) const; 31 32 virtual float normalize(float _in) const = 0; 33 virtual float unnormalize(float _in) const = 0; 34 35 virtual const float* getData() const = 0; 36 virtual size_t getDataSize() const = 0; 37 38 void mouseDown(const juce::MouseEvent& _e) override; 39 void mouseMove(const juce::MouseEvent& _e) override; 40 void mouseEnter(const juce::MouseEvent& _e) override; 41 void mouseExit(const juce::MouseEvent& _e) override; 42 void mouseDrag(const juce::MouseEvent& _e) override; 43 44 GraphData& getGraphData() const { return m_data; } 45 46 int32_t mouseToIndex(const juce::MouseEvent& _e) const; 47 float mouseToNormalizedValue(const juce::MouseEvent& _e) const; 48 float mouseToUnnormalizedValue(const juce::MouseEvent& _e) const; 49 50 bool isValidIndex(const uint32_t _index) const { return _index < getDataSize(); } 51 bool isValidIndex(const int32_t _index) const { return _index >= 0 && _index < getDataSize(); } 52 53 const juce::MouseEvent* lastMouseEvent() const; 54 55 void setUpdateHoveredPositionWhileDragging(bool _enable) 56 { 57 m_updateHoveredPositionWhileDragging = _enable; 58 } 59 60 bool isInterestedInDragSource(const SourceDetails& _dragSourceDetails) override; 61 void itemDropped(const SourceDetails& _dragSourceDetails) override; 62 63 bool isInterestedInFileDrag(const juce::StringArray& _files) override; 64 void filesDropped(const juce::StringArray& _files, int _x, int _y) override; 65 66 protected: 67 virtual void onSourceChanged(); 68 virtual void onHoveredIndexChanged(uint32_t _index); 69 virtual void onHighlightedIndicesChanged(const std::set<uint32_t>& _indices); 70 71 void setHighlightedIndices(const std::set<uint32_t>& _indices); 72 73 virtual void modifyValue(uint32_t _index, float _unnormalizedValue) = 0; 74 75 bool updateHoveredIndex(const juce::MouseEvent& _e); 76 77 uint32_t getHoveredIndex() const { return m_hoveredIndex; } 78 79 private: 80 void setHoveredIndex(uint32_t _index); 81 void setLastMouseEvent(const juce::MouseEvent& _e); 82 void modifyValuesForRange(const juce::MouseEvent& _a, const juce::MouseEvent& _b); 83 84 WaveEditor& m_editor; 85 GraphData& m_data; 86 87 baseLib::EventListener<> m_onDataChanged; 88 89 std::set<uint32_t> m_highlightedIndices; 90 uint32_t m_hoveredIndex = InvalidIndex; 91 std::unique_ptr<juce::MouseEvent> m_lastMouseEvent; 92 bool m_updateHoveredPositionWhileDragging = false; 93 }; 94 }