Multi step animations

This commit is contained in:
2023-03-04 23:37:45 +01:00
parent 78430ebb6f
commit 588f5e1d39
8 changed files with 60 additions and 28 deletions

View File

@ -3,7 +3,7 @@ cmake_minimum_required(VERSION 3.16)
project(scheincommander VERSION 0.1 LANGUAGES CXX)
set(CMAKE_AUTOMOC ON)
#set(CMAKE_CXX_STANDARD 23)
#set(CMAKE_CXX_STANDARD 20)
#set(CMAKE_CXX_STANDARD_REQUIRED ON)
#set(CMAKE_CXX_EXTENSIONS ON)
add_compile_options(-std=c++2b)

View File

@ -82,6 +82,13 @@ ColumnLayout {
text: presetsListView.currentData ? presetsListView.currentData.name : ''
onTextEdited: if (presetsListView.currentData) presetsListView.currentData.name = text; else console.warn('discarded');
}
Label { text: qsTr("MSecsPerStep:") }
SpinBox {
editable: true
to: 999999
value: presetsListView.currentData ? presetsListView.currentData.msecsPerStep : -1
onValueModified: if (presetsListView.currentData) presetsListView.currentData.msecsPerStep = value; else console.warn('discarded');
}
}
Item {
@ -145,11 +152,11 @@ ColumnLayout {
Button {
text: qsTr('Auf Schieberegler\nunten kopieren');
onPressed: presetStepsModel.copyToFaders(presetStepsListView.currentIndex)
onPressed: if (!presetStepsModel.copyToFaders(presetStepsListView.currentIndex)) console.warn('failed')
}
Button {
text: qsTr('Von Schieberegler\nunten kopieren');
onPressed: presetStepsModel.copyFromFaders(presetStepsListView.currentIndex)
onPressed: if (!presetStepsModel.copyFromFaders(presetStepsListView.currentIndex)) console.warn('failed');
}
}

View File

@ -174,7 +174,7 @@ void DmxController::setSliderStates(const sliders_state_t &sliderStates)
void DmxController::sendDmxBuffer()
{
const auto now = QDateTime::currentDateTime();
const auto secsSinceEpoch = now.toSecsSinceEpoch();
const auto msecsSinceEpoch = now.toMSecsSinceEpoch();
char buf[513] {0};
@ -252,7 +252,11 @@ void DmxController::sendDmxBuffer()
continue;
}
const auto &sliders = preset.steps[secsSinceEpoch % preset.steps.size()].sliders;
const auto &steps = preset.steps;
const auto &sliders = (steps.size() == 1 ?
steps.front() :
steps[msecsSinceEpoch / (preset.msecsPerStep ? preset.msecsPerStep : 100) % steps.size()]
).sliders;
apply(sliders, *iter);
iter++;
}

View File

@ -122,6 +122,7 @@ struct PresetConfig
{
int id;
QString name;
int msecsPerStep;
std::vector<PresetStepConfig> steps;
};

View File

@ -7,6 +7,7 @@
enum {
IdRole = Qt::UserRole,
MsecsPerStepRole
};
void PresetsModel::setController(DmxController *controller)
@ -90,8 +91,9 @@ QVariant PresetsModel::data(const QModelIndex &index, int role) const
switch (role)
{
case Qt::DisplayRole:
case Qt::EditRole: return preset.name;
case IdRole: return preset.id;
case Qt::EditRole: return preset.name;
case IdRole: return preset.id;
case MsecsPerStepRole: return preset.msecsPerStep;
}
return {};
@ -128,16 +130,18 @@ QMap<int, QVariant> PresetsModel::itemData(const QModelIndex &index) const
const auto &preset = presets.at(index.row());
return {
{ Qt::DisplayRole, preset.name },
{ IdRole, preset.id }
{ Qt::DisplayRole, preset.name },
{ IdRole, preset.id },
{ MsecsPerStepRole, preset.msecsPerStep }
};
}
QHash<int, QByteArray> PresetsModel::roleNames() const
{
return {
{ Qt::DisplayRole, "name" },
{ IdRole, "id" }
{ Qt::DisplayRole, "name" },
{ IdRole, "id" },
{ MsecsPerStepRole, "msecsPerStep" }
};
}
@ -199,6 +203,15 @@ bool PresetsModel::setData(const QModelIndex &index, const QVariant &value, int
// return true;
qWarning() << "hilfe" << __LINE__;
return false;
case MsecsPerStepRole:
if (value.userType() != QMetaType::Int)
{
qWarning() << "hilfe" << __LINE__ << value.userType();
return false;
}
preset.msecsPerStep = value.toInt();
emit dataChanged(index, index, { MsecsPerStepRole });
return true;
default:
qWarning() << "hilfe" << __LINE__;
return false;
@ -243,7 +256,7 @@ bool PresetsModel::insertRows(int row, int count, const QModelIndex &parent)
{
auto iter = std::begin(presets) + row;
for (auto i = 0; i < count; i++)
iter = presets.insert(iter, PresetConfig{ .id=id++, .name="<neu>" }) + 1;
iter = presets.insert(iter, PresetConfig{ .id=id++, .name="<neu>", .msecsPerStep=1000 }) + 1;
}
if (auto &presetStates = m_controller->presetStates(); presetStates.size() > row)

View File

@ -47,67 +47,73 @@ void PresetStepsModel::setPresetId(int presetId)
emit presetIdChanged(m_presetId);
}
void PresetStepsModel::copyFromFaders(int stepIndex)
bool PresetStepsModel::copyFromFaders(int stepIndex)
{
if (!m_controller)
{
qDebug() << "hilfe" << __LINE__;
return;
return false;
}
if (m_presetId == -1)
{
qDebug() << "hilfe" << __LINE__;
return;
return false;
}
auto presetPtr = m_controller->lightProject().presets.findById(m_presetId);
if (!presetPtr)
{
qDebug() << "hilfe" << __LINE__;
return;
return false;
}
auto &preset = *presetPtr;
auto &steps = preset.steps;
{
QMutexLocker locker{&m_controller->mutex()};
// TODO respect stepIndex
preset.steps = { { .sliders=m_controller->sliderStates() } };
if (steps.size() <= stepIndex)
steps.resize(stepIndex + 1);
steps[stepIndex].sliders = m_controller->sliderStates();
}
return true;
}
void PresetStepsModel::copyToFaders(int stepIndex)
bool PresetStepsModel::copyToFaders(int stepIndex)
{
if (!m_controller)
{
qDebug() << "hilfe" << __LINE__;
return;
return false;
}
if (m_presetId == -1)
{
qDebug() << "hilfe" << __LINE__;
return;
return false;
}
const auto presetPtr = m_controller->lightProject().presets.findById(m_presetId);
if (!presetPtr)
{
qDebug() << "hilfe" << __LINE__;
return;
return false;
}
const auto &preset = *presetPtr;
auto &steps = preset.steps;
// TODO respect stepIndex
if (preset.steps.empty())
if (steps.size() <= stepIndex)
{
qDebug() << "hilfe" << __LINE__;
return;
return false;
}
m_controller->setSliderStates(preset.steps.front().sliders);
m_controller->setSliderStates(preset.steps.at(stepIndex).sliders);
return true;
}
int PresetStepsModel::rowCount(const QModelIndex &parent) const

View File

@ -22,8 +22,8 @@ public:
int presetId() const { return m_presetId; }
void setPresetId(int presetId);
Q_INVOKABLE void copyFromFaders(int stepIndex);
Q_INVOKABLE void copyToFaders(int stepIndex);
Q_INVOKABLE bool copyFromFaders(int stepIndex);
Q_INVOKABLE bool copyToFaders(int stepIndex);
int rowCount(const QModelIndex &parent) const override;
QVariant data(const QModelIndex &index, int role) const override;

View File

@ -101,6 +101,7 @@ void iterateMembers(T &ref, CB &&cb)
{
cb("id", ref.id);
cb("name", ref.name);
cb("msecsPerStep", ref.msecsPerStep);
cb("steps", ref.steps);
}