#ifndef AMUSE_EDITOR_WIDGET_HPP #define AMUSE_EDITOR_WIDGET_HPP #include #include #include #include #include #include #include #include "ProjectModel.hpp" class EditorWidget : public QWidget { Q_OBJECT public: explicit EditorWidget(QWidget* parent = Q_NULLPTR); virtual bool valid() const { return true; } virtual void unloadData() {} virtual ProjectModel::INode* currentNode() const { return nullptr; } public slots: virtual bool isItemEditEnabled() const { return false; } virtual void itemCutAction() {} virtual void itemCopyAction() {} virtual void itemPasteAction() {} virtual void itemDeleteAction() {} }; class EditorUndoCommand : public QUndoCommand { protected: amuse::ObjToken m_node; enum class Id { SMChangeVal, SampLoop, SampPitch, ADSRAttack, ADSRDecay, ADSRSustain, ADSRAttackAndDecay, ADSRDecayAndSustain, ADSRRelease, ADSRDLS, ADSRVelToAttack, ADSRKeyToDecay, CurveEdit }; public: EditorUndoCommand(amuse::ObjToken node, const QString& text, QUndoCommand* parent = nullptr) : QUndoCommand(text, parent), m_node(node) {} void undo(); void redo(); }; class FieldSpinBox : public QSpinBox { Q_OBJECT public: explicit FieldSpinBox(QWidget* parent = Q_NULLPTR) : QSpinBox(parent) {} /* Don't scroll */ void wheelEvent(QWheelEvent* event) { event->ignore(); } }; class FieldComboBox : public QComboBox { Q_OBJECT public: explicit FieldComboBox(QWidget* parent = Q_NULLPTR) : QComboBox(parent) {} /* Don't scroll */ void wheelEvent(QWheelEvent* event) { event->ignore(); } }; class FieldProjectNode : public FieldComboBox { Q_OBJECT ProjectModel::CollectionNode* m_collection; public: explicit FieldProjectNode(ProjectModel::CollectionNode* collection = Q_NULLPTR, QWidget* parent = Q_NULLPTR); void setCollection(ProjectModel::CollectionNode* collection); ProjectModel::CollectionNode* collection() const { return m_collection; } }; class FieldPageObjectNode : public FieldComboBox { Q_OBJECT ProjectModel::GroupNode* m_group; public: explicit FieldPageObjectNode(ProjectModel::GroupNode* group = Q_NULLPTR, QWidget* parent = Q_NULLPTR); void setGroup(ProjectModel::GroupNode* group); ProjectModel::GroupNode* group() const { return m_group; } }; template class EditorFieldNode : public T { bool m_deferPopupOpen = true; public: using T::T; bool shouldPopupOpen() { bool ret = m_deferPopupOpen; m_deferPopupOpen = false; return ret; } }; using EditorFieldProjectNode = EditorFieldNode; using EditorFieldPageObjectNode = EditorFieldNode; template class RangedValueFactory : public QItemEditorFactory { public: QWidget* createEditor(int userType, QWidget *parent) const { QSpinBox* sb = new QSpinBox(parent); sb->setFrame(false); sb->setMinimum(MIN); sb->setMaximum(MAX); return sb; } }; #endif //AMUSE_EDITOR_WIDGET_HPP