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