Presets now have steps instead of a single slider state

This commit is contained in:
2023-02-26 23:11:35 +01:00
parent 922a96a34d
commit dd7a4f531b
5 changed files with 69 additions and 38 deletions

View File

@ -375,7 +375,9 @@ bool DevicesModel::insertRows(int row, int count, const QModelIndex &parent)
for (auto &preset : m_controller->lightProject().presets)
{
auto &sliderStates = preset.sliders;
for (auto &step : preset.steps)
{
auto &sliderStates = step.sliders;
if (sliderStates.size() > row)
{
sliderStates.insert(std::begin(sliderStates) + row, count, {});
@ -383,6 +385,7 @@ bool DevicesModel::insertRows(int row, int count, const QModelIndex &parent)
}
}
}
}
endInsertRows();
disconnect(m_controller, &DmxController::deviceInserted,
@ -448,7 +451,8 @@ bool DevicesModel::removeRows(int row, int count, const QModelIndex &parent)
for (auto &preset : m_controller->lightProject().presets)
{
if (auto &sliderStates = preset.sliders; sliderStates.size() > row)
for (auto &step : preset.steps)
if (auto &sliderStates = step.sliders; sliderStates.size() > row)
{
auto begin = std::begin(sliderStates) + row;
auto end = begin + std::min<size_t>(count, sliderStates.size() - row + count);

View File

@ -10,18 +10,6 @@
#include "projectloader.h"
void doFun(auto &y)
{
return;
double i{-10};
for (auto &x : y.devices)
{
x.position.setX(i);
x.position.setZ(std::sin(i / 2.) * 10.);
i += 20./double(y.devices.size());
}
}
DmxController::DmxController(ScheinCommanderSettings &settings, QObject *parent) :
QObject{parent},
m_settings{settings},
@ -181,7 +169,6 @@ DmxController::DmxController(ScheinCommanderSettings &settings, QObject *parent)
}
}
{
doFun(m_lightProject);
}
bool DmxController::start()
@ -253,12 +240,10 @@ bool DmxController::loadProject(const QString &name)
}
else
{
qDebug() << proj.error();
qFatal("loading project failed: %s", qPrintable(proj.error()));
return false;
}
doFun(m_lightProject);
return true;
}
@ -342,6 +327,7 @@ void DmxController::setSliderStates(const sliders_state_t &sliderStates)
void DmxController::sendDmxBuffer()
{
const auto now = QDateTime::currentDateTime();
const auto secsSinceEpoch = now.toSecsSinceEpoch();
char buf[513] {0};
@ -413,7 +399,14 @@ void DmxController::sendDmxBuffer()
iter++;
continue;
}
apply(preset.sliders, *iter);
if (preset.steps.empty())
{
iter++;
continue;
}
const auto &sliders = preset.steps[secsSinceEpoch % preset.steps.size()].sliders;
apply(sliders, *iter);
iter++;
}
}

View File

@ -113,11 +113,16 @@ public:
using sliders_state_t = std::vector<std::vector<quint8>>;
struct PresetStepConfig
{
sliders_state_t sliders;
};
struct PresetConfig
{
int id;
QString name;
sliders_state_t sliders;
std::vector<PresetStepConfig> steps;
};
class PresetsContainer : public std::vector<PresetConfig>

View File

@ -62,7 +62,7 @@ void PresetModel::copyFromFaders()
{
QMutexLocker locker{&m_controller->mutex()};
preset.sliders = m_controller->sliderStates();
preset.steps = { { .sliders=m_controller->sliderStates() } };
}
}
@ -89,7 +89,13 @@ void PresetModel::copyToFaders()
const auto &preset = *presetPtr;
m_controller->setSliderStates(preset.sliders);
if (preset.steps.empty())
{
qDebug() << "hilfe" << __LINE__;
return;
}
m_controller->setSliderStates(preset.steps.front().sliders);
}
void PresetModel::setAllFadersLow()

View File

@ -34,7 +34,8 @@ concept LoadableFromObject = std::same_as<T, LightProject> ||
std::same_as<T, DeviceConfig> ||
std::same_as<T, DeviceTypeConfig> ||
std::same_as<T, DeviceTypeRegisterConfig> ||
std::same_as<T, PresetConfig>;
std::same_as<T, PresetConfig> ||
std::same_as<T, PresetStepConfig>;
template<typename T>
concept JsonNumber = (std::integral<T> && !std::same_as<T, bool> && !std::is_enum_v<T>) ||
@ -245,6 +246,17 @@ std::expected<T, QString> load(const QJsonObject &json) {
return dc;
}
template<std::same_as<PresetStepConfig> T>
std::expected<T, QString> load(const QJsonObject &json) {
PresetStepConfig rgc;
if (auto val = loadIfExists<decltype(rgc.sliders)>(json, "sliders"); val) {
rgc.sliders = val.value();
} else {
return std::unexpected(QString("sliders: %1").arg(val.error()));
}
return rgc;
}
template<std::same_as<PresetConfig> T>
std::expected<T, QString> load(const QJsonObject &json) {
PresetConfig rgc;
@ -258,10 +270,10 @@ std::expected<T, QString> load(const QJsonObject &json) {
} else {
return std::unexpected(QString("name: %1").arg(val.error()));
}
if (auto val = loadIfExists<decltype(rgc.sliders)>(json, "sliders"); val) {
rgc.sliders = val.value();
if (auto val = loadIfExists<decltype(rgc.steps)>(json, "steps"); val) {
rgc.steps = val.value();
} else {
return std::unexpected(QString("sliders: %1").arg(val.error()));
return std::unexpected(QString("steps: %1").arg(val.error()));
}
return rgc;
@ -392,6 +404,17 @@ std::expected<QJsonObject, QString> save(const T &val) {
return json;
}
template<std::same_as<PresetStepConfig> T>
std::expected<QJsonObject, QString> save(const T &val) {
QJsonObject json;
if (auto sliders = save<decltype(val.sliders)>(val.sliders); sliders) {
json["sliders"] = sliders.value();
} else {
return std::unexpected(QString("sliders: %1").arg(sliders.error()));
}
return json;
}
template<std::same_as<PresetConfig> T>
std::expected<QJsonObject, QString> save(const T &val) {
QJsonObject json;
@ -405,10 +428,10 @@ std::expected<QJsonObject, QString> save(const T &val) {
} else {
return std::unexpected(QString("name: %1").arg(name.error()));
}
if (auto sliders = save<decltype(val.sliders)>(val.sliders); sliders) {
json["sliders"] = sliders.value();
if (auto steps = save<decltype(val.steps)>(val.steps); steps) {
json["steps"] = steps.value();
} else {
return std::unexpected(QString("sliders: %1").arg(sliders.error()));
return std::unexpected(QString("steps: %1").arg(steps.error()));
}
return json;