qtdoc/examples/demos/lightningviewer/LightningViewer/MapLayersItem.qml

167 lines
6.1 KiB
QML

// 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;
}
}