#ifndef AMUSE_ADSR_EDITOR_HPP #define AMUSE_ADSR_EDITOR_HPP #include "EditorWidget.hpp" #include #include #include #include #include #include class ADSREditor; class ADSRView : public QWidget { Q_OBJECT friend class ADSRControls; amuse::ObjToken m_node; QFont m_gridFont; QStaticText m_percentTexts[11]; std::vector m_timeTexts; int m_dragPoint = -1; uint64_t m_cycleIdx = 0; ADSREditor* getEditor() const; public: explicit ADSRView(QWidget* parent = Q_NULLPTR); void loadData(ProjectModel::ADSRNode* node); void unloadData(); ProjectModel::INode* currentNode() const; void paintEvent(QPaintEvent* ev); void mousePressEvent(QMouseEvent* ev); void mouseReleaseEvent(QMouseEvent* ev); void mouseMoveEvent(QMouseEvent* ev); }; class ADSRControls : public QFrame { Q_OBJECT friend class ADSRView; QDoubleSpinBox* m_attack; QDoubleSpinBox* m_decay; QDoubleSpinBox* m_sustain; QDoubleSpinBox* m_release; QCheckBox* m_dls; QLabel* m_velToAttackLab; QDoubleSpinBox* m_velToAttack; QLabel* m_keyToDecayLab; QDoubleSpinBox* m_keyToDecay; bool m_enableUpdate = true; ADSREditor* getEditor() const; void setAttackAndDecay(double attack, double decay, uint64_t cycleCount); void setDecayAndSustain(double decay, double sustain, uint64_t cycleCount); void setRelease(double release, uint64_t cycleCount); public: explicit ADSRControls(QWidget* parent = Q_NULLPTR); void loadData(); void unloadData(); public slots: void attackChanged(double val); void decayChanged(double val); void sustainChanged(double val); void releaseChanged(double val); void dlsStateChanged(int state); void velToAttackChanged(double val); void keyToDecayChanged(double val); }; class ADSREditor : public EditorWidget { Q_OBJECT friend class ADSRView; friend class ADSRControls; ADSRView* m_adsrView; ADSRControls* m_controls; public: explicit ADSREditor(QWidget* parent = Q_NULLPTR); bool loadData(ProjectModel::ADSRNode* node); void unloadData(); ProjectModel::INode* currentNode() const; }; #endif //AMUSE_ADSR_EDITOR_HPP