Warning, /libraries/kosmindoormap/src/app/IndoorMapInfoSheetOpeningHoursDelegate.qml is written in an unsupported language. File is not indexed.
0001 /*
0002 SPDX-FileCopyrightText: 2020 Volker Krause <vkrause@kde.org>
0003
0004 SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006
0007 import QtQuick
0008 import QtQuick.Layouts
0009 import QtQuick.Controls as QQC2
0010 import org.kde.kirigami as Kirigami
0011 import org.kde.kopeninghours
0012
0013 ColumnLayout {
0014 id: root
0015 property var model
0016 property var mapData
0017
0018 property var oh: {
0019 var v = OpeningHoursParser.parse(model.value);
0020 v.region = root.mapData.regionCode;
0021 v.timeZone = root.mapData.timeZone;
0022 v.setLocation(root.mapData.center.y, root.mapData.center.x);
0023 if (v.error != OpeningHours.NoError) {
0024 console.log("Opening hours parsing error:", v.error, root.mapData.region, root.mapData.timeZone)
0025 }
0026 return v;
0027 }
0028
0029 QQC2.Label {
0030 property var currentInterval: root.oh.interval(new Date())
0031
0032 id: currentState
0033 text: intervalModel.currentState // TODO we could update this every minute
0034 color: {
0035 switch (currentInterval.state) {
0036 case Interval.Open: return Kirigami.Theme.positiveTextColor;
0037 case Interval.Closed: return Kirigami.Theme.negativeTextColor;
0038 default: return Kirigami.Theme.textColor;
0039 }
0040 }
0041 visible: text !== ""
0042 }
0043
0044 Component {
0045 id: intervalDelegate
0046 Item {
0047 id: delegateRoot
0048 property var dayData: model
0049 implicitHeight: row.implicitHeight
0050 Row {
0051 id: row
0052 QQC2.Label {
0053 text: dayData.shortDayName
0054 width: delegateRoot.ListView.view.labelWidth + Kirigami.Units.smallSpacing
0055 Component.onCompleted: delegateRoot.ListView.view.labelWidth = Math.max(delegateRoot.ListView.view.labelWidth, implicitWidth)
0056 font.bold: dayData.isToday
0057 }
0058 Repeater {
0059 model: dayData.intervals
0060 Rectangle {
0061 id: intervalBox
0062 property var interval: modelData
0063 property var closeColor: Kirigami.Theme.negativeBackgroundColor;
0064 color: {
0065 switch (interval.state) {
0066 case Interval.Open: return Kirigami.Theme.positiveBackgroundColor;
0067 case Interval.Closed: return intervalBox.closeColor;
0068 case Interval.Unknown: return Kirigami.Theme.neutralBackgroundColor;
0069 }
0070 return "transparent";
0071 }
0072 width: {
0073 var ratio = (interval.estimatedEnd - interval.begin) / (24 * 60 * 60 * 1000);
0074 return ratio * (delegateRoot.ListView.view.width - delegateRoot.ListView.view.labelWidth - Kirigami.Units.smallSpacing);
0075 }
0076 height: Kirigami.Units.gridUnit
0077 gradient: Gradient {
0078 orientation: Gradient.Horizontal
0079 GradientStop { position: 0.0; color: intervalBox.color }
0080 GradientStop { position: (interval.end - interval.begin) / (interval.estimatedEnd - interval.begin); color: intervalBox.color }
0081 GradientStop { position: 1.0; color: interval.hasOpenEndTime ? intervalBox.closeColor : intervalBox.color }
0082 }
0083
0084 QQC2.Label {
0085 id: commentLabel
0086 text: interval.comment
0087 anchors.centerIn: parent
0088 visible: commentLabel.implicitWidth < intervalBox.width
0089 font.italic: true
0090 }
0091 }
0092 }
0093 }
0094 Rectangle {
0095 id: nowMarker
0096 property double position: (Date.now() - dayData.dayBegin) / (24 * 60 * 60 * 1000)
0097 visible: position >= 0.0 && position < 1.0
0098 color: Kirigami.Theme.textColor
0099 width: 2
0100 height: Kirigami.Units.gridUnit
0101 x: position * (delegateRoot.ListView.view.width - delegateRoot.ListView.view.labelWidth - Kirigami.Units.smallSpacing)
0102 + delegateRoot.ListView.view.labelWidth + Kirigami.Units.smallSpacing
0103 }
0104 }
0105 }
0106
0107 IntervalModel {
0108 id: intervalModel
0109 openingHours: root.oh
0110 // TODO we could use the layover time here, if available and in the future
0111 beginDate: intervalModel.beginOfWeek(new Date())
0112 endDate: new Date(intervalModel.beginDate.getTime() + 7 * 24 * 3600 * 1000)
0113 }
0114
0115 FontMetrics {
0116 id: fm
0117 }
0118
0119 ListView {
0120 id: intervalView
0121 width: parent.width
0122 height: contentHeight
0123 boundsBehavior: Flickable.StopAtBounds
0124 visible: root.oh.error == OpeningHours.NoError
0125 model: intervalModel
0126 delegate: intervalDelegate
0127 property int labelWidth: 0
0128 spacing: Kirigami.Units.smallSpacing
0129 clip: true
0130 header: Row {
0131 id: intervalHeader
0132 property int colCount: (intervalView.width - Kirigami.Units.smallSpacing - intervalView.labelWidth) / fm.advanceWidth(intervalModel.formatTimeColumnHeader(12, 59)) < 8 ? 4 : 8
0133 property int itemWidth: (intervalHeader.ListView.view.width - intervalHeader.ListView.view.labelWidth - Kirigami.Units.smallSpacing) / colCount
0134 x: intervalHeader.ListView.view.labelWidth + Kirigami.Units.smallSpacing + intervalHeader.itemWidth/2
0135 Repeater {
0136 // TODO we might need to use less when space constrained horizontally
0137 model: colCount - 1
0138 QQC2.Label {
0139 text: intervalModel.formatTimeColumnHeader((modelData + 1) * 24/colCount, 0)
0140 width: intervalHeader.itemWidth
0141 horizontalAlignment: Qt.AlignHCenter
0142 }
0143 }
0144 }
0145 }
0146
0147 QQC2.Label {
0148 id: fallbackLabel
0149 visible: !intervalView.visible
0150 text: model.value.replace(/;\s*/g, "\n")
0151 }
0152 }