// Copyright (C) 2023 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause import QtQuick import QtQuick.Controls import QtQuick.Layouts Item { id: mapLayersItem implicitWidth: width implicitHeight: 126 width: opened ? 284 : 90 property Component mapActionButton: null property alias lightningLayerVisible: lightningLayerButton.checked property alias distanceLayerVisible: distanceButton.checked property bool opened: false function toggle() { if (opened) close(); else open(); } function close() { timer.stop(); opened = false; } function open() { timer.restart(); opened = true; } Rectangle { anchors.fill: parent radius: 25 gradient: Gradient { orientation: Gradient.Horizontal GradientStop { position: 0.0; color: "#00414A" } GradientStop { position: 1.0; color: "#0C1C1F" } } opacity: mapLayersItem.opened ? 0.9 : 0 Behavior on opacity { NumberAnimation { duration: 200 } } } RowLayout { anchors.fill: parent anchors.margins: 15 spacing: 0 Loader { Layout.preferredWidth: item ? item.width : mapLayersItem.buttonSize Layout.preferredHeight: item ? item.height : mapLayersItem.buttonSize sourceComponent: mapActionButton } Item { Layout.preferredWidth: 47 Layout.fillHeight: true visible: mapLayersItem.opened Rectangle { anchors.centerIn: parent width: 2 height: 22 color: "#2CDE85" } } Item { Layout.preferredWidth: mapLayersItem.buttonSize Layout.fillHeight: true visible: mapLayersItem.opened ColumnLayout { anchors.fill: parent spacing: 8 RoundButton { id: lightningLayerButton Layout.preferredWidth: mapLayersItem.buttonSize Layout.preferredHeight: mapLayersItem.buttonSize icon.source: "icons/lightning-layer.svg" icon.color: mapLayersItem.getIconColor(pressed, checked, hovered) icon.width: mapLayersItem.iconSize icon.height: mapLayersItem.iconSize checkable: true onClicked: timer.restart(); leftPadding: checked ? (mapLayersItem.buttonSize-mapLayersItem.iconSize) / 2 : (mapLayersItem.buttonSize-mapLayersItem.iconSize) / 2 - 2 topPadding: checked ? (mapLayersItem.buttonSize-mapLayersItem.iconSize) / 2 : (mapLayersItem.buttonSize-mapLayersItem.iconSize) / 2 - 2 } Text { text: qsTr("Lightning\nLive") Layout.fillWidth: true horizontalAlignment: Qt.AlignHCenter color: mapLayersItem.getTextColor(lightningLayerButton.checked, lightningLayerButton.hovered) font.family: "SF Pro Display" font.pixelSize: 12 font.styleName: "normal" font.weight: 400 } Item { Layout.fillHeight: true } } } Item { Layout.preferredWidth: 20 Layout.fillHeight: true visible: mapLayersItem.opened } Item { Layout.preferredWidth: mapLayersItem.buttonSize Layout.fillHeight: true visible: mapLayersItem.opened ColumnLayout { anchors.fill: parent spacing: 8 RoundButton { id: distanceButton Layout.preferredWidth: mapLayersItem.buttonSize Layout.preferredHeight: mapLayersItem.buttonSize icon.source: "icons/distance.svg" icon.color: mapLayersItem.getIconColor(pressed, checked, hovered) icon.width: mapLayersItem.iconSize icon.height: mapLayersItem.iconSize checkable: true onClicked: timer.restart(); leftPadding: checked ? (mapLayersItem.buttonSize-mapLayersItem.iconSize) / 2 : (mapLayersItem.buttonSize-mapLayersItem.iconSize) / 2 - 2 topPadding: checked ? (mapLayersItem.buttonSize-mapLayersItem.iconSize) / 2 : (mapLayersItem.buttonSize-mapLayersItem.iconSize) / 2 - 2 } Text { text: qsTr("Distance\n& Time") Layout.fillWidth: true horizontalAlignment: Qt.AlignHCenter color: mapLayersItem.getTextColor(distanceButton.checked, distanceButton.hovered) font.family: "SF Pro Display" font.pixelSize: 12 font.styleName: "normal" font.weight: 400 } Item { Layout.fillHeight: true } } } } Behavior on width { NumberAnimation { duration: 200 } } Timer { id: timer interval: 4000 onTriggered: mapLayersItem.opened = false; } readonly property int buttonSize: 64 readonly property int iconSize: 24 readonly property color normalColor: "#C0F5DA" readonly property color checkedColor: "#2CDE85" function getIconColor(pressed, checked, hovered) { return pressed ? normalColor : checked ? (hovered ? normalColor : checkedColor) : (hovered ? checkedColor : normalColor) } function getTextColor(checked, hovered) { return checked && !hovered ? checkedColor : normalColor; } }