From 34ce21f7de4a5321f462a2d688d3447f73135a8c Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 Date: Wed, 22 Feb 2023 02:14:45 +0100 Subject: [PATCH] Slider states are correctly padded/erased on device creation/removal --- devicesmodel.cpp | 54 ++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 48 insertions(+), 6 deletions(-) diff --git a/devicesmodel.cpp b/devicesmodel.cpp index 5898d2a..f617216 100644 --- a/devicesmodel.cpp +++ b/devicesmodel.cpp @@ -334,9 +334,28 @@ bool DevicesModel::insertRows(int row, int count, const QModelIndex &parent) beginInsertRows({}, row, row+count-1); { QMutexLocker locker{&m_controller->mutex()}; - auto iter = std::begin(devices) + row; - for (auto i = 0; i < count; i++) - iter = devices.insert(iter, DeviceConfig{ .id=id++, .name="", .deviceTypeId=0, .address=0, .position={} }) + 1; + + { + auto iter = std::begin(devices) + row; + for (auto i = 0; i < count; i++) + iter = devices.insert(iter, DeviceConfig{ .id=id++, .name="", .deviceTypeId=0, .address=0, .position={} }) + 1; + } + + if (sliders_state_t &sliderStates = m_controller->sliderStates(); sliderStates.size() > row) + { + sliderStates.insert(std::begin(sliderStates) + row, count, {}); + emit m_controller->sliderStatesChanged(sliderStates); + } + + for (auto ®isterGroup : m_controller->lightProject().registerGroups) + { + auto &sliderStates = registerGroup.sliders; + if (sliderStates.size() > row) + { + sliderStates.insert(std::begin(sliderStates) + row, count, {}); + emit m_controller->sliderStatesChanged(sliderStates); + } + } } endInsertRows(); @@ -386,9 +405,32 @@ bool DevicesModel::removeRows(int row, int count, const QModelIndex &parent) beginRemoveRows({}, row, row+count-1); { QMutexLocker locker{&m_controller->mutex()}; - auto begin = std::begin(devices) + row; - auto end = begin + count; - devices.erase(begin, end); + + { + auto begin = std::begin(devices) + row; + auto end = begin + count; + devices.erase(begin, end); + } + + if (sliders_state_t &sliderStates = m_controller->sliderStates(); sliderStates.size() >= row) + { + auto begin = std::begin(sliderStates) + row; + auto end = begin + std::min(count, sliderStates.size() - row + count); + sliderStates.erase(begin, end); + emit m_controller->sliderStatesChanged(sliderStates); + } + + for (auto ®isterGroup : m_controller->lightProject().registerGroups) + { + auto &sliderStates = registerGroup.sliders; + if (sliderStates.size() >= row) + { + auto begin = std::begin(sliderStates) + row; + auto end = begin + std::min(count, sliderStates.size() - row + count); + sliderStates.erase(begin, end); + emit m_controller->sliderStatesChanged(sliderStates); + } + } } endRemoveRows();