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)
|
project(scheincommander VERSION 0.1 LANGUAGES CXX)
|
||||||
|
|
||||||
set(CMAKE_AUTOMOC ON)
|
set(CMAKE_AUTOMOC ON)
|
||||||
#set(CMAKE_CXX_STANDARD 23)
|
#set(CMAKE_CXX_STANDARD 20)
|
||||||
#set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
#set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
#set(CMAKE_CXX_EXTENSIONS ON)
|
#set(CMAKE_CXX_EXTENSIONS ON)
|
||||||
add_compile_options(-std=c++2b)
|
add_compile_options(-std=c++2b)
|
||||||
|
@ -82,6 +82,13 @@ ColumnLayout {
|
|||||||
text: presetsListView.currentData ? presetsListView.currentData.name : ''
|
text: presetsListView.currentData ? presetsListView.currentData.name : ''
|
||||||
onTextEdited: if (presetsListView.currentData) presetsListView.currentData.name = text; else console.warn('discarded');
|
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 {
|
Item {
|
||||||
@ -145,11 +152,11 @@ ColumnLayout {
|
|||||||
|
|
||||||
Button {
|
Button {
|
||||||
text: qsTr('Auf Schieberegler\nunten kopieren');
|
text: qsTr('Auf Schieberegler\nunten kopieren');
|
||||||
onPressed: presetStepsModel.copyToFaders(presetStepsListView.currentIndex)
|
onPressed: if (!presetStepsModel.copyToFaders(presetStepsListView.currentIndex)) console.warn('failed')
|
||||||
}
|
}
|
||||||
Button {
|
Button {
|
||||||
text: qsTr('Von Schieberegler\nunten kopieren');
|
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()
|
void DmxController::sendDmxBuffer()
|
||||||
{
|
{
|
||||||
const auto now = QDateTime::currentDateTime();
|
const auto now = QDateTime::currentDateTime();
|
||||||
const auto secsSinceEpoch = now.toSecsSinceEpoch();
|
const auto msecsSinceEpoch = now.toMSecsSinceEpoch();
|
||||||
|
|
||||||
char buf[513] {0};
|
char buf[513] {0};
|
||||||
|
|
||||||
@ -252,7 +252,11 @@ void DmxController::sendDmxBuffer()
|
|||||||
continue;
|
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);
|
apply(sliders, *iter);
|
||||||
iter++;
|
iter++;
|
||||||
}
|
}
|
||||||
|
@ -122,6 +122,7 @@ struct PresetConfig
|
|||||||
{
|
{
|
||||||
int id;
|
int id;
|
||||||
QString name;
|
QString name;
|
||||||
|
int msecsPerStep;
|
||||||
std::vector<PresetStepConfig> steps;
|
std::vector<PresetStepConfig> steps;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
enum {
|
enum {
|
||||||
IdRole = Qt::UserRole,
|
IdRole = Qt::UserRole,
|
||||||
|
MsecsPerStepRole
|
||||||
};
|
};
|
||||||
|
|
||||||
void PresetsModel::setController(DmxController *controller)
|
void PresetsModel::setController(DmxController *controller)
|
||||||
@ -92,6 +93,7 @@ QVariant PresetsModel::data(const QModelIndex &index, int role) const
|
|||||||
case Qt::DisplayRole:
|
case Qt::DisplayRole:
|
||||||
case Qt::EditRole: return preset.name;
|
case Qt::EditRole: return preset.name;
|
||||||
case IdRole: return preset.id;
|
case IdRole: return preset.id;
|
||||||
|
case MsecsPerStepRole: return preset.msecsPerStep;
|
||||||
}
|
}
|
||||||
|
|
||||||
return {};
|
return {};
|
||||||
@ -129,7 +131,8 @@ QMap<int, QVariant> PresetsModel::itemData(const QModelIndex &index) const
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
{ Qt::DisplayRole, preset.name },
|
{ Qt::DisplayRole, preset.name },
|
||||||
{ IdRole, preset.id }
|
{ IdRole, preset.id },
|
||||||
|
{ MsecsPerStepRole, preset.msecsPerStep }
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -137,7 +140,8 @@ QHash<int, QByteArray> PresetsModel::roleNames() const
|
|||||||
{
|
{
|
||||||
return {
|
return {
|
||||||
{ Qt::DisplayRole, "name" },
|
{ Qt::DisplayRole, "name" },
|
||||||
{ IdRole, "id" }
|
{ IdRole, "id" },
|
||||||
|
{ MsecsPerStepRole, "msecsPerStep" }
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -199,6 +203,15 @@ bool PresetsModel::setData(const QModelIndex &index, const QVariant &value, int
|
|||||||
// return true;
|
// return true;
|
||||||
qWarning() << "hilfe" << __LINE__;
|
qWarning() << "hilfe" << __LINE__;
|
||||||
return false;
|
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:
|
default:
|
||||||
qWarning() << "hilfe" << __LINE__;
|
qWarning() << "hilfe" << __LINE__;
|
||||||
return false;
|
return false;
|
||||||
@ -243,7 +256,7 @@ bool PresetsModel::insertRows(int row, int count, const QModelIndex &parent)
|
|||||||
{
|
{
|
||||||
auto iter = std::begin(presets) + row;
|
auto iter = std::begin(presets) + row;
|
||||||
for (auto i = 0; i < count; i++)
|
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)
|
if (auto &presetStates = m_controller->presetStates(); presetStates.size() > row)
|
||||||
|
@ -47,67 +47,73 @@ void PresetStepsModel::setPresetId(int presetId)
|
|||||||
emit presetIdChanged(m_presetId);
|
emit presetIdChanged(m_presetId);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PresetStepsModel::copyFromFaders(int stepIndex)
|
bool PresetStepsModel::copyFromFaders(int stepIndex)
|
||||||
{
|
{
|
||||||
if (!m_controller)
|
if (!m_controller)
|
||||||
{
|
{
|
||||||
qDebug() << "hilfe" << __LINE__;
|
qDebug() << "hilfe" << __LINE__;
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_presetId == -1)
|
if (m_presetId == -1)
|
||||||
{
|
{
|
||||||
qDebug() << "hilfe" << __LINE__;
|
qDebug() << "hilfe" << __LINE__;
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto presetPtr = m_controller->lightProject().presets.findById(m_presetId);
|
auto presetPtr = m_controller->lightProject().presets.findById(m_presetId);
|
||||||
if (!presetPtr)
|
if (!presetPtr)
|
||||||
{
|
{
|
||||||
qDebug() << "hilfe" << __LINE__;
|
qDebug() << "hilfe" << __LINE__;
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto &preset = *presetPtr;
|
auto &preset = *presetPtr;
|
||||||
|
auto &steps = preset.steps;
|
||||||
|
|
||||||
{
|
{
|
||||||
QMutexLocker locker{&m_controller->mutex()};
|
QMutexLocker locker{&m_controller->mutex()};
|
||||||
// TODO respect stepIndex
|
if (steps.size() <= stepIndex)
|
||||||
preset.steps = { { .sliders=m_controller->sliderStates() } };
|
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)
|
if (!m_controller)
|
||||||
{
|
{
|
||||||
qDebug() << "hilfe" << __LINE__;
|
qDebug() << "hilfe" << __LINE__;
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_presetId == -1)
|
if (m_presetId == -1)
|
||||||
{
|
{
|
||||||
qDebug() << "hilfe" << __LINE__;
|
qDebug() << "hilfe" << __LINE__;
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto presetPtr = m_controller->lightProject().presets.findById(m_presetId);
|
const auto presetPtr = m_controller->lightProject().presets.findById(m_presetId);
|
||||||
if (!presetPtr)
|
if (!presetPtr)
|
||||||
{
|
{
|
||||||
qDebug() << "hilfe" << __LINE__;
|
qDebug() << "hilfe" << __LINE__;
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto &preset = *presetPtr;
|
const auto &preset = *presetPtr;
|
||||||
|
auto &steps = preset.steps;
|
||||||
|
|
||||||
// TODO respect stepIndex
|
if (steps.size() <= stepIndex)
|
||||||
if (preset.steps.empty())
|
|
||||||
{
|
{
|
||||||
qDebug() << "hilfe" << __LINE__;
|
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
|
int PresetStepsModel::rowCount(const QModelIndex &parent) const
|
||||||
|
@ -22,8 +22,8 @@ public:
|
|||||||
int presetId() const { return m_presetId; }
|
int presetId() const { return m_presetId; }
|
||||||
void setPresetId(int presetId);
|
void setPresetId(int presetId);
|
||||||
|
|
||||||
Q_INVOKABLE void copyFromFaders(int stepIndex);
|
Q_INVOKABLE bool copyFromFaders(int stepIndex);
|
||||||
Q_INVOKABLE void copyToFaders(int stepIndex);
|
Q_INVOKABLE bool copyToFaders(int stepIndex);
|
||||||
|
|
||||||
int rowCount(const QModelIndex &parent) const override;
|
int rowCount(const QModelIndex &parent) const override;
|
||||||
QVariant data(const QModelIndex &index, int role) 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("id", ref.id);
|
||||||
cb("name", ref.name);
|
cb("name", ref.name);
|
||||||
|
cb("msecsPerStep", ref.msecsPerStep);
|
||||||
cb("steps", ref.steps);
|
cb("steps", ref.steps);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user