From f5f73b4bea1d13132143e20033cbe21d7434c907 Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Sun, 8 Jul 2018 02:20:15 +0200 Subject: [PATCH] more work on closable interfaces --- libnymea-app-core/jsonrpc/jsonrpcclient.cpp | 2 +- nymea-app/resources.qrc | 34 +++-- nymea-app/ui/ConnectPage.qml | 1 + nymea-app/ui/Nymea.qml | 28 +++- nymea-app/ui/components/ShutterControls.qml | 6 +- nymea-app/ui/devicepages/AwningDevicePage.qml | 82 ++++++++++++ .../ui/devicepages/GarageGateDevicePage.qml | 6 +- .../ui/devicepages/ShutterDevicePage.qml | 71 +++++++++- nymea-app/ui/images/awning/awning-000.svg | 71 ++++++++++ nymea-app/ui/images/awning/awning-010.svg | 125 ++++++++++++++++++ nymea-app/ui/images/awning/awning-020.svg | 125 ++++++++++++++++++ nymea-app/ui/images/awning/awning-030.svg | 125 ++++++++++++++++++ nymea-app/ui/images/awning/awning-040.svg | 125 ++++++++++++++++++ nymea-app/ui/images/awning/awning-050.svg | 125 ++++++++++++++++++ nymea-app/ui/images/awning/awning-060.svg | 125 ++++++++++++++++++ nymea-app/ui/images/awning/awning-070.svg | 125 ++++++++++++++++++ nymea-app/ui/images/awning/awning-080.svg | 125 ++++++++++++++++++ nymea-app/ui/images/awning/awning-090.svg | 125 ++++++++++++++++++ nymea-app/ui/images/awning/awning-100.svg | 125 ++++++++++++++++++ .../shutter-000.svg} | 0 .../shutter-010.svg} | 0 .../shutter-020.svg} | 0 .../shutter-030.svg} | 0 .../shutter-040.svg} | 0 .../shutter-050.svg} | 0 .../shutter-060.svg} | 0 .../shutter-070.svg} | 0 .../shutter-080.svg} | 0 .../shutter-090.svg} | 0 .../shutter-100.svg} | 0 30 files changed, 1521 insertions(+), 30 deletions(-) create mode 100644 nymea-app/ui/devicepages/AwningDevicePage.qml create mode 100644 nymea-app/ui/images/awning/awning-000.svg create mode 100644 nymea-app/ui/images/awning/awning-010.svg create mode 100644 nymea-app/ui/images/awning/awning-020.svg create mode 100644 nymea-app/ui/images/awning/awning-030.svg create mode 100644 nymea-app/ui/images/awning/awning-040.svg create mode 100644 nymea-app/ui/images/awning/awning-050.svg create mode 100644 nymea-app/ui/images/awning/awning-060.svg create mode 100644 nymea-app/ui/images/awning/awning-070.svg create mode 100644 nymea-app/ui/images/awning/awning-080.svg create mode 100644 nymea-app/ui/images/awning/awning-090.svg create mode 100644 nymea-app/ui/images/awning/awning-100.svg rename nymea-app/ui/images/{shutter-0.svg => shutter/shutter-000.svg} (100%) rename nymea-app/ui/images/{shutter-1.svg => shutter/shutter-010.svg} (100%) rename nymea-app/ui/images/{shutter-2.svg => shutter/shutter-020.svg} (100%) rename nymea-app/ui/images/{shutter-3.svg => shutter/shutter-030.svg} (100%) rename nymea-app/ui/images/{shutter-4.svg => shutter/shutter-040.svg} (100%) rename nymea-app/ui/images/{shutter-5.svg => shutter/shutter-050.svg} (100%) rename nymea-app/ui/images/{shutter-6.svg => shutter/shutter-060.svg} (100%) rename nymea-app/ui/images/{shutter-7.svg => shutter/shutter-070.svg} (100%) rename nymea-app/ui/images/{shutter-8.svg => shutter/shutter-080.svg} (100%) rename nymea-app/ui/images/{shutter-9.svg => shutter/shutter-090.svg} (100%) rename nymea-app/ui/images/{shutter-10.svg => shutter/shutter-100.svg} (100%) diff --git a/libnymea-app-core/jsonrpc/jsonrpcclient.cpp b/libnymea-app-core/jsonrpc/jsonrpcclient.cpp index 91773949..edf18a71 100644 --- a/libnymea-app-core/jsonrpc/jsonrpcclient.cpp +++ b/libnymea-app-core/jsonrpc/jsonrpcclient.cpp @@ -279,7 +279,7 @@ void JsonRpcClient::dataReceived(const QByteArray &data) // qWarning() << "Could not parse json data from nymea" << m_receiveBuffer.left(splitIndex) << error.errorString(); return; } -// qDebug() << "received response" << m_receiveBuffer.left(splitIndex); +// qDebug() << "received response" << qUtf8Printable(jsonDoc.toJson(QJsonDocument::Indented)); m_receiveBuffer = m_receiveBuffer.right(m_receiveBuffer.length() - splitIndex - 1); if (!m_receiveBuffer.isEmpty()) { staticMetaObject.invokeMethod(this, "dataReceived", Qt::QueuedConnection, Q_ARG(QByteArray, QByteArray())); diff --git a/nymea-app/resources.qrc b/nymea-app/resources.qrc index 7cca24d7..b5fafe89 100644 --- a/nymea-app/resources.qrc +++ b/nymea-app/resources.qrc @@ -160,21 +160,21 @@ ui/AboutPage.qml ui/images/sort-listitem.svg ui/devicepages/ShutterDevicePage.qml - ui/images/shutter-1.svg - ui/images/shutter-2.svg - ui/images/shutter-3.svg - ui/images/shutter-4.svg - ui/images/shutter-5.svg - ui/images/shutter-6.svg - ui/images/shutter-7.svg - ui/images/shutter-8.svg - ui/images/shutter-9.svg - ui/images/shutter-10.svg + ui/images/shutter/shutter-000.svg + ui/images/shutter/shutter-010.svg + ui/images/shutter/shutter-020.svg + ui/images/shutter/shutter-030.svg + ui/images/shutter/shutter-040.svg + ui/images/shutter/shutter-050.svg + ui/images/shutter/shutter-060.svg + ui/images/shutter/shutter-070.svg + ui/images/shutter/shutter-080.svg + ui/images/shutter/shutter-090.svg + ui/images/shutter/shutter-100.svg ui/images/down.svg ui/images/up.svg ui/devicepages/GarageGateDevicePage.qml ui/images/remove.svg - ui/images/shutter-0.svg ui/components/ShutterControls.qml ../LICENSE ui/images/Built_with_Qt_RGB_logo.svg @@ -214,5 +214,17 @@ ui/components/FancyHeader.qml ui/connection/ManualConnectPage.qml ui/connection/BluetoothDiscoveryPage.qml + ui/images/awning/awning-100.svg + ui/devicepages/AwningDevicePage.qml + ui/images/awning/awning-000.svg + ui/images/awning/awning-010.svg + ui/images/awning/awning-020.svg + ui/images/awning/awning-030.svg + ui/images/awning/awning-040.svg + ui/images/awning/awning-050.svg + ui/images/awning/awning-060.svg + ui/images/awning/awning-070.svg + ui/images/awning/awning-080.svg + ui/images/awning/awning-090.svg diff --git a/nymea-app/ui/ConnectPage.qml b/nymea-app/ui/ConnectPage.qml index 61fe1110..9f4d68f2 100644 --- a/nymea-app/ui/ConnectPage.qml +++ b/nymea-app/ui/ConnectPage.qml @@ -93,6 +93,7 @@ Page { break; case 2: Engine.connection.connect("nymea://nymea.nymea.io:2222") + pageStack.push(connectingPage) break; } } diff --git a/nymea-app/ui/Nymea.qml b/nymea-app/ui/Nymea.qml index d7a0e680..dd2da443 100644 --- a/nymea-app/ui/Nymea.qml +++ b/nymea-app/ui/Nymea.qml @@ -134,7 +134,7 @@ ApplicationWindow { } } - property var supportedInterfaces: ["light", "weather", "sensor", "media", "garagegate", "shutter", "garagegate", "button", "notifications", "inputtrigger", "outputtrigger", "gateway"] + property var supportedInterfaces: ["light", "weather", "sensor", "media", "garagegate", "awning", "extendedawning", "shutter", "extendedshutter", "blind", "extendedblind", "button", "notifications", "inputtrigger", "outputtrigger", "gateway"] function interfaceToString(name) { switch(name) { case "light": @@ -160,9 +160,14 @@ ApplicationWindow { case "outputtrigger": return qsTr("Events"); case "shutter": + case "extendedshutter": return qsTr("Shutters"); case "blind": + case "extendedblind": return qsTr("Blinds"); + case "awning": + case "extendedawning": + return qsTr("Awnings"); case "garagegate": return qsTr("Garage gates"); case "uncategorized": @@ -214,11 +219,13 @@ ApplicationWindow { return Qt.resolvedUrl("images/attention.svg") case "outputtrigger": return Qt.resolvedUrl("images/send.svg") - case "shutter": - case "blind": + case "extendedshutter": + case "extendedblind": return Qt.resolvedUrl("images/sort-listitem.svg") case "garagegate": - return Qt.resolvedUrl("images/shutter-10.svg") + return Qt.resolvedUrl("images/shutter/shutter-100.svg") + case "extendedawning": + return Qt.resolvedUrl("images/awning/awning-100.svg") case "battery": return Qt.resolvedUrl("images/battery/battery-050.svg") case "uncategorized": @@ -249,12 +256,14 @@ ApplicationWindow { page = "SensorDevicePage.qml"; } else if (interfaceList.indexOf("inputtrigger") >= 0) { page = "InputTriggerDevicePage.qml"; - } else if (interfaceList.indexOf("shutter") >= 0 ) { - page = "ShutterDevicePage.qml"; } else if (interfaceList.indexOf("garagegate") >= 0 ) { page = "GarageGateDevicePage.qml"; } else if (interfaceList.indexOf("light") >= 0) { - page = "ColorLightDevicePage.qml" + page = "ColorLightDevicePage.qml"; + } else if (interfaceList.indexOf("extendedshutter") >= 0 ) { + page = "ShutterDevicePage.qml"; + } else if (interfaceList.indexOf("extendedawning") >= 0) { + page = "AwningDevicePage.qml"; } else { page = "GenericDevicePage.qml"; } @@ -262,6 +271,11 @@ ApplicationWindow { return page; } + function pad(num, size) { + var s = "000000000" + num; + return s.substr(s.length-size); + } + Component { id: invalidVersionComponent Popup { diff --git a/nymea-app/ui/components/ShutterControls.qml b/nymea-app/ui/components/ShutterControls.qml index 3751a058..f1a09f81 100644 --- a/nymea-app/ui/components/ShutterControls.qml +++ b/nymea-app/ui/components/ShutterControls.qml @@ -14,6 +14,8 @@ RowLayout { readonly property var deviceClass: device ? Engine.deviceManager.deviceClasses.getDeviceClass(device.deviceClassId) : null readonly property var openState: device ? device.states.getState(deviceClass.stateTypes.findByName("state").id) : null + property bool invert: false + Rectangle { Layout.preferredWidth: app.iconSize * 2 Layout.preferredHeight: width @@ -23,7 +25,7 @@ RowLayout { ColorIcon { anchors.fill: parent anchors.margins: app.margins - name: "../images/up.svg" + name: root.invert ? "../images/down.svg" : "../images/up.svg" } MouseArea { anchors.fill: parent @@ -57,7 +59,7 @@ RowLayout { ColorIcon { anchors.fill: parent anchors.margins: app.margins - name: "../images/down.svg" + name: root.invert ? "../images/up.svg" : "../images/down.svg" } MouseArea { anchors.fill: parent diff --git a/nymea-app/ui/devicepages/AwningDevicePage.qml b/nymea-app/ui/devicepages/AwningDevicePage.qml new file mode 100644 index 00000000..1b8e38f3 --- /dev/null +++ b/nymea-app/ui/devicepages/AwningDevicePage.qml @@ -0,0 +1,82 @@ +import QtQuick 2.5 +import QtQuick.Controls 2.1 +import QtQuick.Controls.Material 2.2 +import QtQuick.Layouts 1.1 +import Nymea 1.0 +import "../components" +import "../customviews" + +DevicePageBase { + id: root + + readonly property bool landscape: width > height + readonly property bool isExtended: deviceClass.interfaces.indexOf("extendedawning") >= 0 + readonly property var percentageState: isExtended ? device.states.getState(deviceClass.stateTypes.findByName("percentage").id) : 0 + readonly property var movingState: isExtended ? device.states.getState(deviceClass.stateTypes.findByName("moving").id) : 0 + + GridLayout { + anchors.fill: parent + columns: root.landscape ? 2 : 1 + + ColorIcon { + id: shutterImage + Layout.preferredWidth: root.landscape ? Math.min(parent.width - shutterControlsContainer.width, parent.height) - app.margins : parent.width + Layout.preferredHeight: width + name: "../images/awning/awning-" + app.pad(Math.round(root.percentageState.value / 10) * 10, 3) + ".svg" + visible: isExtended + } + + + Item { + id: shutterControlsContainer + Layout.preferredWidth: root.landscape ? Math.max(parent.width / 2, shutterControls.implicitWidth) : parent.width + Layout.minimumWidth: shutterControls.implicitWidth + Layout.fillHeight: true + Layout.minimumHeight: app.iconSize * 2.5 + + Column { + anchors.centerIn: parent + width: parent.width - app.margins * 2 + spacing: app.margins + + Slider { + id: percentageSlider + width: parent.width + from: 0 + to: 100 + stepSize: 1 + visible: isExtended + + Binding { + target: percentageSlider + property: "value" + value: root.percentageState.value + when: root.movingState.value === false + } + + onPressedChanged: { + if (!pressed) { + return + } + + var actionType = root.deviceClass.actionTypes.findByName("percentage"); + var params = []; + var percentageParam = {} + percentageParam["paramTypeId"] = actionType.paramTypes.findByName("percentage").id; + percentageParam["value"] = value + params.push(percentageParam); + Engine.deviceManager.executeAction(root.device.id, actionType.id, params); + } + } + + ShutterControls { + id: shutterControls + device: root.device + invert: true + anchors.horizontalCenter: parent.horizontalCenter + } + } + + } + } +} diff --git a/nymea-app/ui/devicepages/GarageGateDevicePage.qml b/nymea-app/ui/devicepages/GarageGateDevicePage.qml index 2ae01c55..b82b7011 100644 --- a/nymea-app/ui/devicepages/GarageGateDevicePage.qml +++ b/nymea-app/ui/devicepages/GarageGateDevicePage.qml @@ -23,9 +23,9 @@ DevicePageBase { id: shutterImage Layout.preferredWidth: root.landscape ? Math.min(parent.width - shutterControlsContainer.width, parent.height) - app.margins : parent.width Layout.preferredHeight: width - property int currentImage: root.openState.value === "closed" ? 10 : - root.openState.value === "open" && root.intermediatePositionState.value === false ? 0 : 5 - name: "../images/shutter-" + currentImage + ".svg" + property string currentImage: root.openState.value === "closed" ? "100" : + root.openState.value === "open" && root.intermediatePositionState.value === false ? "000" : "050" + name: "../images/shutter/shutter-" + currentImage + ".svg" Item { id: arrows diff --git a/nymea-app/ui/devicepages/ShutterDevicePage.qml b/nymea-app/ui/devicepages/ShutterDevicePage.qml index e4bb5c7c..af9cc202 100644 --- a/nymea-app/ui/devicepages/ShutterDevicePage.qml +++ b/nymea-app/ui/devicepages/ShutterDevicePage.qml @@ -1,5 +1,6 @@ import QtQuick 2.5 import QtQuick.Controls 2.1 +import QtQuick.Controls.Material 2.2 import QtQuick.Layouts 1.1 import Nymea 1.0 import "../components" @@ -8,13 +9,71 @@ import "../customviews" DevicePageBase { id: root + readonly property bool landscape: width > height + readonly property bool isExtended: deviceClass.interfaces.indexOf("extendedshutter") >= 0 + readonly property var percentageState: isExtended ? device.states.getState(deviceClass.stateTypes.findByName("percentage").id) : 0 + readonly property var movingState: isExtended ? device.states.getState(deviceClass.stateTypes.findByName("moving").id) : 0 - ShutterControls { - anchors { - top: parent.top - topMargin: app.iconSize - horizontalCenter: parent.horizontalCenter + GridLayout { + anchors.fill: parent + columns: root.landscape ? 2 : 1 + + ColorIcon { + id: shutterImage + Layout.preferredWidth: root.landscape ? Math.min(parent.width - shutterControlsContainer.width, parent.height) - app.margins : parent.width + Layout.preferredHeight: width + name: "../images/shutter/shutter-" + app.pad(Math.round(root.percentageState.value / 10) * 10, 3) + ".svg" + visible: isExtended + } + + Item { + id: shutterControlsContainer + Layout.preferredWidth: root.landscape ? Math.max(parent.width / 2, shutterControls.implicitWidth) : parent.width + Layout.minimumWidth: shutterControls.implicitWidth + Layout.fillHeight: true + Layout.minimumHeight: app.iconSize * 2.5 + + Column { + anchors.centerIn: parent + width: parent.width - app.margins * 2 + spacing: app.margins + + Slider { + id: percentageSlider + width: parent.width + from: 0 + to: 100 + stepSize: 1 + visible: isExtended + + Binding { + target: percentageSlider + property: "value" + value: root.percentageState.value + when: root.movingState.value === false + } + + onPressedChanged: { + if (pressed) { + return; + } + + var actionType = root.deviceClass.actionTypes.findByName("percentage"); + var params = []; + var percentageParam = {} + percentageParam["paramTypeId"] = actionType.paramTypes.findByName("percentage").id; + percentageParam["value"] = value + params.push(percentageParam); + Engine.deviceManager.executeAction(root.device.id, actionType.id, params); + } + } + + ShutterControls { + id: shutterControls + device: root.device + anchors.horizontalCenter: parent.horizontalCenter + } + } } - device: root.device } } diff --git a/nymea-app/ui/images/awning/awning-000.svg b/nymea-app/ui/images/awning/awning-000.svg new file mode 100644 index 00000000..78f1fce6 --- /dev/null +++ b/nymea-app/ui/images/awning/awning-000.svg @@ -0,0 +1,71 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + diff --git a/nymea-app/ui/images/awning/awning-010.svg b/nymea-app/ui/images/awning/awning-010.svg new file mode 100644 index 00000000..708e9f7f --- /dev/null +++ b/nymea-app/ui/images/awning/awning-010.svg @@ -0,0 +1,125 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/nymea-app/ui/images/awning/awning-020.svg b/nymea-app/ui/images/awning/awning-020.svg new file mode 100644 index 00000000..f844d3a6 --- /dev/null +++ b/nymea-app/ui/images/awning/awning-020.svg @@ -0,0 +1,125 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/nymea-app/ui/images/awning/awning-030.svg b/nymea-app/ui/images/awning/awning-030.svg new file mode 100644 index 00000000..05c2d822 --- /dev/null +++ b/nymea-app/ui/images/awning/awning-030.svg @@ -0,0 +1,125 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/nymea-app/ui/images/awning/awning-040.svg b/nymea-app/ui/images/awning/awning-040.svg new file mode 100644 index 00000000..1b5a8a97 --- /dev/null +++ b/nymea-app/ui/images/awning/awning-040.svg @@ -0,0 +1,125 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/nymea-app/ui/images/awning/awning-050.svg b/nymea-app/ui/images/awning/awning-050.svg new file mode 100644 index 00000000..1f8b86b3 --- /dev/null +++ b/nymea-app/ui/images/awning/awning-050.svg @@ -0,0 +1,125 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/nymea-app/ui/images/awning/awning-060.svg b/nymea-app/ui/images/awning/awning-060.svg new file mode 100644 index 00000000..ceb376c4 --- /dev/null +++ b/nymea-app/ui/images/awning/awning-060.svg @@ -0,0 +1,125 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/nymea-app/ui/images/awning/awning-070.svg b/nymea-app/ui/images/awning/awning-070.svg new file mode 100644 index 00000000..23880103 --- /dev/null +++ b/nymea-app/ui/images/awning/awning-070.svg @@ -0,0 +1,125 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/nymea-app/ui/images/awning/awning-080.svg b/nymea-app/ui/images/awning/awning-080.svg new file mode 100644 index 00000000..fc4ef304 --- /dev/null +++ b/nymea-app/ui/images/awning/awning-080.svg @@ -0,0 +1,125 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/nymea-app/ui/images/awning/awning-090.svg b/nymea-app/ui/images/awning/awning-090.svg new file mode 100644 index 00000000..57fb2191 --- /dev/null +++ b/nymea-app/ui/images/awning/awning-090.svg @@ -0,0 +1,125 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/nymea-app/ui/images/awning/awning-100.svg b/nymea-app/ui/images/awning/awning-100.svg new file mode 100644 index 00000000..3a470a26 --- /dev/null +++ b/nymea-app/ui/images/awning/awning-100.svg @@ -0,0 +1,125 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/nymea-app/ui/images/shutter-0.svg b/nymea-app/ui/images/shutter/shutter-000.svg similarity index 100% rename from nymea-app/ui/images/shutter-0.svg rename to nymea-app/ui/images/shutter/shutter-000.svg diff --git a/nymea-app/ui/images/shutter-1.svg b/nymea-app/ui/images/shutter/shutter-010.svg similarity index 100% rename from nymea-app/ui/images/shutter-1.svg rename to nymea-app/ui/images/shutter/shutter-010.svg diff --git a/nymea-app/ui/images/shutter-2.svg b/nymea-app/ui/images/shutter/shutter-020.svg similarity index 100% rename from nymea-app/ui/images/shutter-2.svg rename to nymea-app/ui/images/shutter/shutter-020.svg diff --git a/nymea-app/ui/images/shutter-3.svg b/nymea-app/ui/images/shutter/shutter-030.svg similarity index 100% rename from nymea-app/ui/images/shutter-3.svg rename to nymea-app/ui/images/shutter/shutter-030.svg diff --git a/nymea-app/ui/images/shutter-4.svg b/nymea-app/ui/images/shutter/shutter-040.svg similarity index 100% rename from nymea-app/ui/images/shutter-4.svg rename to nymea-app/ui/images/shutter/shutter-040.svg diff --git a/nymea-app/ui/images/shutter-5.svg b/nymea-app/ui/images/shutter/shutter-050.svg similarity index 100% rename from nymea-app/ui/images/shutter-5.svg rename to nymea-app/ui/images/shutter/shutter-050.svg diff --git a/nymea-app/ui/images/shutter-6.svg b/nymea-app/ui/images/shutter/shutter-060.svg similarity index 100% rename from nymea-app/ui/images/shutter-6.svg rename to nymea-app/ui/images/shutter/shutter-060.svg diff --git a/nymea-app/ui/images/shutter-7.svg b/nymea-app/ui/images/shutter/shutter-070.svg similarity index 100% rename from nymea-app/ui/images/shutter-7.svg rename to nymea-app/ui/images/shutter/shutter-070.svg diff --git a/nymea-app/ui/images/shutter-8.svg b/nymea-app/ui/images/shutter/shutter-080.svg similarity index 100% rename from nymea-app/ui/images/shutter-8.svg rename to nymea-app/ui/images/shutter/shutter-080.svg diff --git a/nymea-app/ui/images/shutter-9.svg b/nymea-app/ui/images/shutter/shutter-090.svg similarity index 100% rename from nymea-app/ui/images/shutter-9.svg rename to nymea-app/ui/images/shutter/shutter-090.svg diff --git a/nymea-app/ui/images/shutter-10.svg b/nymea-app/ui/images/shutter/shutter-100.svg similarity index 100% rename from nymea-app/ui/images/shutter-10.svg rename to nymea-app/ui/images/shutter/shutter-100.svg