Multi step animations
This commit is contained in:
@ -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)
|
||||
|
@ -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');
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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++;
|
||||
}
|
||||
|
@ -122,6 +122,7 @@ struct PresetConfig
|
||||
{
|
||||
int id;
|
||||
QString name;
|
||||
int msecsPerStep;
|
||||
std::vector<PresetStepConfig> steps;
|
||||
};
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user