C

Qt Quick Ultralite Watch Demo

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

import QtQuick 2.15
import Watch 1.0

Item {
    enum AppId {
        Tools       = 0,
        Compass     = 1,
        SportApp    = 2,
        YourHealth  = 3,
        Settings    = 4
    }
    id: root
    property bool onScreen: false
    property bool offScreen: false
    property real selectedOp: 1.0
    property real othersOp: 0.1
    readonly property int entryHeight: 90
    readonly property int entryWidth: width

    readonly property int maxTextAlpha: 255
    readonly property int minTextAlpha: 178

    property int currentIndex: 3

    signal selected(ApplicationList.AppId app)

    function isCurrentIndex(i : int) : bool {
        return i === root.currentIndex
    }

    function swipeToIndex(index: int) {
        listView.contentY = entryHeight * index - (2 * entryHeight)
    }

    ListView {
        id: listView
        anchors.fill: parent
        clip: true

        Component.onCompleted: {
            swipeToIndex(currentIndex)
        }

        onContentYChanged: {
            var __localIndex = Math.round(Math.abs(contentY) / entryHeight)
            currentIndex = Math.min(__localIndex + 2, 6)
        }

        // Two items are placed at the beginning and at the end
        // are included so that we could we could center selected
        // item
        model: ListModel {
            ListElement { name: ""; img: "images/list/tools.png"; imgBig: "images/list/tools-big.png" }
            ListElement { name: ""; img: "images/list/tools.png"; imgBig: "images/list/tools-big.png" }
            ListElement { name: "Tools"; img: "images/list/tools.png"; imgBig: "images/list/tools-big.png" }
            ListElement { name: "Compass"; img: "images/list/compass.png"; imgBig: "images/list/compass-big.png" }
            ListElement { name: "Sport App"; img: "images/list/sport-app.png"; imgBig: "images/list/sport-app-big.png" }
            ListElement { name: "Your Health"; img: "images/list/your-health.png"; imgBig: "images/list/your-health-big.png" }
            ListElement { name: "Settings"; img: "images/list/settings.png"; imgBig: "images/list/settings-big.png" }
            ListElement { name: ""; img: "images/list/tools.png"; imgBig: "images/list/tools-big.png" }
            ListElement { name: ""; img: "images/list/tools.png"; imgBig: "images/list/tools-big.png" }
        }

        delegate: MouseArea {
            id: delegate
            width: root.entryWidth
            height: root.entryHeight

            onClicked: {
                if (model.name === "") {
                    return
                }
                if (root.currentIndex === index ) {
                    selected(index-2)
                }
                currentIndex = index
                swipeToIndex(currentIndex)
            }

            opacity: index === root.currentIndex ? selectedOp : othersOp

            Image {
                id: image
                anchors.left: parent.left
                anchors.leftMargin: margin
                anchors.verticalCenter: parent.verticalCenter
                source: isCurrentIndex(index) ? model.imgBig : model.img
                visible: model.name !== ""

                property int margin: isCurrentIndex(index) ? 8 : 18
            }

            Text {
                anchors.left: image.right
                anchors.leftMargin: 25
                anchors.verticalCenter: parent.verticalCenter
                text: model.name
                font.pixelSize: 34
                font.family: Theme.fontFamily
                color: Qt.rgba(255, 255, 255, alpha/maxTextAlpha);

                property int alpha: isCurrentIndex(-index) ? maxTextAlpha : minTextAlpha
            }
        }
    }
}