This repository has been archived on 2026-05-31. You can view files and clone it, but cannot push or open issues or pull requests.
2023-02-25 17:03:01 +01:00

207 lines
9.2 KiB
QML

import QtQuick 2.3
import QtQuick.Controls 2.3
import QtQuick.Layouts 1.1
import "qrc:/ui/components"
import "qrc:/ui/customviews"
import "qrc:/ui/delegates"
import Nymea 1.0
import NymeaApp.Utils 1.0
import Nymea.AirConditioning 1.0
Item {
id: root
property AirConditioningManager acManager: null
property ZoneInfoWrapper zoneWrapper: null
readonly property ZoneInfo zone: zoneWrapper.zone
Flickable {
id: flickable
anchors.fill: parent
contentHeight: contentLayout.childrenRect.height + Style.margins
clip: true
GridLayout {
id: contentLayout
width: parent.width
columns: app.landscape ? 2 : 1
Item {
Layout.fillWidth: true
Layout.preferredHeight: flickable.height / 2
implicitWidth: thermostat.implicitWidth
visible: zoneWrapper.thermostats.count > 0
CircleBackground {
id: thermostat
anchors { fill: parent; leftMargin: Style.hugeMargins; rightMargin: Style.hugeMargins; topMargin: Style.margins; bottomMargin: Style.margins }
Dial {
id: thermostatDial
anchors.fill: parent
minValue: 10
maxValue: 30
precision: 0.5
value: root.zone.currentSetpoint
color: pendingValue < activeValue ? Style.blue : Style.red
activeValue: zone.temperature
onMoved: {
acManager.setZoneSetpointOverride(root.zone.id, value, ZoneInfo.SetpointOverrideModeEventual, 0)
}
onClicked: {
var comp = Qt.createComponent(Qt.resolvedUrl("TimeOverrideDialog.qml"))
var dialog = comp.createObject(root, {acManager: root.acManager, zone: root.zone})
dialog.open()
}
}
ColumnLayout {
anchors.centerIn: parent
anchors.verticalCenterOffset: -Style.smallMargins
width: parent.contentItem.width * 0.6
Label {
Layout.fillWidth: true
text: Types.toUiUnit(Types.UnitDegreeCelsius)
font.pixelSize: Math.min(Style.smallFont.pixelSize, thermostat.contentItem.height / 16)
horizontalAlignment: Text.AlignHCenter
}
Label {
Layout.fillWidth: true
text: Types.toUiValue(zone.currentSetpoint, Types.UnitDegreeCelsius).toFixed(1)
font.pixelSize: Math.min(Style.hugeFont.pixelSize, thermostat.contentItem.height / 8)
horizontalAlignment: Text.AlignHCenter
color: zone.currentSetpoint > zone.temperature
? Style.red
: zone.currentSetpoint < zone.temperature
? Style.blue
: Style.foregroundColor
}
Label {
Layout.fillWidth: true
text: Types.toUiValue(zone.temperature, Types.UnitDegreeCelsius).toFixed(1)
font.pixelSize: Math.min(Style.largeFont.pixelSize, thermostat.contentItem.height / 12)
wrapMode: Text.WordWrap
horizontalAlignment: Text.AlignHCenter
elide: Text.ElideRight
}
ColorIcon {
Layout.alignment: Qt.AlignHCenter
size: Style.smallIconSize
name: {
switch (root.zone.setpointOverrideMode) {
case ZoneInfo.SetpointOverrideModeUnlimited:
return "infinity"
case ZoneInfo.SetpointOverrideModeTimed:
return "alarm-clock"
case ZoneInfo.SetpointOverrideModeEventual:
return "event"
}
return ""
}
}
}
ColorIcon {
anchors.horizontalCenter: thermostatDial.horizontalCenter
y: parent.contentItem.y + parent.contentItem.height - height - Style.smallMargins
size: Math.min(Style.bigIconSize, thermostatDial.height / 5)
name: zoneWrapper.heatingThermostats.count > 0
? "../images/thermostat/heating.svg"
: zoneWrapper.coolingThermostats.count > 0
? "../images/thermostat/cooling.svg"
: ""
color: zoneWrapper.heatingThermostats.count > 0
? app.interfaceToColor("heating")
: zoneWrapper.coolingThermostats.count > 0
? app.interfaceToColor("cooling")
: Style.iconColor
}
}
}
Item {
Layout.fillWidth: true
Layout.preferredHeight: zoneWrapper.thermostats.count > 0 ? flickable.height / 2 : flickable.height
implicitWidth: 800
implicitHeight: statusIcons.implicitHeight
Layout.minimumHeight: statusIcons.implicitHeight
BigZoneStatusIcons {
id: statusIcons
acManager: root.acManager
zoneWrapper: root.zoneWrapper
iconSize: Style.bigIconSize
width: parent.width - Style.margins * 2
anchors.centerIn: parent
}
ColorIcon {
anchors { horizontalCenter: parent.horizontalCenter; bottom: parent.bottom; bottomMargin: Style.margins }
name: "down"
opacity: zoneWrapper.indoorSensors.count > 0 && flickable.contentY - flickable.originY <= 0 && !app.landscape ? 1 : 0
Behavior on opacity { NumberAnimation { duration: Style.animationDuration } }
}
}
GridLayout {
Layout.fillWidth: true
columns: Math.ceil(width / 600)
Layout.columnSpan: contentLayout.columns
rowSpacing: 0
columnSpacing: 0
Repeater {
model: zoneWrapper.thermostats
delegate: SensorListDelegate {
Layout.fillWidth: true
thing: zoneWrapper.thermostats.get(index)
onClicked: {
var page = NymeaUtils.interfaceListToDevicePage(thing.thingClass.interfaces);
pageStack.push(Qt.resolvedUrl("/ui/devicepages/" + page), {thing: thing})
}
}
}
Repeater {
model: zoneWrapper.indoorSensors
delegate: SensorListDelegate {
Layout.fillWidth: true
thing: zoneWrapper.indoorSensors.get(index)
onClicked: {
var page = NymeaUtils.interfaceListToDevicePage(thing.thingClass.interfaces);
pageStack.push(Qt.resolvedUrl("/ui/devicepages/" + page), {thing: thing})
}
}
}
Repeater {
model: zoneWrapper.windowSensors
delegate: SensorListDelegate {
Layout.fillWidth: true
thing: zoneWrapper.windowSensors.get(index)
onClicked: {
var page = NymeaUtils.interfaceListToDevicePage(thing.thingClass.interfaces);
pageStack.push(Qt.resolvedUrl("/ui/devicepages/" + page), {thing: thing})
}
}
}
}
}
}
EmptyViewPlaceholder {
visible: zoneWrapper.thermostats.count == 0 && zoneWrapper.windowSensors.count == 0 && zoneWrapper.indoorSensors.count == 0
anchors.centerIn: parent
width: parent.width - app.margins * 2
title: qsTr("No things in this zone.")
text: qsTr("In order for this zone zo be useful, assign some things to it.")
imageSource: "/ui/images/sensors.svg"
buttonText: qsTr("Add things")
onButtonClicked: {
pageStack.push(Qt.resolvedUrl("EditZoneThingsPage.qml"), {acManager: acManager, zone: zone})
}
}
}