diff --git a/CMakeLists.txt b/CMakeLists.txt index 098ffda..7ca1532 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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) diff --git a/PresetsSettingsPage.qml b/PresetsSettingsPage.qml index d4425d4..0265f7a 100644 --- a/PresetsSettingsPage.qml +++ b/PresetsSettingsPage.qml @@ -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'); } } diff --git a/dmxcontroller.cpp b/dmxcontroller.cpp index af877a1..d7171c9 100644 --- a/dmxcontroller.cpp +++ b/dmxcontroller.cpp @@ -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++; } diff --git a/lightproject.h b/lightproject.h index 5f438b6..a413f7f 100644 --- a/lightproject.h +++ b/lightproject.h @@ -122,6 +122,7 @@ struct PresetConfig { int id; QString name; + int msecsPerStep; std::vector steps; }; diff --git a/presetsmodel.cpp b/presetsmodel.cpp index 09cf76f..ded9b2c 100644 --- a/presetsmodel.cpp +++ b/presetsmodel.cpp @@ -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 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 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="" }) + 1; + iter = presets.insert(iter, PresetConfig{ .id=id++, .name="", .msecsPerStep=1000 }) + 1; } if (auto &presetStates = m_controller->presetStates(); presetStates.size() > row) diff --git a/presetstepsmodel.cpp b/presetstepsmodel.cpp index a8a621d..ee4149e 100644 --- a/presetstepsmodel.cpp +++ b/presetstepsmodel.cpp @@ -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 diff --git a/presetstepsmodel.h b/presetstepsmodel.h index 5822c41..2fd46ba 100644 --- a/presetstepsmodel.h +++ b/presetstepsmodel.h @@ -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; diff --git a/projectloader.cpp b/projectloader.cpp index 3d6e038..947571a 100644 --- a/projectloader.cpp +++ b/projectloader.cpp @@ -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); }