C

Qt Quick Ultralite Automotive Cluster Demo

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

import QtQuick 2.15
import QtQuickUltralite.Extras 2.0
import Automotive 1.0

NormalModeContentItem {
    property int currentTab: SettingsMenuModel.currentTab;

    Item {
        id: middle
        width: psuedoMaskVertical.width;
        height: psuedoMaskVertical.height;
        clip: true;
        anchors.horizontalCenter: parent.horizontalCenter
        y: 69

        property int fuelConsumption: 4
        property int distanceTraveled: MainModel.odo - MainModel.initialOdo
        property int travelTime: MainModel.travelTime

        Timer {
            id: fuelConsumptionSimulation
            running: true
            repeat: true
            interval: 2000
            onTriggered: { middle.fuelConsumption = Math.round(Math.random()*9)}
        }

        Item {
            id: middleSliding;
            height: parent.height;
            width: parent.width * 3;
            x: - parent.width * currentTab;
            Behavior on x { NumberAnimation { } }

            DriveModeSelector {
                y: 96;
                x: 335 - middle.x
                width: middle.width;
                visible: !SportModeModel.menuActive
            }

            Column {
                y: 72;
                width: middle.width;
                x: width;
                Repeater {
                    model: [
                        { text: "Lights", ok: true },
                        { text: "Tire pressure", ok: false },
                        { text: "Windshield washer fluid", ok: false },
                    ]
                    delegate: Item {
                        width: 221;
                        height: 33;
                        anchors.horizontalCenter: parent.horizontalCenter
                        Text {
                            text: modelData.text;
                            color: Style.lightPeriwinkle;
                            font.pixelSize: 16;
                            font.family: "Sarabun";
                        }
                        Text {
                            anchors.right: parent.right
                            text: modelData.ok ? "OK" : "Low";
                            color: modelData.ok ? Style.lightPeriwinkle : Style.orange;
                            font.pixelSize: 16;
                            font.bold: true;
                            font.family: "Sarabun";
                        }
                    }
                }
            }

            Column {
                y: 72;
                width: middle.width;
                x: width * 2;
                spacing: 15
                Row {
                    x: 335 - middle.x
                    Image {
                        id: clockIndicator
                        source: "images/clock.png";
                    }
                    Item {
                        width: 23
                    }
                    Text {
                        anchors.verticalCenter: clockIndicator.verticalCenter
                        id: travelTimeValueH
                        text: Math.floor(middle.travelTime / 3600);
                        font.pixelSize: 20;
                        font.bold: true;
                        font.family: "Sarabun";
                        color: Style.lightPeriwinkle;
                    }
                    Text {
                        anchors.verticalCenter: clockIndicator.verticalCenter
                        id: travelTimeHourValueSeparator
                        text: (middle.travelTime % 3600) / 60 < 10 ? ":0" : ":";
                        font.pixelSize: 20;
                        font.bold: true;
                        font.family: "Sarabun";
                        color: Style.lightPeriwinkle;
                    }
                    Text {
                        anchors.verticalCenter: clockIndicator.verticalCenter
                        id: travelTimeValueMinutes
                        text: Math.floor((middle.travelTime % 3600) / 60);
                        font.pixelSize: 20;
                        font.bold: true;
                        font.family: "Sarabun";
                        color: Style.lightPeriwinkle;
                    }
                    Text {
                        anchors.verticalCenter: clockIndicator.verticalCenter
                        id: travelTimeMinuteValueSeparator
                        text: middle.travelTime % 60 < 10 ? ":0" : ":";
                        font.pixelSize: 20;
                        font.bold: true;
                        font.family: "Sarabun";
                        color: Style.lightPeriwinkle;
                    }
                    Text {
                        anchors.verticalCenter: clockIndicator.verticalCenter
                        id: travelTimeValueSeconds
                        text: Math.floor(middle.travelTime % 60);
                        font.pixelSize: 20;
                        font.bold: true;
                        font.family: "Sarabun";
                        color: Style.lightPeriwinkle;
                    }
                    Item {
                        width: 5
                    }
                    Text {
                        text: "h";
                        font.pixelSize: 14;
                        font.bold: true;
                        font.family: "Sarabun";
                        color: Style.lightPeriwinkle;
                        anchors.baseline: travelTimeValueMinutes.baseline;
                    }
                }

                Row {
                    x: 335 - middle.x
                    Image {
                        id: roadIndicator
                        source: "images/road.png";
                    }
                    Item {
                        width: 23
                    }
                    Text {
                        anchors.verticalCenter: roadIndicator.verticalCenter
                        id: distanceValue
                        text: middle.distanceTraveled;
                        font.pixelSize: 20;
                        font.bold: true;
                        font.family: "Sarabun";
                        color: Style.lightPeriwinkle;
                    }
                    Item {
                        width: 5
                    }
                    Text {
                        text: Units.longDistanceUnit;
                        font.pixelSize: 14;
                        font.bold: true;
                        font.family: "Sarabun";
                        color: Style.lightPeriwinkle;
                        anchors.baseline: distanceValue.baseline;
                    }
                }

                Row {
                    x: 335 - middle.x
                    Image {
                        id: fuelIndicator
                        source: "images/fuel.png";
                    }
                    Item {
                        width: 23
                    }
                    Text {
                        anchors.verticalCenter: fuelIndicator.verticalCenter
                        id: fuelConsumptionValueConstPart
                        text: "5.";
                        font.pixelSize: 20;
                        font.bold: true;
                        font.family: "Sarabun";
                        color: Style.lightPeriwinkle;
                    }
                    Text {
                        anchors.verticalCenter: fuelIndicator.verticalCenter
                        id: fuelConsumptionValue
                        text: middle.fuelConsumption;
                        font.pixelSize: 20;
                        font.bold: true;
                        font.family: "Sarabun";
                        color: Style.lightPeriwinkle;
                    }
                    Item {
                        width: 5
                    }
                    Text {
                        text: Units.fuelUsageUnit;
                        font.pixelSize: 14;
                        font.bold: true;
                        font.family: "Sarabun";
                        color: Style.lightPeriwinkle;
                        anchors.baseline: fuelConsumptionValue.baseline;
                    }
                }
            }
        }

        Image {
            id: psuedoMaskVertical;
            source: "images/pseudo-mask-vertical.png"
        }
    }

    Row {
        spacing: 23
        y: 74

        anchors.horizontalCenter: parent.horizontalCenter

        Repeater {
            model: ["Display", "Car status", "Last trip"];

            delegate: Text {
                text: modelData;
                color: Style.lightPeriwinkle;
                font.pixelSize: 12;
                font.family: "Sarabun";
                opacity: currentTab == index ? 1 : 0.2;
                Behavior on opacity { NumberAnimation { } }
            }
        }
    }

    StaticText {
        id: tirePressureText
        opacity: currentTab == SettingsMenuModel.CarStatusTab ? 1 : 0
        Behavior on opacity { NumberAnimation { } }
        text: "Tire pressure"
        color: Style.lightPeriwinkle
        font.pixelSize: 16
        font.family: "Sarabun";
        anchors.horizontalCenter: parent.horizontalCenter
        y: 434
    }

    StaticText {
        opacity: tirePressureText.opacity
        text: "bar"
        color: Style.brightBlue
        font.pixelSize: 12
        font.family: "Sarabun";
        x: 482
        y: 405
    }

    Repeater {
        model: [
            { x: 323, y: 405, value: 2.3 },
            { x: 329, y: 368, value: 2.3 },
            { x: 437, y: 368, value: 1.9 },
            { x: 444, y: 405, value: 2.3 },
        ]
        delegate: Rectangle {
            property bool isLow: modelData.value < 2;
            x: modelData.x;
            y: modelData.y;
            color: isLow ? Style.orange : Style.brightBlue;
            opacity: tirePressureText.opacity;
            radius: 3;
            width: 32;
            height: 16;
            Rectangle {
                visible: !isLow;
                anchors.fill: parent;
                anchors.margins: 1;
                radius: 3;
                color: "#00091a";
            }
            Text {
                anchors.centerIn: parent;
                text: modelData.value.toFixed(2);
                color: isLow ? "#613600" : Style.brightBlue
                font.pixelSize: 10;
                font.family: "Sarabun";
            }
        }
    }
}