Implemented loopstation preset model
This commit is contained in:
@ -23,6 +23,7 @@ SOURCES += \
|
|||||||
jsonconverters.cpp \
|
jsonconverters.cpp \
|
||||||
loopstationjsonconverters.cpp \
|
loopstationjsonconverters.cpp \
|
||||||
loopstationpresets.cpp \
|
loopstationpresets.cpp \
|
||||||
|
loopstationpresetsmodel.cpp \
|
||||||
main.cpp \
|
main.cpp \
|
||||||
midicontainers.cpp \
|
midicontainers.cpp \
|
||||||
midiinwrapper.cpp \
|
midiinwrapper.cpp \
|
||||||
@ -57,6 +58,7 @@ HEADERS += \
|
|||||||
jsonconverters.h \
|
jsonconverters.h \
|
||||||
loopstationjsonconverters.h \
|
loopstationjsonconverters.h \
|
||||||
loopstationpresets.h \
|
loopstationpresets.h \
|
||||||
|
loopstationpresetsmodel.h \
|
||||||
midicontainers.h \
|
midicontainers.h \
|
||||||
midiinwrapper.h \
|
midiinwrapper.h \
|
||||||
midioutwrapper.h \
|
midioutwrapper.h \
|
||||||
|
@ -222,3 +222,13 @@ void DrumMachineSettings::setDrumpadNote(quint8 pad, quint8 note)
|
|||||||
{
|
{
|
||||||
setValue(QString{"drumpad/pad%0_note"}.arg(pad), note);
|
setValue(QString{"drumpad/pad%0_note"}.arg(pad), note);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString DrumMachineSettings::loopstationLastPresetId() const
|
||||||
|
{
|
||||||
|
return value("loopstation/lastPresetId").toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
void DrumMachineSettings::setLoopstationLastPresetId(const QString &lastPresetId)
|
||||||
|
{
|
||||||
|
setValue("loopstation/lastPresetId", lastPresetId);
|
||||||
|
}
|
||||||
|
@ -27,6 +27,8 @@ public:
|
|||||||
QString lastMidiOutDevice() const;
|
QString lastMidiOutDevice() const;
|
||||||
void setLastMidiOutDevice(const QString &lastMidiOutDevice);
|
void setLastMidiOutDevice(const QString &lastMidiOutDevice);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
QString drumpadLastPresetId() const;
|
QString drumpadLastPresetId() const;
|
||||||
void setDrumpadLastPresetId(const QString &lastPresetId);
|
void setDrumpadLastPresetId(const QString &lastPresetId);
|
||||||
|
|
||||||
@ -64,4 +66,9 @@ public:
|
|||||||
void setDrumpadChannel(quint8 pad, quint8 channel);
|
void setDrumpadChannel(quint8 pad, quint8 channel);
|
||||||
quint8 drumpadNote(quint8 pad) const;
|
quint8 drumpadNote(quint8 pad) const;
|
||||||
void setDrumpadNote(quint8 pad, quint8 note);
|
void setDrumpadNote(quint8 pad, quint8 note);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
QString loopstationLastPresetId() const;
|
||||||
|
void setLoopstationLastPresetId(const QString &lastPresetId);
|
||||||
};
|
};
|
||||||
|
@ -37,49 +37,49 @@ DrumPadPresetsModel::DrumPadPresetsModel(QObject *parent) :
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
DrumPadPresetsModel::DrumPadPresetsModel(const std::map<QString, drumpad_presets::Preset> &drumpad_presets, QObject *parent) :
|
DrumPadPresetsModel::DrumPadPresetsModel(const std::map<QString, drumpad_presets::Preset> &presets, QObject *parent) :
|
||||||
QAbstractTableModel{parent}
|
QAbstractTableModel{parent}
|
||||||
{
|
{
|
||||||
m_drumpad_presets.reserve(std::size(drumpad_presets));
|
m_presets.reserve(std::size(presets));
|
||||||
for (const auto &pair : drumpad_presets)
|
for (const auto &pair : presets)
|
||||||
m_drumpad_presets.emplace_back(pair.second);
|
m_presets.emplace_back(pair.second);
|
||||||
}
|
}
|
||||||
|
|
||||||
DrumPadPresetsModel::DrumPadPresetsModel(std::vector<drumpad_presets::Preset> &&drumpad_presets, QObject *parent) :
|
DrumPadPresetsModel::DrumPadPresetsModel(std::vector<drumpad_presets::Preset> &&presets, QObject *parent) :
|
||||||
QAbstractTableModel{parent}
|
QAbstractTableModel{parent}
|
||||||
{
|
{
|
||||||
m_drumpad_presets = std::move(drumpad_presets);
|
m_presets = std::move(presets);
|
||||||
}
|
}
|
||||||
|
|
||||||
DrumPadPresetsModel::DrumPadPresetsModel(const std::vector<drumpad_presets::Preset> &drumpad_presets, QObject *parent) :
|
DrumPadPresetsModel::DrumPadPresetsModel(const std::vector<drumpad_presets::Preset> &presets, QObject *parent) :
|
||||||
QAbstractTableModel{parent}
|
QAbstractTableModel{parent}
|
||||||
{
|
{
|
||||||
m_drumpad_presets = drumpad_presets;
|
m_presets = presets;
|
||||||
}
|
}
|
||||||
|
|
||||||
DrumPadPresetsModel::~DrumPadPresetsModel() = default;
|
DrumPadPresetsModel::~DrumPadPresetsModel() = default;
|
||||||
|
|
||||||
void DrumPadPresetsModel::setPresets(const std::map<QString, drumpad_presets::Preset> &drumpad_presets)
|
void DrumPadPresetsModel::setPresets(const std::map<QString, drumpad_presets::Preset> &presets)
|
||||||
{
|
{
|
||||||
beginResetModel();
|
beginResetModel();
|
||||||
m_drumpad_presets.clear();
|
m_presets.clear();
|
||||||
m_drumpad_presets.reserve(std::size(drumpad_presets));
|
m_presets.reserve(std::size(presets));
|
||||||
for (const auto &pair : drumpad_presets)
|
for (const auto &pair : presets)
|
||||||
m_drumpad_presets.emplace_back(pair.second);
|
m_presets.emplace_back(pair.second);
|
||||||
endResetModel();
|
endResetModel();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DrumPadPresetsModel::setPresets(std::vector<drumpad_presets::Preset> &&drumpad_presets)
|
void DrumPadPresetsModel::setPresets(std::vector<drumpad_presets::Preset> &&presets)
|
||||||
{
|
{
|
||||||
beginResetModel();
|
beginResetModel();
|
||||||
m_drumpad_presets = std::move(drumpad_presets);
|
m_presets = std::move(presets);
|
||||||
endResetModel();
|
endResetModel();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DrumPadPresetsModel::setPresets(const std::vector<drumpad_presets::Preset> &drumpad_presets)
|
void DrumPadPresetsModel::setPresets(const std::vector<drumpad_presets::Preset> &presets)
|
||||||
{
|
{
|
||||||
beginResetModel();
|
beginResetModel();
|
||||||
m_drumpad_presets = drumpad_presets;
|
m_presets = presets;
|
||||||
endResetModel();
|
endResetModel();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -90,18 +90,18 @@ const drumpad_presets::Preset &DrumPadPresetsModel::getPreset(const QModelIndex
|
|||||||
|
|
||||||
const drumpad_presets::Preset &DrumPadPresetsModel::getPreset(int row) const
|
const drumpad_presets::Preset &DrumPadPresetsModel::getPreset(int row) const
|
||||||
{
|
{
|
||||||
Q_ASSERT(row >= 0 && row < int(std::size(m_drumpad_presets)));
|
Q_ASSERT(row >= 0 && row < int(std::size(m_presets)));
|
||||||
return m_drumpad_presets.at(row);
|
return m_presets.at(row);
|
||||||
}
|
}
|
||||||
|
|
||||||
QModelIndex DrumPadPresetsModel::findPresetById(const QString &id) const
|
QModelIndex DrumPadPresetsModel::findPresetById(const QString &id) const
|
||||||
{
|
{
|
||||||
for (auto iter = std::cbegin(m_drumpad_presets); iter != std::cend(m_drumpad_presets); iter++)
|
for (auto iter = std::cbegin(m_presets); iter != std::cend(m_presets); iter++)
|
||||||
{
|
{
|
||||||
if (iter->id != id)
|
if (iter->id != id)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
return createIndex(std::distance(std::cbegin(m_drumpad_presets), iter), 0);
|
return createIndex(std::distance(std::cbegin(m_presets), iter), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
return {};
|
return {};
|
||||||
@ -111,7 +111,7 @@ int DrumPadPresetsModel::rowCount(const QModelIndex &parent) const
|
|||||||
{
|
{
|
||||||
Q_UNUSED(parent)
|
Q_UNUSED(parent)
|
||||||
|
|
||||||
return std::size(m_drumpad_presets);
|
return std::size(m_presets);
|
||||||
}
|
}
|
||||||
|
|
||||||
int DrumPadPresetsModel::columnCount(const QModelIndex &parent) const
|
int DrumPadPresetsModel::columnCount(const QModelIndex &parent) const
|
||||||
@ -132,7 +132,7 @@ QVariant DrumPadPresetsModel::data(const QModelIndex &index, int role) const
|
|||||||
return {};
|
return {};
|
||||||
if (index.row() < 0)
|
if (index.row() < 0)
|
||||||
return {};
|
return {};
|
||||||
if (index.row() >= int(std::size(m_drumpad_presets)))
|
if (index.row() >= int(std::size(m_presets)))
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
const auto &preset = getPreset(index);
|
const auto &preset = getPreset(index);
|
||||||
|
@ -12,14 +12,14 @@ class DrumPadPresetsModel : public QAbstractTableModel
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
DrumPadPresetsModel(QObject *parent = nullptr);
|
DrumPadPresetsModel(QObject *parent = nullptr);
|
||||||
DrumPadPresetsModel(const std::map<QString, drumpad_presets::Preset> &drumpad_presets, QObject *parent = nullptr);
|
DrumPadPresetsModel(const std::map<QString, drumpad_presets::Preset> &presets, QObject *parent = nullptr);
|
||||||
DrumPadPresetsModel(std::vector<drumpad_presets::Preset> &&drumpad_presets, QObject *parent = nullptr);
|
DrumPadPresetsModel(std::vector<drumpad_presets::Preset> &&presets, QObject *parent = nullptr);
|
||||||
DrumPadPresetsModel(const std::vector<drumpad_presets::Preset> &drumpad_presets, QObject *parent = nullptr);
|
DrumPadPresetsModel(const std::vector<drumpad_presets::Preset> &presets, QObject *parent = nullptr);
|
||||||
~DrumPadPresetsModel() override;
|
~DrumPadPresetsModel() override;
|
||||||
|
|
||||||
void setPresets(const std::map<QString, drumpad_presets::Preset> &drumpad_presets);
|
void setPresets(const std::map<QString, drumpad_presets::Preset> &presets);
|
||||||
void setPresets(std::vector<drumpad_presets::Preset> &&drumpad_presets);
|
void setPresets(std::vector<drumpad_presets::Preset> &&presets);
|
||||||
void setPresets(const std::vector<drumpad_presets::Preset> &drumpad_presets);
|
void setPresets(const std::vector<drumpad_presets::Preset> &presets);
|
||||||
|
|
||||||
const drumpad_presets::Preset &getPreset(const QModelIndex &index) const;
|
const drumpad_presets::Preset &getPreset(const QModelIndex &index) const;
|
||||||
const drumpad_presets::Preset &getPreset(int row) const;
|
const drumpad_presets::Preset &getPreset(int row) const;
|
||||||
@ -32,5 +32,5 @@ public:
|
|||||||
QVariant headerData(int section, Qt::Orientation orientation, int role) const override;
|
QVariant headerData(int section, Qt::Orientation orientation, int role) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::vector<drumpad_presets::Preset> m_drumpad_presets;
|
std::vector<drumpad_presets::Preset> m_presets;
|
||||||
};
|
};
|
||||||
|
242
loopstationpresetsmodel.cpp
Normal file
242
loopstationpresetsmodel.cpp
Normal file
@ -0,0 +1,242 @@
|
|||||||
|
#include "loopstationpresetsmodel.h"
|
||||||
|
|
||||||
|
#include <iterator>
|
||||||
|
|
||||||
|
#include <QFont>
|
||||||
|
#include <QColor>
|
||||||
|
|
||||||
|
#include "loopstationpresets.h"
|
||||||
|
|
||||||
|
enum {
|
||||||
|
ColumnId,
|
||||||
|
ColumnTitle,
|
||||||
|
ColumnAuthor,
|
||||||
|
ColumnBpm,
|
||||||
|
ColumnCoverUrl,
|
||||||
|
ColumnLoopLength,
|
||||||
|
ColumnOrderBy,
|
||||||
|
ColumnPremium,
|
||||||
|
ColumnTags,
|
||||||
|
ColumnAudioPreviewUrl,
|
||||||
|
ColumnDELETED,
|
||||||
|
NumberOfColumns
|
||||||
|
};
|
||||||
|
|
||||||
|
LoopStationPresetsModel::LoopStationPresetsModel(QObject *parent) :
|
||||||
|
QAbstractTableModel{parent}
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
LoopStationPresetsModel::LoopStationPresetsModel(const std::map<QString, loopstation_presets::Preset> &presets, QObject *parent) :
|
||||||
|
QAbstractTableModel{parent}
|
||||||
|
{
|
||||||
|
m_presets.reserve(std::size(presets));
|
||||||
|
for (const auto &pair : presets)
|
||||||
|
m_presets.emplace_back(pair.second);
|
||||||
|
}
|
||||||
|
|
||||||
|
LoopStationPresetsModel::LoopStationPresetsModel(std::vector<loopstation_presets::Preset> &&presets, QObject *parent) :
|
||||||
|
QAbstractTableModel{parent}
|
||||||
|
{
|
||||||
|
m_presets = std::move(presets);
|
||||||
|
}
|
||||||
|
|
||||||
|
LoopStationPresetsModel::LoopStationPresetsModel(const std::vector<loopstation_presets::Preset> &presets, QObject *parent) :
|
||||||
|
QAbstractTableModel{parent}
|
||||||
|
{
|
||||||
|
m_presets = presets;
|
||||||
|
}
|
||||||
|
|
||||||
|
LoopStationPresetsModel::~LoopStationPresetsModel() = default;
|
||||||
|
|
||||||
|
void LoopStationPresetsModel::setPresets(const std::map<QString, loopstation_presets::Preset> &presets)
|
||||||
|
{
|
||||||
|
beginResetModel();
|
||||||
|
m_presets.clear();
|
||||||
|
m_presets.reserve(std::size(presets));
|
||||||
|
for (const auto &pair : presets)
|
||||||
|
m_presets.emplace_back(pair.second);
|
||||||
|
endResetModel();
|
||||||
|
}
|
||||||
|
|
||||||
|
void LoopStationPresetsModel::setPresets(std::vector<loopstation_presets::Preset> &&presets)
|
||||||
|
{
|
||||||
|
beginResetModel();
|
||||||
|
m_presets = std::move(presets);
|
||||||
|
endResetModel();
|
||||||
|
}
|
||||||
|
|
||||||
|
void LoopStationPresetsModel::setPresets(const std::vector<loopstation_presets::Preset> &presets)
|
||||||
|
{
|
||||||
|
beginResetModel();
|
||||||
|
m_presets = presets;
|
||||||
|
endResetModel();
|
||||||
|
}
|
||||||
|
|
||||||
|
const loopstation_presets::Preset &LoopStationPresetsModel::getPreset(const QModelIndex &index) const
|
||||||
|
{
|
||||||
|
return getPreset(index.row());
|
||||||
|
}
|
||||||
|
|
||||||
|
const loopstation_presets::Preset &LoopStationPresetsModel::getPreset(int row) const
|
||||||
|
{
|
||||||
|
Q_ASSERT(row >= 0 && row < int(std::size(m_presets)));
|
||||||
|
return m_presets.at(row);
|
||||||
|
}
|
||||||
|
|
||||||
|
QModelIndex LoopStationPresetsModel::findPresetById(const QString &id) const
|
||||||
|
{
|
||||||
|
for (auto iter = std::cbegin(m_presets); iter != std::cend(m_presets); iter++)
|
||||||
|
{
|
||||||
|
if (iter->id != id)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
return createIndex(std::distance(std::cbegin(m_presets), iter), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
int LoopStationPresetsModel::rowCount(const QModelIndex &parent) const
|
||||||
|
{
|
||||||
|
Q_UNUSED(parent)
|
||||||
|
|
||||||
|
return std::size(m_presets);
|
||||||
|
}
|
||||||
|
|
||||||
|
int LoopStationPresetsModel::columnCount(const QModelIndex &parent) const
|
||||||
|
{
|
||||||
|
Q_UNUSED(parent)
|
||||||
|
|
||||||
|
return NumberOfColumns;
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant LoopStationPresetsModel::data(const QModelIndex &index, int role) const
|
||||||
|
{
|
||||||
|
if (role != Qt::DisplayRole && role != Qt::EditRole && role != Qt::FontRole && role != Qt::ForegroundRole)
|
||||||
|
return {};
|
||||||
|
|
||||||
|
if (index.column() < 0)
|
||||||
|
return {};
|
||||||
|
if (index.column() >= NumberOfColumns)
|
||||||
|
return {};
|
||||||
|
if (index.row() < 0)
|
||||||
|
return {};
|
||||||
|
if (index.row() >= int(std::size(m_presets)))
|
||||||
|
return {};
|
||||||
|
|
||||||
|
const auto &preset = getPreset(index);
|
||||||
|
|
||||||
|
const auto handleData = [&](const auto &val) -> QVariant
|
||||||
|
{
|
||||||
|
if (!val)
|
||||||
|
{
|
||||||
|
if (role == Qt::DisplayRole)
|
||||||
|
return this->tr("(null)");
|
||||||
|
else if (role == Qt::FontRole)
|
||||||
|
{
|
||||||
|
QFont font;
|
||||||
|
font.setItalic(true);
|
||||||
|
return font;
|
||||||
|
}
|
||||||
|
else if (role == Qt::ForegroundRole)
|
||||||
|
return QColor{Qt::gray};
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (role == Qt::DisplayRole || role == Qt::EditRole)
|
||||||
|
return *val;
|
||||||
|
|
||||||
|
return {};
|
||||||
|
};
|
||||||
|
|
||||||
|
const auto handleStringVectorData = [&](const auto &val) -> QVariant
|
||||||
|
{
|
||||||
|
if (!val)
|
||||||
|
{
|
||||||
|
if (role == Qt::DisplayRole)
|
||||||
|
return this->tr("(null)");
|
||||||
|
else if (role == Qt::FontRole)
|
||||||
|
{
|
||||||
|
QFont font;
|
||||||
|
font.setItalic(true);
|
||||||
|
return font;
|
||||||
|
}
|
||||||
|
else if (role == Qt::ForegroundRole)
|
||||||
|
return QColor{Qt::gray};
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (role == Qt::DisplayRole || role == Qt::EditRole)
|
||||||
|
{
|
||||||
|
QString text;
|
||||||
|
for (auto iter = std::cbegin(*val); iter != std::cend(*val); iter++)
|
||||||
|
{
|
||||||
|
if (iter != std::cbegin(*val))
|
||||||
|
text += ", ";
|
||||||
|
text += *iter;
|
||||||
|
}
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
|
||||||
|
return {};
|
||||||
|
};
|
||||||
|
|
||||||
|
switch (index.column())
|
||||||
|
{
|
||||||
|
case ColumnId:
|
||||||
|
{
|
||||||
|
if (preset.id)
|
||||||
|
{
|
||||||
|
bool ok;
|
||||||
|
if (auto id = preset.id->toInt(&ok); ok)
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
return handleData(preset.id);
|
||||||
|
}
|
||||||
|
case ColumnTitle: return handleData(preset.title);
|
||||||
|
case ColumnAuthor: return handleData(preset.author);
|
||||||
|
case ColumnBpm: return handleData(preset.bpm);
|
||||||
|
case ColumnCoverUrl: return handleData(preset.coverUrl);
|
||||||
|
case ColumnLoopLength: return handleData(preset.loopLength);
|
||||||
|
case ColumnOrderBy: return handleData(preset.orderBy);
|
||||||
|
case ColumnPremium: return handleData(preset.premium);
|
||||||
|
case ColumnTags: return handleStringVectorData(preset.tags);
|
||||||
|
case ColumnAudioPreviewUrl: return handleData(preset.audioPreviewUrl);
|
||||||
|
case ColumnDELETED: return handleData(preset.DELETED);
|
||||||
|
}
|
||||||
|
|
||||||
|
Q_UNREACHABLE();
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant LoopStationPresetsModel::headerData(int section, Qt::Orientation orientation, int role) const
|
||||||
|
{
|
||||||
|
if (role != Qt::DisplayRole && role != Qt::EditRole)
|
||||||
|
return {};
|
||||||
|
|
||||||
|
if (orientation != Qt::Horizontal)
|
||||||
|
return {};
|
||||||
|
|
||||||
|
if (section < 0)
|
||||||
|
return {};
|
||||||
|
if (section >= NumberOfColumns)
|
||||||
|
return {};
|
||||||
|
|
||||||
|
switch (section)
|
||||||
|
{
|
||||||
|
case ColumnId: return tr("id");
|
||||||
|
case ColumnTitle: return tr("title");
|
||||||
|
case ColumnAuthor: return tr("author");
|
||||||
|
case ColumnBpm: return tr("bpm");
|
||||||
|
case ColumnCoverUrl: return tr("coverUrl");
|
||||||
|
case ColumnLoopLength: return tr("loopLength");
|
||||||
|
case ColumnOrderBy: return tr("orderBy");
|
||||||
|
case ColumnPremium: return tr("premium");
|
||||||
|
case ColumnTags: return tr("tags");
|
||||||
|
case ColumnAudioPreviewUrl: return tr("audioPreviewUrl");
|
||||||
|
case ColumnDELETED: return tr("DELETED");
|
||||||
|
}
|
||||||
|
|
||||||
|
Q_UNREACHABLE();
|
||||||
|
}
|
36
loopstationpresetsmodel.h
Normal file
36
loopstationpresetsmodel.h
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include <QAbstractTableModel>
|
||||||
|
|
||||||
|
namespace loopstation_presets { class Preset; }
|
||||||
|
|
||||||
|
class LoopStationPresetsModel : public QAbstractTableModel
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
LoopStationPresetsModel(QObject *parent = nullptr);
|
||||||
|
LoopStationPresetsModel(const std::map<QString, loopstation_presets::Preset> &presets, QObject *parent = nullptr);
|
||||||
|
LoopStationPresetsModel(std::vector<loopstation_presets::Preset> &&presets, QObject *parent = nullptr);
|
||||||
|
LoopStationPresetsModel(const std::vector<loopstation_presets::Preset> &presets, QObject *parent = nullptr);
|
||||||
|
~LoopStationPresetsModel() override;
|
||||||
|
|
||||||
|
void setPresets(const std::map<QString, loopstation_presets::Preset> &presets);
|
||||||
|
void setPresets(std::vector<loopstation_presets::Preset> &&presets);
|
||||||
|
void setPresets(const std::vector<loopstation_presets::Preset> &presets);
|
||||||
|
|
||||||
|
const loopstation_presets::Preset &getPreset(const QModelIndex &index) const;
|
||||||
|
const loopstation_presets::Preset &getPreset(int row) const;
|
||||||
|
|
||||||
|
QModelIndex findPresetById(const QString &id) const;
|
||||||
|
|
||||||
|
int rowCount(const QModelIndex &parent) const override;
|
||||||
|
int columnCount(const QModelIndex &parent) const override;
|
||||||
|
QVariant data(const QModelIndex &index, int role) const override;
|
||||||
|
QVariant headerData(int section, Qt::Orientation orientation, int role) const override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::vector<loopstation_presets::Preset> m_presets;
|
||||||
|
};
|
@ -132,7 +132,13 @@ void DrumPadWidget::midiReceived(const midi::MidiMessage &message)
|
|||||||
void DrumPadWidget::currentRowChanged(const QModelIndex ¤t)
|
void DrumPadWidget::currentRowChanged(const QModelIndex ¤t)
|
||||||
{
|
{
|
||||||
if (!current.isValid())
|
if (!current.isValid())
|
||||||
|
{
|
||||||
|
if (m_settings)
|
||||||
|
m_settings->setDrumpadLastPresetId(QString{});
|
||||||
|
else
|
||||||
|
qWarning() << "no settings available";
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const auto &preset = m_presetsModel.getPreset(m_presetsProxyModel.mapToSource(current));
|
const auto &preset = m_presetsModel.getPreset(m_presetsProxyModel.mapToSource(current));
|
||||||
|
|
||||||
|
@ -21,6 +21,17 @@ LoopStationWidget::LoopStationWidget(QWidget *parent) :
|
|||||||
connect(m_ui->pushButtonUp, &QAbstractButton::pressed, this, &LoopStationWidget::selectPrevPreset);
|
connect(m_ui->pushButtonUp, &QAbstractButton::pressed, this, &LoopStationWidget::selectPrevPreset);
|
||||||
connect(m_ui->pushButtonDown, &QAbstractButton::pressed, this, &LoopStationWidget::selectNextPreset);
|
connect(m_ui->pushButtonDown, &QAbstractButton::pressed, this, &LoopStationWidget::selectNextPreset);
|
||||||
connect(m_ui->pushButtonRefresh, &QAbstractButton::pressed, this, &LoopStationWidget::loadPresets);
|
connect(m_ui->pushButtonRefresh, &QAbstractButton::pressed, this, &LoopStationWidget::loadPresets);
|
||||||
|
|
||||||
|
m_presetsProxyModel.setFilterCaseSensitivity(Qt::CaseInsensitive);
|
||||||
|
m_presetsProxyModel.setSortRole(Qt::EditRole);
|
||||||
|
m_presetsProxyModel.setSourceModel(&m_presetsModel);
|
||||||
|
m_ui->presetsView->setModel(&m_presetsProxyModel);
|
||||||
|
|
||||||
|
m_presetsProxyModel.setFilterKeyColumn(1);
|
||||||
|
|
||||||
|
connect(m_ui->lineEdit, &QLineEdit::textChanged, &m_presetsProxyModel, &QSortFilterProxyModel::setFilterFixedString);
|
||||||
|
|
||||||
|
connect(m_ui->presetsView->selectionModel(), &QItemSelectionModel::currentRowChanged, this, &LoopStationWidget::currentRowChanged);
|
||||||
}
|
}
|
||||||
|
|
||||||
LoopStationWidget::~LoopStationWidget() = default;
|
LoopStationWidget::~LoopStationWidget() = default;
|
||||||
@ -43,7 +54,7 @@ void LoopStationWidget::injectDecodingThread(QThread &thread)
|
|||||||
|
|
||||||
void LoopStationWidget::loadSettings(DrumMachineSettings &settings)
|
void LoopStationWidget::loadSettings(DrumMachineSettings &settings)
|
||||||
{
|
{
|
||||||
|
m_settings = &settings;
|
||||||
}
|
}
|
||||||
|
|
||||||
void LoopStationWidget::unsendColors()
|
void LoopStationWidget::unsendColors()
|
||||||
@ -61,6 +72,25 @@ void LoopStationWidget::midiReceived(const midi::MidiMessage &message)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LoopStationWidget::currentRowChanged(const QModelIndex ¤t)
|
||||||
|
{
|
||||||
|
if (!current.isValid())
|
||||||
|
{
|
||||||
|
if (m_settings)
|
||||||
|
m_settings->setLoopstationLastPresetId(QString{});
|
||||||
|
else
|
||||||
|
qWarning() << "no settings available";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto &preset = m_presetsModel.getPreset(m_presetsProxyModel.mapToSource(current));
|
||||||
|
|
||||||
|
if (m_settings)
|
||||||
|
m_settings->setLoopstationLastPresetId(preset.id ? *preset.id : QString{});
|
||||||
|
else
|
||||||
|
qWarning() << "no settings available";
|
||||||
|
}
|
||||||
|
|
||||||
void LoopStationWidget::loadPresets()
|
void LoopStationWidget::loadPresets()
|
||||||
{
|
{
|
||||||
if (!m_networkAccessManager)
|
if (!m_networkAccessManager)
|
||||||
@ -101,7 +131,28 @@ void LoopStationWidget::requestFinished()
|
|||||||
if (!result.presets)
|
if (!result.presets)
|
||||||
throw std::runtime_error("presets missing in response");
|
throw std::runtime_error("presets missing in response");
|
||||||
|
|
||||||
// TODO
|
m_presetsModel.setPresets(std::move(*std::move(result).presets));
|
||||||
|
|
||||||
|
if (m_settings)
|
||||||
|
{
|
||||||
|
if (const auto &lastPresetId = m_settings->loopstationLastPresetId(); !lastPresetId.isEmpty())
|
||||||
|
{
|
||||||
|
if (const auto &index = m_presetsModel.findPresetById(lastPresetId); index.isValid())
|
||||||
|
selectIndex(m_presetsProxyModel.mapFromSource(index));
|
||||||
|
else
|
||||||
|
{
|
||||||
|
qWarning() << "invalid last preset id" << lastPresetId;
|
||||||
|
goto noLastId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
goto noLastId;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
noLastId:
|
||||||
|
selectFirstPreset();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (const std::exception &e)
|
catch (const std::exception &e)
|
||||||
{
|
{
|
||||||
@ -123,3 +174,17 @@ void LoopStationWidget::selectNextPreset()
|
|||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LoopStationWidget::selectIndex(const QModelIndex &index)
|
||||||
|
{
|
||||||
|
if (!index.isValid())
|
||||||
|
{
|
||||||
|
qWarning() << "invalid index";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_ui->presetsView->scrollTo(index);
|
||||||
|
// m_ui->presetsView->selectionModel()->select(index, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows);
|
||||||
|
m_ui->presetsView->selectionModel()->setCurrentIndex(index, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows);
|
||||||
|
currentRowChanged(index);
|
||||||
|
}
|
||||||
|
@ -1,9 +1,12 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <QSplitter>
|
#include <QSplitter>
|
||||||
|
#include <QSortFilterProxyModel>
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
|
#include "loopstationpresetsmodel.h"
|
||||||
|
|
||||||
namespace Ui { class LoopStationWidget; }
|
namespace Ui { class LoopStationWidget; }
|
||||||
namespace midi { struct MidiMessage; }
|
namespace midi { struct MidiMessage; }
|
||||||
class QNetworkAccessManager;
|
class QNetworkAccessManager;
|
||||||
@ -33,6 +36,7 @@ public slots:
|
|||||||
void midiReceived(const midi::MidiMessage &message);
|
void midiReceived(const midi::MidiMessage &message);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
void currentRowChanged(const QModelIndex ¤t);
|
||||||
void loadPresets();
|
void loadPresets();
|
||||||
void requestFinished();
|
void requestFinished();
|
||||||
void selectFirstPreset();
|
void selectFirstPreset();
|
||||||
@ -40,8 +44,15 @@ private slots:
|
|||||||
void selectNextPreset();
|
void selectNextPreset();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void selectIndex(const QModelIndex &index);
|
||||||
|
|
||||||
const std::unique_ptr<Ui::LoopStationWidget> m_ui;
|
const std::unique_ptr<Ui::LoopStationWidget> m_ui;
|
||||||
|
|
||||||
|
DrumMachineSettings *m_settings{};
|
||||||
|
|
||||||
|
LoopStationPresetsModel m_presetsModel;
|
||||||
|
QSortFilterProxyModel m_presetsProxyModel;
|
||||||
|
|
||||||
QNetworkAccessManager *m_networkAccessManager{};
|
QNetworkAccessManager *m_networkAccessManager{};
|
||||||
|
|
||||||
std::unique_ptr<QNetworkReply> m_reply;
|
std::unique_ptr<QNetworkReply> m_reply;
|
||||||
|
@ -66,7 +66,14 @@
|
|||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QTreeView" name="treeView"/>
|
<widget class="QTreeView" name="presetsView">
|
||||||
|
<property name="rootIsDecorated">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="sortingEnabled">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
|
Reference in New Issue
Block a user