C

Qt Quick Ultralite Thermostat Demo

// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial

import QtQuick 2.15
import Thermo 1.0

Item {
    id: slider
    y: -Theme.roomViewTempHeight
    height: Theme.roomViewTempHeight * 3
    width: Theme.roomViewTempWidth/2

    property alias reversed: animation.reversed
    property alias stopAnimation: animation.stopAnimation

    property int prevValue: 0
    property int value: 0
    onValueChanged: {
        animation.start()
        prevValue = value
    }

    property int currentDigit: 0
    property int prevDigit: (currentDigit+9)%10
    property int nextDigit: (currentDigit+1)%10

    Column {
        Text {
            id: nextValueText
            visible: slider.visible;
            color: "#3d464d";
            text: slider.nextDigit
            font.pixelSize: Theme.wheelTempTextSize;
            verticalAlignment: Text.AlignVCenter
            width: Theme.roomViewTempWidth/2
            height: Theme.roomViewTempHeight
        }
        Text {
            id: currentValueText
            visible: slider.visible;
            color: "#3d464d";
            text: slider.currentDigit
            font.pixelSize: Theme.wheelTempTextSize;
            verticalAlignment: Text.AlignVCenter
            width: Theme.roomViewTempWidth/2
            height: Theme.roomViewTempHeight
        }
        Text {
            id: prevValueText
            visible: slider.visible;
            color: "#3d464d";
            text: slider.prevDigit
            font.pixelSize: Theme.wheelTempTextSize;
            verticalAlignment: Text.AlignVCenter
            width: Theme.roomViewTempWidth/2
            height: Theme.roomViewTempHeight
        }
    }

    SequentialAnimation {
        id: animation
        property bool reversed: true
        property bool stopAnimation: false
        running: slider.currentDigit != slider.value

        ScriptAction {
            script: { // this script prevent situation when digits are not changed during fast change
                slider.currentDigit = ((animation.reversed ? slider.value + 1 : slider.value - 1) + 10) % 10
            }
        }
        NumberAnimation {
            target: slider
            property: "y"
            duration: animation.stopAnimation ? 0 : 250
            from: -Theme.roomViewTempHeight
            to: animation.reversed ? -2*Theme.roomViewTempHeight : 0
        }
        ScriptAction {
            script: {
                slider.currentDigit = slider.value
                slider.y = -Theme.roomViewTempHeight
            }
        }
    }
}