C

Qt Quick Ultralite Thermostat Demo

// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial
import QtQuick 2.15
import QtQuickUltralite.Extras 2.0
import Thermo 1.0

Item {
    id: root

    property Room room

    signal selected

    height: Theme.cardHeight
    width: Theme.cardWidth

    Item {
        height: Theme.cardHeight
        width: Theme.cardWidth

        Image {
            source: "images/card-back-topleft.png"
        }
        Rectangle {
            color: ColorStyle.greyLight1
            height: Theme.cardCornerRadius
            width: Theme.cardWidth - 2 * Theme.cardCornerRadius
            x: Theme.cardCornerRadius
        }
        Image {
            source: "images/card-back-topright.png"
            x: Theme.cardWidth - Theme.cardCornerRadius
        }
        Rectangle {
            color: ColorStyle.greyLight1
            height: Theme.cardHeight - 2 * Theme.cardCornerRadius
            width: Theme.cardWidth
            y: Theme.cardCornerRadius
        }
        Image {
            source: "images/card-back-bottomleft.png"
            y: Theme.cardHeight - Theme.cardCornerRadius
        }
        Rectangle {
            color: ColorStyle.greyLight1
            height: Theme.cardCornerRadius
            width: Theme.cardWidth - 2 * Theme.cardCornerRadius
            x: Theme.cardCornerRadius
            y: Theme.cardHeight - Theme.cardCornerRadius
        }
        Image {
            source: "images/card-back-bottomright.png"
            x: Theme.cardWidth - Theme.cardCornerRadius
            y: Theme.cardHeight - Theme.cardCornerRadius
        }
        Row {
            id: temperatureText
            anchors.left: parent.left
            anchors.leftMargin: Theme.cardTemperatureLeftMargin
            anchors.right: parent.right
            anchors.top: parent.top
            anchors.topMargin: Theme.cardTemperatureTopMargin
            height: 48
            visible: temp.text.length !== 0
            width: temp.text.length != 0 ? 92 : 0

            Text {
                id: temp
                anchors.top: parent.top
                anchors.topMargin: -8
                color: ColorStyle.greyDark4
                font.pixelSize: 60
                height: parent.height
                text: root.room.power ? root.room.temperature : ""
                visible: text.length !== 0
            }
            Text {
                anchors.top: parent.top
                color: ColorStyle.greyDark4
                font.pixelSize: 20
                text: Units.temperatureSymbol
            }
        }
        Column {
            id: roomColumn
            anchors.left: parent.left
            anchors.leftMargin: Theme.cardRoomColumnLeftMargin
            anchors.right: parent.right
            anchors.rightMargin: Theme.cardRoomColumnRightMargin
            anchors.top: parent.top
            anchors.topMargin: Theme.cardRoomColumnTopMargin

            // The line height from Hindi font causes the floor text
            // to overflow the separator line.
            spacing: !Theme.isBig && Qt.uiLanguage === "hi_IN" ? -6 : Theme.cardRoomColumnSpacing

            Text {
                color: ColorStyle.greyDark4
                font.pixelSize: Theme.cardRoomFontSize
                text: root.room.name
                width: parent.width
            }
            Text {
                color: ColorStyle.greyDark1
                font.pixelSize: Theme.cardFloorFontSize
                text: root.room.floor
                width: parent.width
            }
        }
        Image {
            source: "separator-line.png"
            x: Theme.cardSeparatorLeftMargin
            y: Theme.cardSeparatorTopMargin
        }
        Row {
            anchors.bottom: parent.bottom
            anchors.bottomMargin: 25
            anchors.left: parent.left
            anchors.leftMargin: 22
            spacing: Theme.cardIndicatorSpacing
            visible: root.room.status != Room.Off && !root.room.auto_

            ColorizedImage {
                color: root.room.dryer ? ColorStyle.blue : ColorStyle.greyMedium3
                source: "dryer-on-small.png"
            }
            Image {
                source: root.room.smallFanImage()
            }
            ColorizedImage {
                color: root.room.eco ? ColorStyle.blue : ColorStyle.greyMedium3
                source: "eco-on-small.png"
            }
            ColorizedImage {
                color: root.room.streamer ? ColorStyle.blue : ColorStyle.greyMedium3
                source: "streamer-on-small.png"
            }
        }
        Image {
            id: autoIndicator
            anchors.bottom: parent.bottom
            anchors.bottomMargin: 25
            anchors.left: parent.left
            anchors.leftMargin: 22
            source: "auto-card.png"
            visible: root.room.status != Room.Off && root.room.auto_
        }
        Row {
            anchors.bottom: parent.bottom
            anchors.bottomMargin: 23
            anchors.right: parent.right
            anchors.rightMargin: Theme.cardStateRightMargin
            spacing: 3

            Text {
                color: ColorStyle.greyDark1
                font.pixelSize: Theme.cardStateFontSize
                text: {
                    switch (root.room.status) {
                    case Room.Heating:
                        //% "Heating"
                        return qsTrId("id-heating");
                    case Room.Cooling:
                        //% "Cooling"
                        return qsTrId("id-cooling");
                    default:
                        //% "Off"
                        return qsTrId("id-off");
                    }
                }
            }
            ColorizedImage {
                color: {
                    switch (root.room.status) {
                    case Room.Heating:
                        return ColorStyle.pinkyRed;
                    case Room.Cooling:
                        return ColorStyle.blue;
                    default:
                        return ColorStyle.greyMedium3;
                    }
                }
                source: "status-small.png"
                y: Theme.isBig ? 3 : 2
            }
        }
        MouseArea {
            id: ta
            anchors.fill: parent
            enabled: root.enabled
            z: 1

            onClicked: root.selected()
        }
    }
    PowerSwitch {
        id: enabledSwitch
        anchors.right: parent.right
        anchors.rightMargin: Theme.powerSwitchRightMargin
        checked: root.room.status !== Room.Off
        enabled: root.enabled
        y: Theme.powerSwitchTopMargin

        onCheckedChanged: {
            root.room.power = checked;
        }
        onEnabledChanged: {
            checked = (root.room.status !== Room.Off);
        }
    }
}