amuse/Editor/KeymapEditor.hpp

123 lines
3.3 KiB
C++
Raw Permalink Normal View History

2018-10-06 20:40:25 -07:00
#pragma once
#include <array>
#include <bitset>
#include <cstdint>
#include <unordered_map>
2018-08-05 21:20:42 -07:00
#include <QFrame>
#include <QPushButton>
2018-08-05 21:20:42 -07:00
#include <QStaticText>
#include <QSvgRenderer>
#include "EditorWidget.hpp"
#include "ProjectModel.hpp"
#include <amuse/AudioGroupPool.hpp>
#include <amuse/Common.hpp>
2018-08-05 21:20:42 -07:00
class KeymapEditor;
class QCheckBox;
class QScrollArea;
class QSpinBox;
2018-08-05 21:20:42 -07:00
2018-12-07 21:20:09 -08:00
class PaintButton : public QPushButton {
Q_OBJECT
2018-08-05 21:20:42 -07:00
public:
2018-12-07 21:20:09 -08:00
explicit PaintButton(QWidget* parent = Q_NULLPTR);
void mouseReleaseEvent(QMouseEvent* event) override { event->ignore(); }
void mouseMoveEvent(QMouseEvent* event) override { event->ignore(); }
void focusOutEvent(QFocusEvent* event) override { event->ignore(); }
void keyPressEvent(QKeyEvent* event) override { event->ignore(); }
2018-08-05 21:20:42 -07:00
};
using PaintPalette = std::array<QColor, 129>;
2018-12-07 21:20:09 -08:00
class KeymapView : public QWidget {
Q_OBJECT
friend class KeymapControls;
friend class KeymapEditor;
amuse::ObjToken<ProjectModel::KeymapNode> m_node;
QSvgRenderer m_octaveRenderer;
QSvgRenderer m_lastOctaveRenderer;
std::array<QRectF, 7> m_natural;
std::array<QRectF, 5> m_sharp;
2018-12-07 21:20:09 -08:00
QTransform m_widgetToSvg;
QFont m_keyFont;
std::array<QStaticText, 128> m_keyTexts;
std::array<int, 128> m_keyPalettes;
2018-12-07 21:20:09 -08:00
KeymapEditor* getEditor() const;
int getKey(const QPoint& localPos) const;
void drawKey(QPainter& painter, const QRect& octaveRect, qreal penWidth, const PaintPalette& keyPalette, int o,
2018-12-07 21:20:09 -08:00
int k) const;
2018-08-05 21:20:42 -07:00
public:
2018-12-07 21:20:09 -08:00
explicit KeymapView(QWidget* parent = Q_NULLPTR);
~KeymapView() override;
2018-12-07 21:20:09 -08:00
void loadData(ProjectModel::KeymapNode* node);
void unloadData();
ProjectModel::INode* currentNode() const;
2018-08-05 21:20:42 -07:00
void paintEvent(QPaintEvent* ev) override;
void mousePressEvent(QMouseEvent* ev) override;
void mouseMoveEvent(QMouseEvent* ev) override;
void wheelEvent(QWheelEvent* event) override;
2018-08-05 21:20:42 -07:00
};
2018-12-07 21:20:09 -08:00
class KeymapControls : public QFrame {
Q_OBJECT
friend class KeymapView;
friend class KeymapEditor;
FieldProjectNode* m_macro;
QSpinBox* m_transpose;
QSpinBox* m_pan;
QCheckBox* m_surround;
QSpinBox* m_prioOffset;
PaintButton* m_paintButton;
bool m_enableUpdate = true;
KeymapEditor* getEditor() const;
void setPaintIdx(int idx);
void setKeymap(const amuse::Keymap& km);
2018-08-05 21:20:42 -07:00
public:
2018-12-07 21:20:09 -08:00
explicit KeymapControls(QWidget* parent = Q_NULLPTR);
~KeymapControls() override;
2018-12-07 21:20:09 -08:00
void loadData(ProjectModel::KeymapNode* node);
void unloadData();
2018-08-05 21:20:42 -07:00
public slots:
2018-12-07 21:20:09 -08:00
void controlChanged();
void paintButtonPressed();
2018-08-05 21:20:42 -07:00
};
2018-12-07 21:20:09 -08:00
class KeymapEditor : public EditorWidget {
Q_OBJECT
friend class KeymapView;
friend class KeymapControls;
QScrollArea* m_scrollArea;
KeymapView* m_kmView;
KeymapControls* m_controls;
PaintPalette m_paintPalette;
2018-12-07 21:20:09 -08:00
amuse::Keymap m_controlKeymap;
std::unordered_map<uint64_t, std::pair<int, int>> m_configToIdx;
std::bitset<129> m_idxBitmap;
bool m_inPaint = false;
void _touch();
void touchKey(int key, bool bulk = false);
void touchControl(const amuse::Keymap& km);
int allocateConfigIdx(uint64_t key);
void deallocateConfigIdx(uint64_t key);
int getConfigIdx(uint64_t key) const;
public:
2018-12-07 21:20:09 -08:00
explicit KeymapEditor(QWidget* parent = Q_NULLPTR);
~KeymapEditor() override;
2018-12-07 21:20:09 -08:00
bool loadData(ProjectModel::KeymapNode* node);
void unloadData() override;
ProjectModel::INode* currentNode() const override;
void keyPressEvent(QKeyEvent* event) override;
};