xybrid/xybrid/ui/patterneditormodel.h

61 lines
2.3 KiB
C++

#pragma once
#include <QAbstractTableModel>
#include "data/pattern.h"
namespace Xybrid::UI {
class PatternEditorHeaderProxyModel;
class PatternEditorModel : public QAbstractTableModel {
Q_OBJECT
std::shared_ptr<Data::Pattern> pattern;
public:
static constexpr int paramSoftCap = 16; // maximum number of parameter columns that can be displayed per channel; the rest are hidden
static constexpr int colsPerChannel = 2 + (2 * paramSoftCap);
static constexpr int cellPadding = 2;
PatternEditorHeaderProxyModel* hprox;
bool fitHeaderToName = false;
bool folded = true;
int endHeight = -1;
PatternEditorModel(QObject *parent);
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
int columnCount(const QModelIndex &parent = QModelIndex()) const override;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
Qt::ItemFlags flags(const QModelIndex & index) const override;
int hdrColumnCount() const;
QVariant hdrData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
void setPattern(const std::shared_ptr<Data::Pattern>& pattern);
std::shared_ptr<Data::Pattern> getPattern() {
return pattern;
}
void updateColumnDisplay();
void refresh() { // implemented in header to allow inlining
emit layoutChanged();
updateFold();
updateColumnDisplay();
}
void updateFold();
void toggleFold();
};
class PatternEditorHeaderProxyModel : public QAbstractTableModel {
PatternEditorModel* pm;
public:
PatternEditorHeaderProxyModel(QObject *parent, PatternEditorModel* p);
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
int columnCount(const QModelIndex &parent = QModelIndex()) const override;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
};
}