gearmulator

Emulation of classic VA synths of the late 90s/2000s that are based on Motorola 56300 family DSPs
Log | Files | Refs | Submodules | README | LICENSE

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 }