diff --git a/PresetsSettingsPage.qml b/PresetsSettingsPage.qml index 0265f7a..671f92b 100644 --- a/PresetsSettingsPage.qml +++ b/PresetsSettingsPage.qml @@ -212,6 +212,30 @@ ColumnLayout { onPressed: patternMaker.setPattern(nSpinBox.value, kSpinBox.value, registerTypeComboBox.currentValue, valueSlider.value) } } + + RowLayout { + DoubleSpinBox { + id: phaseAdvanceSlider + Layout.preferredWidth: 120 + realFrom: 1 + realTo: 360 + realValue: 60 + } + + SpinBox { + id: generateSteps + Layout.preferredWidth: 120 + from: 1 + to: 1000 + value: 360 + } + + + Button { + text: qsTr('Rainbow') + onPressed: patternMaker.setRainbow(0, phaseAdvanceSlider.realValue / 360.) + } + } } } } diff --git a/patternmaker.cpp b/patternmaker.cpp index 93b52ab..68e2349 100644 --- a/patternmaker.cpp +++ b/patternmaker.cpp @@ -1,4 +1,6 @@ #include "patternmaker.h" +#include +#include void PatternMaker::setController(DmxController *controller) { @@ -138,3 +140,60 @@ void PatternMaker::setPattern(int n, int k, DeviceTypeRegisterType registerType, m_controller->setSliderStates(std::move(sliderStates)); } + +void PatternMaker::setRainbow(float phase, float advancePerLamp) +{ + if (!m_controller) + { + qDebug() << "hilfe" << __LINE__; + return; + } + + const auto &devices = m_controller->lightProject().devices; + + sliders_state_t sliderStates; + sliderStates.reserve(devices.size()); + + int i{}; + for (const auto &device : devices) + { + const auto current_i = i++; + + const auto color = QColor::fromHsvF(fmod(phase,1.),1.,1.); + + std::vector sliderState; + + if (device.deviceTypeId != -1) + { + const auto deviceTypePtr = m_controller->lightProject().deviceTypes.findById(device.deviceTypeId); + if (!deviceTypePtr) + qWarning() << "hilfe" << __LINE__; + else + { + const auto &deviceType = *deviceTypePtr; + sliderState.reserve(deviceType.registers.size()); + + for (const auto ®ister_ : deviceType.registers){ + switch (register_.type) { + case DeviceTypeRegisterType::Red: + sliderState.push_back(color.red()); + break; + case DeviceTypeRegisterType::Green: + sliderState.push_back(color.green()); + break; + case DeviceTypeRegisterType::Blue: + sliderState.push_back(color.blue()); + break; + default: + sliderState.push_back(0); + } + } + } + } + + sliderStates.push_back(std::move(sliderState)); + phase += advancePerLamp; + } + + m_controller->setSliderStates(std::move(sliderStates)); +} diff --git a/patternmaker.h b/patternmaker.h index 794b645..51a6495 100644 --- a/patternmaker.h +++ b/patternmaker.h @@ -21,6 +21,7 @@ public: Q_INVOKABLE void setAllFadersLow(); Q_INVOKABLE void setAllFadersMax(); Q_INVOKABLE void setPattern(int n, int k, DeviceTypeRegisterType registerType, quint8 value); + Q_INVOKABLE void setRainbow(float phase, float advancePerLamp); signals: void controllerChanged(DmxController *controller);