diff --git a/nymea-app/images.qrc b/nymea-app/images.qrc
index 91494793..25d7aef3 100644
--- a/nymea-app/images.qrc
+++ b/nymea-app/images.qrc
@@ -72,8 +72,6 @@
ui/images/configure.svg
ui/images/contact-new.svg
ui/images/delete.svg
- ui/images/DeviceIconBlind.svg
- ui/images/DeviceIconRollerShutter.svg
ui/images/dialog-error-symbolic.svg
ui/images/dialog-warning-symbolic.svg
ui/images/down.svg
@@ -221,5 +219,18 @@
ui/images/browser/MediaBrowserIconRadioParadise.svg
ui/images/io-connections.svg
ui/images/sensors/windspeed.svg
+ ui/images/shutter/shutter-inlay.svg
+ ui/images/garage/garage-inlay.svg
+ ui/images/garage/garage-000.svg
+ ui/images/garage/garage-010.svg
+ ui/images/garage/garage-020.svg
+ ui/images/garage/garage-030.svg
+ ui/images/garage/garage-040.svg
+ ui/images/garage/garage-050.svg
+ ui/images/garage/garage-060.svg
+ ui/images/garage/garage-070.svg
+ ui/images/garage/garage-080.svg
+ ui/images/garage/garage-090.svg
+ ui/images/garage/garage-100.svg
diff --git a/nymea-app/resources.qrc b/nymea-app/resources.qrc
index 979bd4e9..b9ca0f42 100644
--- a/nymea-app/resources.qrc
+++ b/nymea-app/resources.qrc
@@ -216,5 +216,6 @@
ui/connection/CertificateErrorDialog.qml
ui/devicepages/VentilationDevicePage.qml
ui/thingconfiguration/ThingClassDetailsPage.qml
+ ui/components/ClosablesControlLarge.qml
diff --git a/nymea-app/ui/Nymea.qml b/nymea-app/ui/Nymea.qml
index b7a75163..7d13099f 100644
--- a/nymea-app/ui/Nymea.qml
+++ b/nymea-app/ui/Nymea.qml
@@ -275,12 +275,12 @@ ApplicationWindow {
return Qt.resolvedUrl("images/send.svg")
case "shutter":
case "extendedshutter":
- return Qt.resolvedUrl("images/DeviceIconRollerShutter.svg")
+ return Qt.resolvedUrl("images/shutter/shutter-040.svg")
case "blind":
case "extendedblind":
- return Qt.resolvedUrl("images/DeviceIconBlind.svg")
+ return Qt.resolvedUrl("images/shutter/shutter-060.svg")
case "garagegate":
- return Qt.resolvedUrl("images/shutter/shutter-100.svg")
+ return Qt.resolvedUrl("images/garage/garage-100.svg")
case "awning":
case "extendedawning":
return Qt.resolvedUrl("images/awning/awning-100.svg")
diff --git a/nymea-app/ui/components/ClosablesControlLarge.qml b/nymea-app/ui/components/ClosablesControlLarge.qml
new file mode 100644
index 00000000..4e6dcedd
--- /dev/null
+++ b/nymea-app/ui/components/ClosablesControlLarge.qml
@@ -0,0 +1,164 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+*
+* Copyright 2013 - 2020, nymea GmbH
+* Contact: contact@nymea.io
+*
+* This file is part of nymea.
+* This project including source code and documentation is protected by
+* copyright law, and remains the property of nymea GmbH. All rights, including
+* reproduction, publication, editing and translation, are reserved. The use of
+* this project is subject to the terms of a license agreement to be concluded
+* with nymea GmbH in accordance with the terms of use of nymea GmbH, available
+* under https://nymea.io/license
+*
+* GNU General Public License Usage
+* Alternatively, this project may be redistributed and/or modified under the
+* terms of the GNU General Public License as published by the Free Software
+* Foundation, GNU version 3. This project is distributed in the hope that it
+* will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+* Public License for more details.
+*
+* You should have received a copy of the GNU General Public License along with
+* this project. If not, see .
+*
+* For any further details and any questions please contact us under
+* contact@nymea.io or see our FAQ/Licensing Information on
+* https://nymea.io/license/faq
+*
+* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+import QtQuick 2.5
+import QtQuick.Controls 2.1
+import QtQuick.Controls.Material 2.2
+import QtQuick.Layouts 1.1
+import QtGraphicalEffects 1.0
+import Nymea 1.0
+import "../customviews"
+
+Item {
+ id: root
+
+ property Device thing: null
+ readonly property DeviceClass thingClass: thing.deviceClass
+
+ readonly property string type: "shutter"
+ readonly property bool isExtended: thing.deviceClass.interfaces.indexOf("extendedclosable") >= 0
+
+ readonly property State movingState: isExtended ? thing.states.getState(thingClass.stateTypes.findByName("moving").id) : 0
+ readonly property State percentageState: isExtended ? thing.states.getState(thingClass.stateTypes.findByName("percentage").id) : 0
+
+ readonly property bool moving: movingState ? movingState.value : false
+ readonly property int percentage: percentageState ? percentageState.value : 50
+
+ onMovingChanged: {
+ if (!moving) {
+ movable.visible = false;
+ }
+ }
+
+ Item {
+ id: content
+ height: Math.min(root.width, root.height)
+ width: height
+
+ readonly property int minY: height * 0.09
+ readonly property int maxY: height * 0.91
+
+ ColorIcon {
+ anchors.fill: parent
+ name: "../images/" + root.type + "/" + root.type + "-000.svg"
+ }
+
+
+ Item {
+ id: inlay
+ anchors.fill: parent
+ visible: false
+
+ ColorIcon {
+ width: parent.width
+ height: parent.height
+ name: "../images/" + root.type + "/" + root.type + "-inlay.svg"
+ property int movingHeight: content.maxY - content.minY
+ y: -height + (height - movingHeight) + (root.percentage / 100 * movingHeight)
+ }
+ }
+
+ Item {
+ id: movableSource
+ anchors.fill: parent
+ visible: false
+
+ ColorIcon {
+ id: movableContent
+ width: parent.width
+ height: parent.height
+ name: "../images/" + root.type + "/" + root.type + "-inlay.svg"
+ color: app.foregroundColor
+ }
+ }
+ OpacityMask {
+ id: movable
+ anchors.fill: parent
+ source: movableSource
+ maskSource: mask
+ opacity: .1
+ visible: false
+ }
+
+ Item {
+ id: mask
+ anchors.fill: parent
+ visible: false
+
+ Rectangle {
+ anchors.fill: parent
+ color: "blue"
+ anchors.margins: parent.height * .09
+ }
+ }
+
+ OpacityMask {
+ anchors.fill: parent
+ source: inlay
+ maskSource: mask
+ }
+
+
+ Rectangle {
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.margins: parent.width / 6
+ height: 2
+ color: app.accentColor
+ y: Math.max(parent.minY, Math.min(parent.maxY, dragArea.mouseY))
+ visible: root.isExtended && dragArea.containsMouse
+ }
+
+ MouseArea {
+ id: dragArea
+ anchors.fill: parent
+ hoverEnabled: true
+ readonly property int percentage: Math.max(0, Math.min(100, 100 * (mouseY - parent.minY) / (parent.maxY - parent.minY)))
+
+ onPressed: movable.visible = root.isExtended
+ onMouseYChanged: if (pressed) movableContent.y = Math.min(content.maxY, Math.max(0, dragArea.mouseY)) - height + content.minY
+ onReleased: {
+ print("released on", percentage)
+
+ if (root.isExtended) {
+ var actionType = root.thingClass.actionTypes.findByName("percentage");
+ var params = [];
+ var percentageParam = {}
+ percentageParam["paramTypeId"] = actionType.paramTypes.findByName("percentage").id;
+ percentageParam["value"] = percentage
+ params.push(percentageParam);
+ print("executing", percentage)
+ engine.deviceManager.executeAction(root.thing.id, actionType.id, params);
+
+ }
+ }
+ }
+ }
+}
diff --git a/nymea-app/ui/components/ShutterControls.qml b/nymea-app/ui/components/ShutterControls.qml
index aabc9e27..652e82af 100644
--- a/nymea-app/ui/components/ShutterControls.qml
+++ b/nymea-app/ui/components/ShutterControls.qml
@@ -34,9 +34,8 @@ import QtQuick.Controls.Material 2.2
import QtQuick.Layouts 1.3
import Nymea 1.0
-RowLayout {
+Row {
id: root
- implicitWidth: childrenRect.width
property Device device: null
readonly property var deviceClass: device ? engine.deviceManager.deviceClasses.getDeviceClass(device.deviceClassId) : null
@@ -48,8 +47,8 @@ RowLayout {
signal activated(string button);
ItemDelegate {
- Layout.preferredWidth: app.iconSize * 2
- Layout.preferredHeight: width
+ width: app.iconSize * 2
+ height: width
ColorIcon {
anchors.fill: parent
@@ -65,8 +64,8 @@ RowLayout {
ItemDelegate {
- Layout.preferredWidth: app.iconSize * 2
- Layout.preferredHeight: width
+ width: app.iconSize * 2
+ height: width
visible: root.canStop
// color: Material.foreground
// radius: height / 2
@@ -83,8 +82,8 @@ RowLayout {
}
ItemDelegate {
- Layout.preferredWidth: app.iconSize * 2
- Layout.preferredHeight: width
+ width: app.iconSize * 2
+ height: width
ColorIcon {
anchors.fill: parent
diff --git a/nymea-app/ui/devicepages/AwningDevicePage.qml b/nymea-app/ui/devicepages/AwningDevicePage.qml
index 21812ae8..a95f8596 100644
--- a/nymea-app/ui/devicepages/AwningDevicePage.qml
+++ b/nymea-app/ui/devicepages/AwningDevicePage.qml
@@ -50,8 +50,11 @@ DevicePageBase {
ColorIcon {
id: shutterImage
- Layout.preferredWidth: root.landscape ? Math.min(parent.width - shutterControlsContainer.width, parent.height) - app.margins : parent.width
+ Layout.preferredWidth: root.landscape ?
+ Math.min(parent.width - shutterControlsContainer.minimumWidth, parent.height) - app.margins
+ : Math.min(Math.min(500, parent.width), parent.height - shutterControlsContainer.minimumHeight)
Layout.preferredHeight: width
+ Layout.alignment: Qt.AlignHCenter
name: "../images/awning/awning-" + app.pad(Math.round(root.percentageState.value / 10) * 10, 3) + ".svg"
visible: isExtended
}
@@ -59,14 +62,15 @@ DevicePageBase {
Item {
id: shutterControlsContainer
- Layout.preferredWidth: root.landscape ? Math.max(parent.width / 2, shutterControls.implicitWidth) : parent.width
- Layout.minimumWidth: shutterControls.implicitWidth
+ Layout.fillWidth: true
Layout.fillHeight: true
- Layout.minimumHeight: app.iconSize * 2.5
+ Layout.margins: app.margins * 2
+ property int minimumWidth: app.iconSize * 2.7 * 3
+ property int minimumHeight: app.iconSize * 4.5
Column {
anchors.centerIn: parent
- width: parent.width - app.margins * 2
+ width: parent.width
spacing: app.margins
Slider {
@@ -81,13 +85,14 @@ DevicePageBase {
target: percentageSlider
property: "value"
value: root.percentageState.value
- when: root.movingState.value === false
+ when: !percentageSlider.pressed
}
onPressedChanged: {
- if (!pressed) {
+ if (pressed) {
return
}
+ print("should move", value)
var actionType = root.deviceClass.actionTypes.findByName("percentage");
var params = [];
diff --git a/nymea-app/ui/devicepages/GarageGateDevicePage.qml b/nymea-app/ui/devicepages/GarageGateDevicePage.qml
index 38ddd587..7aa21047 100644
--- a/nymea-app/ui/devicepages/GarageGateDevicePage.qml
+++ b/nymea-app/ui/devicepages/GarageGateDevicePage.qml
@@ -51,11 +51,14 @@ DevicePageBase {
ColorIcon {
id: shutterImage
- Layout.preferredWidth: root.landscape ? Math.min(parent.width - shutterControlsContainer.width, parent.height) - app.margins : parent.width
+ Layout.preferredWidth: root.landscape ?
+ Math.min(parent.width - shutterControlsContainer.minimumWidth, parent.height) - app.margins
+ : Math.min(Math.min(parent.width, 500), parent.height - shutterControlsContainer.minimumHeight)
Layout.preferredHeight: width
+ Layout.alignment: Qt.AlignHCenter
property string currentImage: root.openState.value === "closed" ? "100" :
root.openState.value === "open" && root.intermediatePositionState.value === false ? "000" : "050"
- name: "../images/shutter/shutter-" + currentImage + ".svg"
+ name: "../images/garage/garage-" + currentImage + ".svg"
Item {
id: arrows
@@ -105,10 +108,11 @@ DevicePageBase {
Item {
id: shutterControlsContainer
- Layout.preferredWidth: root.landscape ? Math.max(parent.width / 2, shutterControls.implicitWidth) : parent.width
- Layout.minimumWidth: shutterControls.implicitWidth
+ Layout.fillWidth: true
+ Layout.margins: app.margins * 2
Layout.fillHeight: true
- Layout.minimumHeight: app.iconSize * 2.5
+ property int minimumWidth: app.iconSize * 2.5 * (root.lightState ? 4 : 3)
+ property int minimumHeight: app.iconSize * 2.5
ShutterControls {
id: shutterControls
@@ -117,8 +121,8 @@ DevicePageBase {
spacing: (parent.width - app.iconSize*2*children.length) / (children.length - 1)
ItemDelegate {
- Layout.preferredWidth: app.iconSize * 2
- Layout.preferredHeight: width
+ width: app.iconSize * 2
+ height: width
visible: root.lightStateType !== null
ColorIcon {
diff --git a/nymea-app/ui/devicepages/ShutterDevicePage.qml b/nymea-app/ui/devicepages/ShutterDevicePage.qml
index a6681fdf..ba3224ea 100644
--- a/nymea-app/ui/devicepages/ShutterDevicePage.qml
+++ b/nymea-app/ui/devicepages/ShutterDevicePage.qml
@@ -32,6 +32,7 @@ import QtQuick 2.5
import QtQuick.Controls 2.1
import QtQuick.Controls.Material 2.2
import QtQuick.Layouts 1.1
+import QtGraphicalEffects 1.0
import Nymea 1.0
import "../components"
import "../customviews"
@@ -39,96 +40,268 @@ import "../customviews"
DevicePageBase {
id: root
- readonly property bool landscape: width > height
+ readonly property bool landscape: width > height * 1.5
readonly property bool isExtended: deviceClass.interfaces.indexOf("extendedclosable") >= 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
+ readonly property bool isVenetian: deviceClass.interfaces.indexOf("venetianblind") >= 0
+
+ readonly property StateType movingStateType: isExtended ? deviceClass.stateTypes.findByName("moving") : null
+ readonly property StateType angleStateType: isVenetian ? deviceClass.stateTypes.findByName("angle") : null
+
+ readonly property State movingState: isExtended ? device.states.getState(movingStateType.id) : 0
+ readonly property State percentageState: isExtended ? device.states.getState(deviceClass.stateTypes.findByName("percentage").id) : 0
+ readonly property State angleState: isVenetian ? device.states.getState(angleStateType.id) : 0
+
+
+ readonly property bool moving: movingState ? movingState.value === true : false
+ readonly property int percentage: percentageState ? percentageState.value : 50
+ readonly property int angle: angleState ? angleState.value : 0
+
+ onMovingChanged: if (!moving) angleMovable.visible = false
GridLayout {
anchors.fill: parent
- columns: root.landscape ? 2 : 1
+ columns: root.isVenetian ?
+ root.landscape ? 3 : 2
+ : 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(isExtended ? Math.round(root.percentageState.value / 10) * 10 : 50, 3) + ".svg"
+ Item {
+ id: window
- ClosableArrowAnimation {
- id: arrowAnimation
- anchors.centerIn: parent
+ Layout.preferredWidth: root.landscape ?
+ Math.min(parent.width *.4, parent.height)
+ : Math.min(Math.min(parent.width, 500), (parent.height - shutterControlsContainer.minimumHeight)) / (root.isVenetian ? 2 : 1)
+// Layout.preferredWidth: root.landscape ?
+// Math.min(parent.width - shutterControlsContainer.minimumWidth, parent.height) - app.margins
+// : Math.min(Math.min(parent.width, parent.height - shutterControlsContainer.minimumHeight), 500)
+ Layout.preferredHeight: root.landscape ?
+ width
+ : width * (root.isVenetian ? 2 : 1)
+ Layout.alignment: root.landscape ? Qt.AlignVCenter : Qt.AlignHCenter
+ clip: true
- onStateChanged: {
- if (state != "") {
- animationTimer.start();
+ ClosablesControlLarge {
+ anchors { left: parent.left; top: parent.top; bottom: parent.bottom; }
+ width: height
+ thing: root.device
+
+ ClosableArrowAnimation {
+ id: arrowAnimation
+ anchors.centerIn: parent
+ anchors.horizontalCenterOffset: isVenetian ? -width: 0
+
+ onStateChanged: {
+ if (state != "") {
+ animationTimer.start();
+ }
+ }
+
+ Timer {
+ id: animationTimer
+ running: false
+ interval: 5000
+ repeat: false
+ onTriggered: parent.state = ""
}
}
- Timer {
- id: animationTimer
- running: false
- interval: 5000
- repeat: false
- onTriggered: parent.state = ""
+ }
+ }
+
+
+ Item {
+ id: angleControls
+ Layout.preferredWidth: root.landscape ? window.width / 2 : window.width
+ Layout.preferredHeight: window.height
+ visible: root.isVenetian
+
+ Item {
+ anchors.fill: parent
+
+ Item {
+ anchors { fill: parent; topMargin: parent.height * .09; bottomMargin: parent.height * 0.09; leftMargin: app.margins * 2; rightMargin: app.margins * 2 }
+
+ Repeater {
+ model: 10
+ Item {
+ width: parent.height * .1
+ height: width
+ y: parent.height / 10 * index
+
+ Rectangle {
+ anchors.centerIn: parent
+ width: parent.width
+ height: width / 4
+ rotation: root.angle
+ color: "#808080"
+ }
+ }
+ }
+
+ Item {
+ id: angleMovable
+ anchors.fill: parent
+ property int angle: 0
+ visible: false
+
+ Repeater {
+ model: 10
+ Item {
+ width: parent.height * .1
+ height: width
+ y: parent.height / 10 * index
+
+ Rectangle {
+ anchors.centerIn: parent
+ width: parent.width
+ height: width / 4
+ rotation: angleMovable.angle
+ color: app.foregroundColor
+ opacity: 0.1
+ }
+ }
+
+ }
+ }
+
+ Item {
+ anchors { top: parent.top; bottom: parent.bottom; right: parent.right; rightMargin: app.margins / 2 }
+ width: parent.width * .5
+
+ Rectangle {
+ id: angleSlider
+ anchors.fill: parent
+ color: Qt.rgba(app.foregroundColor.r, app.foregroundColor.g, app.foregroundColor.b, 0.1)
+ visible: false
+ ColorIcon {
+ anchors { horizontalCenter: parent.horizontalCenter; top: parent.top; topMargin: app.margins }
+ height: app.iconSize
+ width: app.iconSize
+ name: "../images/up.svg"
+ }
+ ColorIcon {
+ anchors { horizontalCenter: parent.horizontalCenter; bottom: parent.bottom; bottomMargin: app.margins }
+ height: app.iconSize
+ width: app.iconSize
+ name: "../images/down.svg"
+ }
+ Rectangle {
+ width: parent.width
+ height: 2
+ color: angleMouseArea.containsMouse ? app.accentColor : "transparent"
+ y: angleMouseArea.mouseY
+ onYChanged: sliderMask.update()
+ }
+
+ }
+ Rectangle {
+ id: mask
+ anchors.fill: parent
+ radius: app.margins
+ color: "blue"
+ visible: false
+ }
+ OpacityMask {
+ id: sliderMask
+ anchors.fill: parent
+ source: angleSlider
+ maskSource: mask
+ }
+
+
+ MouseArea {
+ id: angleMouseArea
+ anchors.fill: parent
+ // angle : totalAngle = mouseY : height
+ property int totalAngle: root.angleStateType.maxValue - root.angleStateType.minValue
+ property int angle: totalAngle * mouseY / height + root.angleStateType.minValue
+ hoverEnabled: true
+
+ property int startY: 0
+
+ onPressed: {
+ startY = mouseY
+ angleMovable.visible = true
+ }
+ onMouseYChanged: if (pressed) angleMovable.angle = angle
+
+ onReleased: {
+ print("released at", angle)
+ var targetAngle = 0
+ if (Math.abs(mouseY - startY) < 5) {
+ print("clicked")
+ // clicked without drag
+ if (mouseY < width) {
+ print("top area")
+ // clicked in top area
+ if (root.angle > 5) {
+ targetAngle = 0;
+ } else {
+ targetAngle = root.angleStateType.minValue
+ }
+ } else if (mouseY > height - width){
+ print("bottom area")
+ //clicked in bottom area
+ if (root.angle < -5) {
+ targetAngle = 0;
+ } else {
+ targetAngle = root.angleStateType.maxValue
+ }
+ } else {
+ targetAngle = angle
+ }
+
+ } else {
+ targetAngle = angle
+ }
+
+ angleMovable.angle = targetAngle
+
+
+ var actionType = root.deviceClass.actionTypes.findByName("angle");
+ var params = [];
+ var percentageParam = {}
+ percentageParam["paramTypeId"] = actionType.paramTypes.findByName("angle").id;
+ percentageParam["value"] = targetAngle
+ params.push(percentageParam);
+ engine.deviceManager.executeAction(root.device.id, actionType.id, params);
+
+ }
+ }
+ }
}
}
}
+
Item {
id: shutterControlsContainer
- Layout.preferredWidth: root.landscape ? Math.max(parent.width / 2, shutterControls.implicitWidth) : parent.width
- Layout.minimumWidth: shutterControls.implicitWidth
+ Layout.columnSpan: root.isVenetian && !root.landscape ? 2 : 1
+ Layout.fillWidth: true
+ Layout.maximumWidth: 500
+// Layout.preferredWidth: root.landscape ? Math.max(parent.width / 2, shutterControls.implicitWidth) : parent.width
+ Layout.margins: app.margins * 2
+ Layout.alignment: Qt.AlignHCenter
Layout.fillHeight: true
- Layout.minimumHeight: app.iconSize * 2.5
+ property int minimumHeight: app.iconSize * 2.5
+ property int minimumWidth: app.iconSize * 2.5 * 3
- Column {
- anchors.centerIn: parent
- width: parent.width - app.margins * 2
- spacing: app.margins
+ ShutterControls {
+ id: shutterControls
+ device: root.device
+ width: parent.width
+ anchors.horizontalCenter: parent.horizontalCenter
+ anchors.verticalCenter: parent.verticalCenter
+ spacing: (width - app.iconSize*2*children.length) / (children.length - 1)
- Slider {
- id: percentageSlider
- width: parent.width
- from: 0
- to: 100
- stepSize: 1
- visible: isExtended
+ property int count: children.length
- 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
- spacing: (parent.width - app.iconSize*2*children.length) / (children.length - 1)
- onActivated: {
- if (button == "open") {
- arrowAnimation.state = "opening"
- } else if (button == "close") {
- arrowAnimation.state = "closing"
- } else {
- arrowAnimation.state = ""
- }
+ onActivated: {
+ if (button == "open") {
+ arrowAnimation.state = "opening"
+ } else if (button == "close") {
+ arrowAnimation.state = "closing"
+ } else {
+ arrowAnimation.state = ""
}
}
}
diff --git a/nymea-app/ui/images/DeviceIconBlind.svg b/nymea-app/ui/images/DeviceIconBlind.svg
deleted file mode 100644
index 46c17f7c..00000000
--- a/nymea-app/ui/images/DeviceIconBlind.svg
+++ /dev/null
@@ -1,59 +0,0 @@
-
-
diff --git a/nymea-app/ui/images/DeviceIconRollerShutter.svg b/nymea-app/ui/images/DeviceIconRollerShutter.svg
deleted file mode 100644
index e99ba932..00000000
--- a/nymea-app/ui/images/DeviceIconRollerShutter.svg
+++ /dev/null
@@ -1,67 +0,0 @@
-
-
diff --git a/nymea-app/ui/images/awning/awning-000.svg b/nymea-app/ui/images/awning/awning-000.svg
index 78f1fce6..ac390060 100644
--- a/nymea-app/ui/images/awning/awning-000.svg
+++ b/nymea-app/ui/images/awning/awning-000.svg
@@ -1,6 +1,4 @@
-
-
diff --git a/nymea-app/ui/images/awning/awning-010.svg b/nymea-app/ui/images/awning/awning-010.svg
index 708e9f7f..7441f972 100644
--- a/nymea-app/ui/images/awning/awning-010.svg
+++ b/nymea-app/ui/images/awning/awning-010.svg
@@ -1,6 +1,4 @@
-
-
diff --git a/nymea-app/ui/images/awning/awning-020.svg b/nymea-app/ui/images/awning/awning-020.svg
index f844d3a6..e463d926 100644
--- a/nymea-app/ui/images/awning/awning-020.svg
+++ b/nymea-app/ui/images/awning/awning-020.svg
@@ -1,6 +1,4 @@
-
-
diff --git a/nymea-app/ui/images/awning/awning-030.svg b/nymea-app/ui/images/awning/awning-030.svg
index 05c2d822..efe044a9 100644
--- a/nymea-app/ui/images/awning/awning-030.svg
+++ b/nymea-app/ui/images/awning/awning-030.svg
@@ -1,6 +1,4 @@
-
-
diff --git a/nymea-app/ui/images/awning/awning-040.svg b/nymea-app/ui/images/awning/awning-040.svg
index 1b5a8a97..78beaaf2 100644
--- a/nymea-app/ui/images/awning/awning-040.svg
+++ b/nymea-app/ui/images/awning/awning-040.svg
@@ -1,6 +1,4 @@
-
-
diff --git a/nymea-app/ui/images/awning/awning-050.svg b/nymea-app/ui/images/awning/awning-050.svg
index 1f8b86b3..0fc0ce99 100644
--- a/nymea-app/ui/images/awning/awning-050.svg
+++ b/nymea-app/ui/images/awning/awning-050.svg
@@ -1,6 +1,4 @@
-
-
diff --git a/nymea-app/ui/images/awning/awning-060.svg b/nymea-app/ui/images/awning/awning-060.svg
index ceb376c4..2b5014ac 100644
--- a/nymea-app/ui/images/awning/awning-060.svg
+++ b/nymea-app/ui/images/awning/awning-060.svg
@@ -1,6 +1,4 @@
-
-
diff --git a/nymea-app/ui/images/awning/awning-070.svg b/nymea-app/ui/images/awning/awning-070.svg
index 23880103..b42c2f86 100644
--- a/nymea-app/ui/images/awning/awning-070.svg
+++ b/nymea-app/ui/images/awning/awning-070.svg
@@ -1,6 +1,4 @@
-
-
diff --git a/nymea-app/ui/images/awning/awning-080.svg b/nymea-app/ui/images/awning/awning-080.svg
index fc4ef304..7c870a00 100644
--- a/nymea-app/ui/images/awning/awning-080.svg
+++ b/nymea-app/ui/images/awning/awning-080.svg
@@ -1,6 +1,4 @@
-
-
diff --git a/nymea-app/ui/images/awning/awning-090.svg b/nymea-app/ui/images/awning/awning-090.svg
index 57fb2191..b9ee62b4 100644
--- a/nymea-app/ui/images/awning/awning-090.svg
+++ b/nymea-app/ui/images/awning/awning-090.svg
@@ -1,6 +1,4 @@
-
-
diff --git a/nymea-app/ui/images/awning/awning-100.svg b/nymea-app/ui/images/awning/awning-100.svg
index 3a470a26..1e7540e8 100644
--- a/nymea-app/ui/images/awning/awning-100.svg
+++ b/nymea-app/ui/images/awning/awning-100.svg
@@ -1,6 +1,4 @@
-
-
diff --git a/nymea-app/ui/images/garage/garage-000.svg b/nymea-app/ui/images/garage/garage-000.svg
new file mode 100644
index 00000000..9b09b93e
--- /dev/null
+++ b/nymea-app/ui/images/garage/garage-000.svg
@@ -0,0 +1,164 @@
+
+
diff --git a/nymea-app/ui/images/garage/garage-010.svg b/nymea-app/ui/images/garage/garage-010.svg
new file mode 100644
index 00000000..39637b9e
--- /dev/null
+++ b/nymea-app/ui/images/garage/garage-010.svg
@@ -0,0 +1,170 @@
+
+
diff --git a/nymea-app/ui/images/garage/garage-020.svg b/nymea-app/ui/images/garage/garage-020.svg
new file mode 100644
index 00000000..af2c4fc6
--- /dev/null
+++ b/nymea-app/ui/images/garage/garage-020.svg
@@ -0,0 +1,176 @@
+
+
diff --git a/nymea-app/ui/images/garage/garage-030.svg b/nymea-app/ui/images/garage/garage-030.svg
new file mode 100644
index 00000000..c0a1df2c
--- /dev/null
+++ b/nymea-app/ui/images/garage/garage-030.svg
@@ -0,0 +1,182 @@
+
+
diff --git a/nymea-app/ui/images/garage/garage-040.svg b/nymea-app/ui/images/garage/garage-040.svg
new file mode 100644
index 00000000..5f1a2665
--- /dev/null
+++ b/nymea-app/ui/images/garage/garage-040.svg
@@ -0,0 +1,188 @@
+
+
diff --git a/nymea-app/ui/images/garage/garage-050.svg b/nymea-app/ui/images/garage/garage-050.svg
new file mode 100644
index 00000000..5debccdd
--- /dev/null
+++ b/nymea-app/ui/images/garage/garage-050.svg
@@ -0,0 +1,194 @@
+
+
diff --git a/nymea-app/ui/images/garage/garage-060.svg b/nymea-app/ui/images/garage/garage-060.svg
new file mode 100644
index 00000000..f0904fea
--- /dev/null
+++ b/nymea-app/ui/images/garage/garage-060.svg
@@ -0,0 +1,200 @@
+
+
diff --git a/nymea-app/ui/images/garage/garage-070.svg b/nymea-app/ui/images/garage/garage-070.svg
new file mode 100644
index 00000000..9d06724d
--- /dev/null
+++ b/nymea-app/ui/images/garage/garage-070.svg
@@ -0,0 +1,206 @@
+
+
diff --git a/nymea-app/ui/images/garage/garage-080.svg b/nymea-app/ui/images/garage/garage-080.svg
new file mode 100644
index 00000000..d3a01ad7
--- /dev/null
+++ b/nymea-app/ui/images/garage/garage-080.svg
@@ -0,0 +1,212 @@
+
+
diff --git a/nymea-app/ui/images/garage/garage-090.svg b/nymea-app/ui/images/garage/garage-090.svg
new file mode 100644
index 00000000..5d4104b2
--- /dev/null
+++ b/nymea-app/ui/images/garage/garage-090.svg
@@ -0,0 +1,218 @@
+
+
diff --git a/nymea-app/ui/images/garage/garage-100.svg b/nymea-app/ui/images/garage/garage-100.svg
new file mode 100644
index 00000000..f4aa3696
--- /dev/null
+++ b/nymea-app/ui/images/garage/garage-100.svg
@@ -0,0 +1,224 @@
+
+
diff --git a/nymea-app/ui/images/garage/garage-inlay.svg b/nymea-app/ui/images/garage/garage-inlay.svg
new file mode 100644
index 00000000..8fb907df
--- /dev/null
+++ b/nymea-app/ui/images/garage/garage-inlay.svg
@@ -0,0 +1,218 @@
+
+
diff --git a/nymea-app/ui/images/shutter/shutter-000.svg b/nymea-app/ui/images/shutter/shutter-000.svg
index 8341cfcc..79ba8310 100644
--- a/nymea-app/ui/images/shutter/shutter-000.svg
+++ b/nymea-app/ui/images/shutter/shutter-000.svg
@@ -1,6 +1,4 @@
-
-
diff --git a/nymea-app/ui/images/shutter/shutter-010.svg b/nymea-app/ui/images/shutter/shutter-010.svg
index bbaeae84..df362f54 100644
--- a/nymea-app/ui/images/shutter/shutter-010.svg
+++ b/nymea-app/ui/images/shutter/shutter-010.svg
@@ -1,6 +1,4 @@
-
-
diff --git a/nymea-app/ui/images/shutter/shutter-020.svg b/nymea-app/ui/images/shutter/shutter-020.svg
index 9eeea0d3..50de83fc 100644
--- a/nymea-app/ui/images/shutter/shutter-020.svg
+++ b/nymea-app/ui/images/shutter/shutter-020.svg
@@ -1,6 +1,4 @@
-
-
diff --git a/nymea-app/ui/images/shutter/shutter-030.svg b/nymea-app/ui/images/shutter/shutter-030.svg
index 64252b84..279a0edd 100644
--- a/nymea-app/ui/images/shutter/shutter-030.svg
+++ b/nymea-app/ui/images/shutter/shutter-030.svg
@@ -1,6 +1,4 @@
-
-
diff --git a/nymea-app/ui/images/shutter/shutter-040.svg b/nymea-app/ui/images/shutter/shutter-040.svg
index e4151323..f16bd112 100644
--- a/nymea-app/ui/images/shutter/shutter-040.svg
+++ b/nymea-app/ui/images/shutter/shutter-040.svg
@@ -1,6 +1,4 @@
-
-
diff --git a/nymea-app/ui/images/shutter/shutter-050.svg b/nymea-app/ui/images/shutter/shutter-050.svg
index a5666c43..6d6cad9a 100644
--- a/nymea-app/ui/images/shutter/shutter-050.svg
+++ b/nymea-app/ui/images/shutter/shutter-050.svg
@@ -1,6 +1,4 @@
-
-
diff --git a/nymea-app/ui/images/shutter/shutter-060.svg b/nymea-app/ui/images/shutter/shutter-060.svg
index cdca2cd1..739f47fc 100644
--- a/nymea-app/ui/images/shutter/shutter-060.svg
+++ b/nymea-app/ui/images/shutter/shutter-060.svg
@@ -1,6 +1,4 @@
-
-
diff --git a/nymea-app/ui/images/shutter/shutter-070.svg b/nymea-app/ui/images/shutter/shutter-070.svg
index 4411d606..96b214a4 100644
--- a/nymea-app/ui/images/shutter/shutter-070.svg
+++ b/nymea-app/ui/images/shutter/shutter-070.svg
@@ -1,6 +1,4 @@
-
-
diff --git a/nymea-app/ui/images/shutter/shutter-080.svg b/nymea-app/ui/images/shutter/shutter-080.svg
index 9aac397a..2c9da478 100644
--- a/nymea-app/ui/images/shutter/shutter-080.svg
+++ b/nymea-app/ui/images/shutter/shutter-080.svg
@@ -1,6 +1,4 @@
-
-
diff --git a/nymea-app/ui/images/shutter/shutter-090.svg b/nymea-app/ui/images/shutter/shutter-090.svg
index ecdae2ba..1ce1d5cf 100644
--- a/nymea-app/ui/images/shutter/shutter-090.svg
+++ b/nymea-app/ui/images/shutter/shutter-090.svg
@@ -1,6 +1,4 @@
-
-
diff --git a/nymea-app/ui/images/shutter/shutter-100.svg b/nymea-app/ui/images/shutter/shutter-100.svg
index e021fba4..61ae65b1 100644
--- a/nymea-app/ui/images/shutter/shutter-100.svg
+++ b/nymea-app/ui/images/shutter/shutter-100.svg
@@ -1,6 +1,4 @@
-
-
diff --git a/nymea-app/ui/images/shutter/shutter-inlay.svg b/nymea-app/ui/images/shutter/shutter-inlay.svg
new file mode 100644
index 00000000..4475e34f
--- /dev/null
+++ b/nymea-app/ui/images/shutter/shutter-inlay.svg
@@ -0,0 +1,218 @@
+
+