From 79cc570347cc48e2abd69cfcd006b8f911d3b8fc Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 Date: Mon, 20 Feb 2023 00:36:55 +0100 Subject: [PATCH] Implement basic register group saving --- CMakeLists.txt | 2 + HomePage.qml | 69 +++---------- LightControlWindow.qml | 9 +- LightSliderPane.qml | 39 ++------ RegisterGroupsSettingsPage.qml | 34 ++++++- deviceregistervaluehelper.cpp | 144 +++++++++++++++++++++++++++ deviceregistervaluehelper.h | 44 +++++++++ devicesmodel.cpp | 2 +- devicetypesmodel.cpp | 2 + dmxcontroller.cpp | 41 +++++--- dmxcontroller.h | 11 ++- lightproject.h | 53 +++++++++- registergroupmodel.cpp | 174 +++++++++++++++++++++++++++++++++ registergroupmodel.h | 35 +++++++ registergroupsmodel.cpp | 2 + 15 files changed, 547 insertions(+), 114 deletions(-) create mode 100644 deviceregistervaluehelper.cpp create mode 100644 deviceregistervaluehelper.h create mode 100644 registergroupmodel.cpp create mode 100644 registergroupmodel.h diff --git a/CMakeLists.txt b/CMakeLists.txt index bc941bf..318fde6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,6 +19,8 @@ qt_add_executable(applightcontrol devicesmodel.h devicesmodel.cpp devicetyperegistersmodel.h devicetyperegistersmodel.cpp registergroupsmodel.h registergroupsmodel.cpp + deviceregistervaluehelper.h deviceregistervaluehelper.cpp + registergroupmodel.h registergroupmodel.cpp ) qt_add_qml_module(applightcontrol diff --git a/HomePage.qml b/HomePage.qml index 0e0944a..73e9e88 100644 --- a/HomePage.qml +++ b/HomePage.qml @@ -2,6 +2,8 @@ import QtQuick import QtQuick.Controls.Material import QtQuick.Layouts +import lightcontrol + Item { id: homePage @@ -25,66 +27,23 @@ Item { } } - ColumnLayout { + Flow{ anchors.fill: parent + flow: Flow.TopToBottom - GridLayout { - Layout.fillWidth: true - - columns: 2 - - Label { - text: qsTr("Alle Dimmer:") + Repeater { + model: RegisterGroupsModel { + controller: __controller } - DmxSlider { - onValueChanged: window.masterDimmer = value + delegate: RowLayout { + Label { + text: model.name + } + DmxSlider { + onValueChanged: __controller.setRegisterGroup(model.id, value); + } } - - Label { - text: qsTr("Alle Rot:") - } - - DmxSlider { - onValueChanged: window.masterRed = value - } - - Label { - text: qsTr("Alle Grün:") - } - - DmxSlider { - onValueChanged: window.masterGreen = value - } - - Label { - text: qsTr("Alle Blau:") - } - - DmxSlider { - onValueChanged: window.masterBlue = value - } - - Label { - text: qsTr("Alle Weiß:") - } - - DmxSlider { - onValueChanged: window.masterWhite = value - } - - Label { - text: qsTr("Alle Strobo:") - } - - DmxSlider { - onValueChanged: window.masterStrobo = value - } - } - - Item { - Layout.fillWidth: true - Layout.fillHeight: true } } } diff --git a/LightControlWindow.qml b/LightControlWindow.qml index 7873c68..a80d483 100644 --- a/LightControlWindow.qml +++ b/LightControlWindow.qml @@ -12,18 +12,11 @@ ApplicationWindow { Material.theme: Material.Dark Material.accent: Material.Purple - property int masterDimmer - property int masterRed - property int masterGreen - property int masterBlue - property int masterWhite - property int masterStrobo - ColumnLayout { anchors.left: parent.left anchors.top: parent.top anchors.right: parent.right - anchors.bottom: lampRegistersPanel.top + height: window.height - (lampRegistersPanel.active ? lampRegistersPanel.height : 0) StatusBar { Layout.fillWidth: true diff --git a/LightSliderPane.qml b/LightSliderPane.qml index 725ab37..3eee413 100644 --- a/LightSliderPane.qml +++ b/LightSliderPane.qml @@ -1,8 +1,6 @@ import QtQuick import QtQuick.Controls.Material import QtQuick.Layouts -import QtQuick.Window -import QtQuick.VirtualKeyboard import lightcontrol @@ -41,39 +39,22 @@ Pane { horizontalAlignment: Text.AlignHCenter } + DeviceRegisterValueHelper { + id: helper + controller: __controller + deviceId: light.id + registerIndex: index + value: slider.value + } + DmxSlider { id: slider Layout.fillWidth: true Layout.fillHeight: true + value: helper.value + orientation: Qt.Vertical - - onValueChanged: __controller.setChannel(registerAddress, value) - - Binding on value { - value: masterDimmer - when: model.registerType === DeviceTypeRegisterType.Dimmer - } - Binding on value { - value: masterRed - when: model.registerType === DeviceTypeRegisterType.Red - } - Binding on value { - value: masterGreen - when: model.registerType === DeviceTypeRegisterType.Green - } - Binding on value { - value: masterBlue - when: model.registerType === DeviceTypeRegisterType.Blue - } - Binding on value { - value: masterWhite - when: model.registerType === DeviceTypeRegisterType.White - } - Binding on value { - value: masterStrobo - when: model.registerType === DeviceTypeRegisterType.Strobo - } } Label { diff --git a/RegisterGroupsSettingsPage.qml b/RegisterGroupsSettingsPage.qml index eeb6096..5cc9977 100644 --- a/RegisterGroupsSettingsPage.qml +++ b/RegisterGroupsSettingsPage.qml @@ -65,8 +65,8 @@ ColumnLayout { enabled: listView.currentIndex !== -1 GridLayout { - Layout.preferredWidth: 600 - Layout.maximumWidth: 600 + Layout.preferredWidth: 300 + Layout.maximumWidth: 300 columns: 2 @@ -84,6 +84,36 @@ ColumnLayout { onTextEdited: if (listView.currentData) listView.currentData.name = text; else console.warn('discarded'); } } + + GridLayout { + Layout.fillWidth: true + + columns: 2 + + RegisterGroupModel { + id: registerGroupModel + controller: __controller + registerGroupId: listView.currentData ? listView.currentData.id : -1 + } + + Button { + text: qsTr('Auf Schieberegler\nunten kopieren'); + onPressed: registerGroupModel.copyToFaders() + } + Button { + text: qsTr('Von Schieberegler\nunten kopieren'); + onPressed: registerGroupModel.copyFromFaders() + } + Button { + text: qsTr('Alle auf\n0 setzen'); + onPressed: registerGroupModel.setAllFadersLow() + } + Button { + text: qsTr('Alle auf\nMaximum setzen'); + onPressed: registerGroupModel.setAllFadersMax() + } + } + Item { Layout.fillHeight: true } diff --git a/deviceregistervaluehelper.cpp b/deviceregistervaluehelper.cpp new file mode 100644 index 0000000..d767ad1 --- /dev/null +++ b/deviceregistervaluehelper.cpp @@ -0,0 +1,144 @@ +#include "deviceregistervaluehelper.h" + +#include +#include +#include + +void DeviceRegisterValueHelper::setController(DmxController *controller) +{ + if (m_controller == controller) + return; + + if (m_controller) + { + disconnect(m_controller, &DmxController::sliderStatesChanged, + this, &DeviceRegisterValueHelper::sliderStatesChanged); + } + + m_controller = controller; + + if (m_controller) + { + connect(m_controller, &DmxController::sliderStatesChanged, + this, &DeviceRegisterValueHelper::sliderStatesChanged); + } + + emit controllerChanged(m_controller); +} + +void DeviceRegisterValueHelper::setDeviceId(int deviceId) +{ + if (m_deviceId == deviceId) + return; + + m_deviceId = deviceId; + + emit deviceIdChanged(m_deviceId); +} + +void DeviceRegisterValueHelper::setRegisterIndex(int registerIndex) +{ + if (m_registerIndex == registerIndex) + return; + + m_registerIndex = registerIndex; + + emit registerIndexChanged(m_registerIndex); +} + +quint8 DeviceRegisterValueHelper::value() const +{ + if (!m_controller) + { +// qDebug() << "hilfe" << __LINE__; + return 0; + } + if (m_deviceId == -1) + { + qDebug() << "hilfe" << __LINE__; + return 0; + } + if (m_registerIndex == -1) + { + qDebug() << "hilfe" << __LINE__; + return 0; + } + + const auto &devices = m_controller->lightProject().devices; + auto devicePtr = devices.findById(m_deviceId); + if (!devicePtr) + { + qDebug() << "hilfe" << __LINE__; + return 0; + } + + const auto index = devicePtr - &*std::cbegin(devices); + + const auto &sliderStates = m_controller->sliderStates(); + + if (sliderStates.size() <= index) + return 0; + + const auto &sliderState = sliderStates.at(index); + + if (sliderState.size() <= m_registerIndex) + return 0; + + return sliderState.at(m_registerIndex); +} + +void DeviceRegisterValueHelper::setValue(quint8 value) +{ + if (m_deviceId == -1) + { +// qDebug() << "hilfe" << __LINE__; + return; + } + if (m_registerIndex == -1) + { + qDebug() << "hilfe" << __LINE__; + return; + } + if (m_registerIndex == -1) + { + qDebug() << "hilfe" << __LINE__; + return; + } + + const auto &devices = m_controller->lightProject().devices; + auto devicePtr = devices.findById(m_deviceId); + if (!devicePtr) + { + qDebug() << "hilfe" << __LINE__; + return; + } + + const auto index = devicePtr - &*std::cbegin(devices); + + auto &sliderStates = m_controller->sliderStates(); + + if (sliderStates.size() <= index) + sliderStates.resize(index + 1); + + auto &sliderState = sliderStates.at(index); + + if (sliderState.size() <= m_registerIndex) + sliderState.resize(m_registerIndex + 1); + + sliderState[m_registerIndex] = value; + emit valueChanged(value); +} + +void DeviceRegisterValueHelper::sliderStatesChanged() +{ + emit valueChanged(value()); +} + +namespace { +void registrierDenShit() +{ + qmlRegisterType("lightcontrol", 1, 0, "DeviceRegisterValueHelper"); +} +} +Q_COREAPP_STARTUP_FUNCTION(registrierDenShit) + diff --git a/deviceregistervaluehelper.h b/deviceregistervaluehelper.h new file mode 100644 index 0000000..bb65142 --- /dev/null +++ b/deviceregistervaluehelper.h @@ -0,0 +1,44 @@ +#pragma once + +#include + +#include "dmxcontroller.h" + +class DeviceRegisterValueHelper : public QObject +{ + Q_OBJECT + Q_PROPERTY(DmxController* controller READ controller WRITE setController NOTIFY controllerChanged) + Q_PROPERTY(int deviceId READ deviceId WRITE setDeviceId NOTIFY deviceIdChanged) + Q_PROPERTY(int registerIndex READ registerIndex WRITE setRegisterIndex NOTIFY registerIndexChanged) + Q_PROPERTY(quint8 value READ value WRITE setValue NOTIFY valueChanged) + +public: + using QObject::QObject; + + DmxController *controller() { return m_controller; } + const DmxController *controller() const { return m_controller; } + void setController(DmxController *controller); + + int deviceId() const { return m_deviceId; } + void setDeviceId(int deviceId); + + int registerIndex() const { return m_registerIndex; } + void setRegisterIndex(int registerIndex); + + quint8 value() const; + void setValue(quint8 value); + +signals: + void controllerChanged(DmxController *controller); + void deviceIdChanged(int deviceId); + void registerIndexChanged(int registerIndex); + void valueChanged(quint8 registerIndex); + +private slots: + void sliderStatesChanged(); + +private: + DmxController *m_controller{}; + int m_deviceId{-1}; + int m_registerIndex{-1}; +}; diff --git a/devicesmodel.cpp b/devicesmodel.cpp index 7907e8c..63ba6b4 100644 --- a/devicesmodel.cpp +++ b/devicesmodel.cpp @@ -307,7 +307,7 @@ bool DevicesModel::insertRows(int row, int count, const QModelIndex &parent) beginInsertRows({}, row, row+count-1); auto iter = std::begin(devices) + row; for (auto i = 0; i < count; i++) - iter = devices.insert(iter, LightConfig{ .id=id++, .name="", .deviceTypeId=0, .address=0, .position={} }) + 1; + iter = devices.insert(iter, DeviceConfig{ .id=id++, .name="", .deviceTypeId=0, .address=0, .position={} }) + 1; endInsertRows(); disconnect(m_controller, &DmxController::deviceInserted, diff --git a/devicetypesmodel.cpp b/devicetypesmodel.cpp index 1482bbe..d2d36db 100644 --- a/devicetypesmodel.cpp +++ b/devicetypesmodel.cpp @@ -1,5 +1,7 @@ #include "devicetypesmodel.h" +#include + #include #include #include diff --git a/dmxcontroller.cpp b/dmxcontroller.cpp index a68f1d3..1ec765f 100644 --- a/dmxcontroller.cpp +++ b/dmxcontroller.cpp @@ -95,32 +95,32 @@ DmxController::DmxController(QObject *parent) : { .id=11, .name="Lampe 12", .deviceTypeId=4, .address=78 }, { .id=12, .name="Lampe 13", .deviceTypeId=4, .address=85 }, { .id=13, .name="Test 1", .deviceTypeId=1, .address=95 }, - { .id=14, .name="Test 2", .deviceTypeId=2, .address=120 }, - { .id=15, .name="Moving Head 1", .deviceTypeId=0, .address=150 }, - { .id=16, .name="Moving Head 2", .deviceTypeId=0, .address=160 }, - { .id=17, .name="Moving Head 3", .deviceTypeId=0, .address=170 }, - { .id=18, .name="Moving Head 4", .deviceTypeId=0, .address=180 }, - { .id=19, .name="Nebelmaschine", .deviceTypeId=3, .address=200 } + { .id=14, .name="Test 2", .deviceTypeId=2, .address=105 }, + { .id=15, .name="Moving Head 1", .deviceTypeId=0, .address=115 }, + { .id=16, .name="Moving Head 2", .deviceTypeId=0, .address=131 }, + { .id=17, .name="Moving Head 3", .deviceTypeId=0, .address=147 }, + { .id=18, .name="Moving Head 4", .deviceTypeId=0, .address=163 }, + { .id=19, .name="Nebelmaschine", .deviceTypeId=3, .address=179 } }, .registerGroups { - { .id=0, .name="Alle Dimmmer" }, + { .id=0, .name="Alle Dimmer" }, { .id=1, .name="Alle Roten" }, { .id=2, .name="Alle Grünen" }, { .id=3, .name="Alle Blauen" }, { .id=4, .name="Alle Weißen" }, - { .id=5, .name="Alle Shutter" }, - { .id=6, .name="2n Dimmmer" }, + { .id=5, .name="Alle Shutter" }, + { .id=6, .name="2n Dimmer" }, { .id=7, .name="2n Roten" }, { .id=8, .name="2n Grünen" }, { .id=9, .name="2n Blauen" }, { .id=10, .name="2n Weißen" }, - { .id=11, .name="2n Shutter" }, - { .id=12, .name="2n+1 Dimmmer" }, + { .id=11, .name="2n Shutter" }, + { .id=12, .name="2n+1 Dimmer" }, { .id=13, .name="2n+1 Roten" }, { .id=14, .name="2n+1 Grünen" }, { .id=15, .name="2n+1 Blauen" }, { .id=16, .name="2n+1 Weißen" }, - { .id=17, .name="2n+1 Shutter" }, + { .id=17, .name="2n+1 Shutter" }, } } { @@ -166,10 +166,21 @@ bool DmxController::start() return true; } -void DmxController::setChannel(int channel, int value) +void DmxController::setRegisterGroup(int registerGroupId, quint8 value) { - Q_ASSERT(channel >= 0 && channel < std::size(buf)); - buf[channel] = value; + qDebug() << registerGroupId << value; +} + +void DmxController::setSliderStates(sliders_state_t &&sliderStates) +{ + m_sliderStates = std::move(sliderStates); + emit sliderStatesChanged(m_sliderStates); +} + +void DmxController::setSliderStates(const sliders_state_t &sliderStates) +{ + m_sliderStates = sliderStates; + emit sliderStatesChanged(m_sliderStates); } void DmxController::sendDmxBuffer() diff --git a/dmxcontroller.h b/dmxcontroller.h index 9c251db..164ec09 100644 --- a/dmxcontroller.h +++ b/dmxcontroller.h @@ -18,7 +18,7 @@ public: bool start(); - Q_INVOKABLE void setChannel(int channel, int value); + Q_INVOKABLE void setRegisterGroup(int registerGroupId, quint8 value); LightProject &lightProject() { return m_lightProject; } const LightProject &lightProject() const { return m_lightProject; } @@ -27,6 +27,11 @@ public: int performance() const { return m_lastCounter; } + sliders_state_t &sliderStates() { return m_sliderStates; } + const sliders_state_t &sliderStates() const { return m_sliderStates; } + void setSliderStates(sliders_state_t &&sliderStates); + void setSliderStates(const sliders_state_t &sliderStates); + signals: void performanceChanged(int performance); @@ -50,6 +55,8 @@ signals: void registerGroupRemoved(int first, int last); void registerGroupNameChanged(int row, const QString &name); + void sliderStatesChanged(const sliders_state_t &sliderStates); + protected: friend class DmxControllerThread; @@ -68,4 +75,6 @@ private: QDateTime m_lastInfo; int m_counter; std::atomic m_lastCounter; + + sliders_state_t m_sliderStates; }; diff --git a/lightproject.h b/lightproject.h index 254ba69..5768346 100644 --- a/lightproject.h +++ b/lightproject.h @@ -80,7 +80,7 @@ public: } }; -struct LightConfig +struct DeviceConfig { int id; QString name; @@ -89,15 +89,62 @@ struct LightConfig QVector3D position; }; +class DevicesContainer : public std::vector +{ + using base_t = std::vector; + +public: + using base_t::base_t; + + DeviceConfig *findById(int id) + { + auto iter = std::find_if(std::begin(*this), std::end(*this), + [&id](const DeviceConfig &device){ return device.id == id; }); + return iter != std::end(*this) ? &*iter : nullptr; + } + + const DeviceConfig *findById(int id) const + { + auto iter = std::find_if(std::begin(*this), std::end(*this), + [&id](const DeviceConfig &device){ return device.id == id; }); + return iter != std::end(*this) ? &*iter : nullptr; + } +}; + +using sliders_state_t = std::vector>; + struct RegisterGroupConfig { int id; QString name; + sliders_state_t sliders; +}; + +class RegisterGroupsContainer : public std::vector +{ + using base_t = std::vector; + +public: + using base_t::base_t; + + RegisterGroupConfig *findById(int id) + { + auto iter = std::find_if(std::begin(*this), std::end(*this), + [&id](const RegisterGroupConfig ®isterGroup){ return registerGroup.id == id; }); + return iter != std::end(*this) ? &*iter : nullptr; + } + + const RegisterGroupConfig *findById(int id) const + { + auto iter = std::find_if(std::begin(*this), std::end(*this), + [&id](const RegisterGroupConfig ®isterGroup){ return registerGroup.id == id; }); + return iter != std::end(*this) ? &*iter : nullptr; + } }; struct LightProject { DeviceTypesContainer deviceTypes; - std::vector devices; - std::vector registerGroups; + DevicesContainer devices; + RegisterGroupsContainer registerGroups; }; diff --git a/registergroupmodel.cpp b/registergroupmodel.cpp new file mode 100644 index 0000000..1404726 --- /dev/null +++ b/registergroupmodel.cpp @@ -0,0 +1,174 @@ +#include "registergroupmodel.h" + +#include +#include +#include + +void RegisterGroupModel::setController(DmxController *controller) +{ + if (m_controller == controller) + return; + + if (m_controller) + { +// disconnect(m_controller, &DmxController::registerGroupInserted, +// this, &RegisterGroupsModel::otherRegisterGroupInserted); + } + + m_controller = controller; + + if (m_controller) + { +// connect(m_controller, &DmxController::registerGroupInserted, +// this, &RegisterGroupsModel::otherRegisterGroupInserted); + } + + emit controllerChanged(m_controller); +} + +void RegisterGroupModel::setRegisterGroupId(int registerGroupId) +{ + if (m_registerGroupId == registerGroupId) + return; + + m_registerGroupId = registerGroupId; + + emit registerGroupIdChanged(m_registerGroupId); +} + +void RegisterGroupModel::copyFromFaders() +{ + if (!m_controller) + { + qDebug() << "hilfe" << __LINE__; + return; + } + + if (m_registerGroupId == -1) + { + qDebug() << "hilfe" << __LINE__; + return; + } + + auto registerGroupPtr = m_controller->lightProject().registerGroups.findById(m_registerGroupId); + if (!registerGroupPtr) + { + qDebug() << "hilfe" << __LINE__; + return; + } + + auto ®isterGroup = *registerGroupPtr; + + registerGroup.sliders = m_controller->sliderStates(); +} + +void RegisterGroupModel::copyToFaders() +{ + if (!m_controller) + { + qDebug() << "hilfe" << __LINE__; + return; + } + + if (m_registerGroupId == -1) + { + qDebug() << "hilfe" << __LINE__; + return; + } + + const auto registerGroupPtr = m_controller->lightProject().registerGroups.findById(m_registerGroupId); + if (!registerGroupPtr) + { + qDebug() << "hilfe" << __LINE__; + return; + } + + const auto ®isterGroup = *registerGroupPtr; + + m_controller->setSliderStates(registerGroup.sliders); +} + +void RegisterGroupModel::setAllFadersLow() +{ + if (!m_controller) + { + qDebug() << "hilfe" << __LINE__; + return; + } + + const auto &devices = m_controller->lightProject().devices; + + sliders_state_t sliderStates; + sliderStates.reserve(devices.size()); + + for (const auto &device : devices) + { + 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) + sliderState.push_back(0); + } + } + + sliderStates.push_back(std::move(sliderState)); + } + + m_controller->setSliderStates(std::move(sliderStates)); +} + +void RegisterGroupModel::setAllFadersMax() +{ + if (!m_controller) + { + qDebug() << "hilfe" << __LINE__; + return; + } + + const auto &devices = m_controller->lightProject().devices; + + sliders_state_t sliderStates; + sliderStates.reserve(devices.size()); + + for (const auto &device : devices) + { + 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) + sliderState.push_back(255); + } + } + + sliderStates.push_back(std::move(sliderState)); + } + + m_controller->setSliderStates(std::move(sliderStates)); +} + +namespace { +void registrierDenShit() +{ + qmlRegisterType("lightcontrol", 1, 0, "RegisterGroupModel"); +} +} +Q_COREAPP_STARTUP_FUNCTION(registrierDenShit) + diff --git a/registergroupmodel.h b/registergroupmodel.h new file mode 100644 index 0000000..40854a5 --- /dev/null +++ b/registergroupmodel.h @@ -0,0 +1,35 @@ +#pragma once + +#include + +#include "dmxcontroller.h" + +class RegisterGroupModel : public QObject +{ + Q_OBJECT + Q_PROPERTY(DmxController* controller READ controller WRITE setController NOTIFY controllerChanged) + Q_PROPERTY(int registerGroupId READ registerGroupId WRITE setRegisterGroupId NOTIFY registerGroupIdChanged) + +public: + using QObject::QObject; + + DmxController *controller() { return m_controller; } + const DmxController *controller() const { return m_controller; } + void setController(DmxController *controller); + + int registerGroupId() const { return m_registerGroupId; } + void setRegisterGroupId(int registerGroupId); + + Q_INVOKABLE void copyFromFaders(); + Q_INVOKABLE void copyToFaders(); + Q_INVOKABLE void setAllFadersLow(); + Q_INVOKABLE void setAllFadersMax(); + +signals: + void controllerChanged(DmxController *controller); + void registerGroupIdChanged(int registerGroupId); + +private: + DmxController *m_controller{}; + int m_registerGroupId{-1}; +}; diff --git a/registergroupsmodel.cpp b/registergroupsmodel.cpp index 4950491..fd02f30 100644 --- a/registergroupsmodel.cpp +++ b/registergroupsmodel.cpp @@ -1,5 +1,7 @@ #include "registergroupsmodel.h" +#include + #include #include #include