C

Qt Quick Ultralite Thermostat Demo

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

Item {
    id: root
    Connections {
        target: GlobalState
        function onSelectedRoomChanged(selectedRoom: Room) {
            tempSliderAnimations.enabled = GlobalState.scheduleViewLoaded;
            timeSlider.roomSwitched();
            tempSlider.value = GlobalState.selectedRoom.temperature;
        }
    }
    Column {
        id: columnItem
        anchors.fill: parent
        spacing: Theme.sliderSpacing
        y: Theme.roomScheduleTopMargin

        Column {
            anchors.horizontalCenter: parent.horizontalCenter
            spacing: Theme.sliderLabelSpacing
            width: Theme.sliderWidth

            StaticText {
                anchors.left: parent.left
                anchors.right: parent.right
                color: "#3c94eb"
                font.pixelSize: Theme.sliderLabelFontSize
                //% "Set interval time"
                text: qsTrId("id-setintervaltime")
            }
            TimeIntervalSlider {
                id: timeSlider
                height: sliderContainer.height
                width: Theme.sliderWidth
            }
        }
        Column {
            anchors.horizontalCenter: parent.horizontalCenter
            spacing: Theme.sliderLabelSpacing
            width: Theme.sliderWidth

            StaticText {
                id: tempText
                anchors.left: parent.left
                anchors.right: parent.right
                color: "#3c94eb"
                font.pixelSize: Theme.sliderLabelFontSize
                //% "Set temperature"
                text: qsTrId("id-settemperature")
            }
            Item {
                id: sliderContainer
                height: tempSlider.handle.height + tempSlider.topPadding + tempSlider.bottomPadding

                Slider {
                    id: tempSlider
                    anchors.verticalCenter: parent.verticalCenter
                    from: Units.fahrenheitToTemperatureUnit(50)
                    height: sliderContainer.height + 20 // to improve touchability
                    implicitWidth: Theme.sliderWidth
                    stepSize: 1
                    to: Units.fahrenheitToTemperatureUnit(90)
                    value: GlobalState.selectedRoom.temperature

                    background: Image {
                        anchors.verticalCenter: parent.verticalCenter
                        source: "scrollbar-temperature-track.png"
                    }
                    handle: Item {
                        height: Theme.sliderHandleSize
                        width: Theme.sliderHandleSize
                        x: tempSlider.leftPadding + tempSlider.visualPosition * (tempSlider.availableWidth - width)
                        y: (tempSlider.height - height) / 2

                        Behavior on x  {
                            id: tempSliderAnimations
                            enabled: GlobalState.scheduleViewLoaded

                            NumberAnimation {
                                onRunningChanged: {
                                    if (!running) {
                                        tempSliderAnimations.enabled = false;
                                    }
                                }
                            }
                        }

                        Image {
                            anchors.centerIn: parent
                            anchors.verticalCenterOffset: 6 // account for shadow
                            source: "slider-handle.png"
                        }
                        Row {
                            anchors.bottom: parent.top
                            anchors.bottomMargin: 4
                            anchors.horizontalCenter: parent.horizontalCenter
                            spacing: 2

                            Text {
                                color: "#3d464d"
                                font.pixelSize: Theme.sliderHandleLabelFontSize
                                text: tempSlider.value.toString()
                            }
                            StaticText {
                                color: "#3d464d"
                                font.pixelSize: Theme.sliderHandleLabelFontSize
                                text: Units.temperatureSymbol
                            }
                        }
                    }

                    onMoved: GlobalState.selectedRoom.temperature = value
                }
            }
        }
    }
}