From 3dc40afa9b9195a95be06bd6beb77de289a59169 Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Mon, 14 Oct 2019 12:35:20 +0200 Subject: [PATCH] Fix device lists getting messed up when devices are reordered --- libnymea-app-core/devicesproxy.cpp | 13 ++++++++++ libnymea-app-core/devicesproxy.h | 1 + .../ClosablesDeviceListPage.qml | 4 ++-- .../devicelistpages/LightsDeviceListPage.qml | 24 +++++++++---------- .../devicelistpages/MediaDeviceListPage.qml | 2 +- .../PowerSocketsDeviceListPage.qml | 4 ++-- .../devicelistpages/SensorsDeviceListPage.qml | 4 ++-- .../SmartMeterDeviceListPage.qml | 4 ++-- .../devicelistpages/WeatherDeviceListPage.qml | 4 ++-- .../ui/thingconfiguration/EditThingsPage.qml | 2 +- 10 files changed, 38 insertions(+), 24 deletions(-) diff --git a/libnymea-app-core/devicesproxy.cpp b/libnymea-app-core/devicesproxy.cpp index 5cfd1a67..6e7d0761 100644 --- a/libnymea-app-core/devicesproxy.cpp +++ b/libnymea-app-core/devicesproxy.cpp @@ -209,6 +209,19 @@ Device *DevicesProxy::get(int index) const return getInternal(mapToSource(this->index(index, 0)).row()); } +Device *DevicesProxy::getDevice(const QUuid &deviceId) const +{ + Devices *d = qobject_cast(sourceModel()); + if (d) { + return d->getDevice(deviceId); + } + DevicesProxy *dp = qobject_cast(sourceModel()); + if (dp) { + return dp->getDevice(deviceId); + } + return nullptr; +} + Device *DevicesProxy::getInternal(int source_index) const { Devices* d = qobject_cast(sourceModel()); diff --git a/libnymea-app-core/devicesproxy.h b/libnymea-app-core/devicesproxy.h index 4ab74807..b57ba33b 100644 --- a/libnymea-app-core/devicesproxy.h +++ b/libnymea-app-core/devicesproxy.h @@ -85,6 +85,7 @@ public: void setGroupByInterface(bool groupByInterface); Q_INVOKABLE Device *get(int index) const; + Q_INVOKABLE Device *getDevice(const QUuid &deviceId) const; signals: void engineChanged(); diff --git a/nymea-app/ui/devicelistpages/ClosablesDeviceListPage.qml b/nymea-app/ui/devicelistpages/ClosablesDeviceListPage.qml index 892043a6..728426ef 100644 --- a/nymea-app/ui/devicelistpages/ClosablesDeviceListPage.qml +++ b/nymea-app/ui/devicelistpages/ClosablesDeviceListPage.qml @@ -64,8 +64,8 @@ DeviceListPageBase { property bool inline: width > 500 - property Device device: devicesProxy.get(index); - property DeviceClass deviceClass: engine.deviceManager.deviceClasses.getDeviceClass(device.deviceClassId); + property Device device: devicesProxy.getDevice(model.id) + property DeviceClass deviceClass: device.deviceClass property var connectedStateType: deviceClass.stateTypes.findByName("connected"); property var connectedState: connectedStateType ? device.states.getState(connectedStateType.id) : null diff --git a/nymea-app/ui/devicelistpages/LightsDeviceListPage.qml b/nymea-app/ui/devicelistpages/LightsDeviceListPage.qml index 9ccfdb22..3a623705 100644 --- a/nymea-app/ui/devicelistpages/LightsDeviceListPage.qml +++ b/nymea-app/ui/devicelistpages/LightsDeviceListPage.qml @@ -51,22 +51,22 @@ DeviceListPageBase { property bool inline: width > 500 - property var device: devicesProxy.get(index); - property var deviceClass: engine.deviceManager.deviceClasses.getDeviceClass(device.deviceClassId); + property Device device: devicesProxy.getDevice(model.id) + property DeviceClass deviceClass: device.deviceClass - property var connectedStateType: deviceClass.stateTypes.findByName("connected"); - property var connectedState: connectedStateType ? device.states.getState(connectedStateType.id) : null + property StateType connectedStateType: deviceClass.stateTypes.findByName("connected"); + property State connectedState: connectedStateType ? device.states.getState(connectedStateType.id) : null - property var powerStateType: deviceClass.stateTypes.findByName("power"); - property var powerActionType: deviceClass.actionTypes.findByName("power"); - property var powerState: device.states.getState(powerStateType.id) + property StateType powerStateType: deviceClass.stateTypes.findByName("power"); + property ActionType powerActionType: deviceClass.actionTypes.findByName("power"); + property State powerState: device.states.getState(powerStateType.id) - property var brightnessStateType: deviceClass.stateTypes.findByName("brightness"); - property var brightnessActionType: deviceClass.actionTypes.findByName("brightness"); - property var brightnessState: brightnessStateType ? device.states.getState(brightnessStateType.id) : null + property StateType brightnessStateType: deviceClass.stateTypes.findByName("brightness"); + property ActionType brightnessActionType: deviceClass.actionTypes.findByName("brightness"); + property State brightnessState: brightnessStateType ? device.states.getState(brightnessStateType.id) : null - property var colorStateType: deviceClass.stateTypes.findByName("color"); - property var colorState: colorStateType ? device.states.getState(colorStateType.id) : null + property StateType colorStateType: deviceClass.stateTypes.findByName("color"); + property State colorState: colorStateType ? device.states.getState(colorStateType.id) : null Material.elevation: 1 topPadding: 0 diff --git a/nymea-app/ui/devicelistpages/MediaDeviceListPage.qml b/nymea-app/ui/devicelistpages/MediaDeviceListPage.qml index e7c5dca0..dcc4124d 100644 --- a/nymea-app/ui/devicelistpages/MediaDeviceListPage.qml +++ b/nymea-app/ui/devicelistpages/MediaDeviceListPage.qml @@ -34,7 +34,7 @@ DeviceListPageBase { property bool inline: width > 500 - property Device device: devicesProxy.get(index); + property Device device: devicesProxy.getDevice(model.id) property DeviceClass deviceClass: device.deviceClass readonly property StateType playbackStateType: deviceClass.stateTypes.findByName("playbackStatus") diff --git a/nymea-app/ui/devicelistpages/PowerSocketsDeviceListPage.qml b/nymea-app/ui/devicelistpages/PowerSocketsDeviceListPage.qml index e18db223..1a1ccbe7 100644 --- a/nymea-app/ui/devicelistpages/PowerSocketsDeviceListPage.qml +++ b/nymea-app/ui/devicelistpages/PowerSocketsDeviceListPage.qml @@ -26,8 +26,8 @@ DeviceListPageBase { id: itemDelegate width: parent.width - property var device: devicesProxy.get(index); - property var deviceClass: engine.deviceManager.deviceClasses.getDeviceClass(device.deviceClassId); + property Device device: devicesProxy.getDevice(model.id) + property DeviceClass deviceClass: device.deviceClass property var connectedStateType: deviceClass.stateTypes.findByName("connected"); property var connectedState: connectedStateType ? device.states.getState(connectedStateType.id) : null diff --git a/nymea-app/ui/devicelistpages/SensorsDeviceListPage.qml b/nymea-app/ui/devicelistpages/SensorsDeviceListPage.qml index aafb4ce0..e86641f5 100644 --- a/nymea-app/ui/devicelistpages/SensorsDeviceListPage.qml +++ b/nymea-app/ui/devicelistpages/SensorsDeviceListPage.qml @@ -23,8 +23,8 @@ DeviceListPageBase { property bool inline: width > 500 - property var device: devicesProxy.get(index); - property var deviceClass: engine.deviceManager.deviceClasses.getDeviceClass(device.deviceClassId); + property Device device: devicesProxy.getDevice(model.id) + property DeviceClass deviceClass: device.deviceClass bottomPadding: index === ListView.view.count - 1 ? topPadding : 0 contentItem: Pane { diff --git a/nymea-app/ui/devicelistpages/SmartMeterDeviceListPage.qml b/nymea-app/ui/devicelistpages/SmartMeterDeviceListPage.qml index 2d808626..4f1e324a 100644 --- a/nymea-app/ui/devicelistpages/SmartMeterDeviceListPage.qml +++ b/nymea-app/ui/devicelistpages/SmartMeterDeviceListPage.qml @@ -23,8 +23,8 @@ DeviceListPageBase { property bool inline: width > 500 - property var device: devicesProxy.get(index); - property var deviceClass: engine.deviceManager.deviceClasses.getDeviceClass(device.deviceClassId); + property Device device: devicesProxy.getDevice(model.id) + property DeviceClass deviceClass: device.deviceClass bottomPadding: index === ListView.view.count - 1 ? topPadding : 0 contentItem: Pane { diff --git a/nymea-app/ui/devicelistpages/WeatherDeviceListPage.qml b/nymea-app/ui/devicelistpages/WeatherDeviceListPage.qml index 565c0b32..7a1acb19 100644 --- a/nymea-app/ui/devicelistpages/WeatherDeviceListPage.qml +++ b/nymea-app/ui/devicelistpages/WeatherDeviceListPage.qml @@ -24,8 +24,8 @@ DeviceListPageBase { property bool inline: width > 500 - property var device: devicesProxy.get(index); - property var deviceClass: engine.deviceManager.deviceClasses.getDeviceClass(device.deviceClassId); + property Device device: devicesProxy.getDevice(model.id) + property DeviceClass deviceClass: device.deviceClass bottomPadding: index === ListView.view.count - 1 ? topPadding : 0 contentItem: Pane { diff --git a/nymea-app/ui/thingconfiguration/EditThingsPage.qml b/nymea-app/ui/thingconfiguration/EditThingsPage.qml index 52db39f7..3cd7c334 100644 --- a/nymea-app/ui/thingconfiguration/EditThingsPage.qml +++ b/nymea-app/ui/thingconfiguration/EditThingsPage.qml @@ -73,7 +73,7 @@ Page { } delegate: ThingDelegate { - device: deviceProxy.get(index) + device: deviceProxy.getDevice(model.id) canDelete: true onClicked: { print("clicked:", model.id)