Warning, /libraries/kopeninghours/tests/example.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 2.14
0008 import QtQuick.Layouts 1.1
0009 import QtQuick.Controls 2.1 as QQC2
0010 import org.kde.kirigami 2.0 as Kirigami
0011 import org.kde.kholidays 1.0 as KHolidays
0012 import org.kde.kopeninghours 1.0
0013
0014 Kirigami.ApplicationWindow {
0015 title: "Opening Hours Demo"
0016
0017 width: 640
0018 height: 480
0019
0020 pageStack.initialPage: mainPage
0021
0022 Component {
0023 id: openingHoursDelegate
0024 Item {
0025 id: delegateRoot
0026 property var dayData: model
0027 implicitHeight: row.implicitHeight
0028 Row {
0029 id: row
0030 QQC2.Label {
0031 text: dayData.shortDayName
0032 width: delegateRoot.ListView.view.labelWidth + Kirigami.Units.smallSpacing
0033 Component.onCompleted: delegateRoot.ListView.view.labelWidth = Math.max(delegateRoot.ListView.view.labelWidth, implicitWidth)
0034 font.italic: dayData.isToday
0035 }
0036 Repeater {
0037 model: dayData.intervals
0038 Rectangle {
0039 id: intervalBox
0040 property var interval: modelData
0041 color: {
0042 switch (interval.state) {
0043 case Interval.Open: return Kirigami.Theme.positiveBackgroundColor;
0044 case Interval.Closed: return Kirigami.Theme.negativeBackgroundColor;
0045 case Interval.Unknown: return Kirigami.Theme.neutralBackgroundColor;
0046 }
0047 return "transparent";
0048 }
0049 width: {
0050 var ratio = (interval.estimatedEnd - interval.begin + interval.dstOffset * 1000) / (24 * 60 * 60 * 1000);
0051 return ratio * (delegateRoot.ListView.view.width - delegateRoot.ListView.view.labelWidth - Kirigami.Units.smallSpacing);
0052 }
0053 height: Kirigami.Units.gridUnit
0054 gradient: Gradient {
0055 orientation: Gradient.Horizontal
0056 GradientStop { position: 0.0; color: intervalBox.color }
0057 GradientStop { position: (interval.end - interval.begin) / (interval.estimatedEnd - interval.begin); color: intervalBox.color }
0058 GradientStop { position: 1.0; color: interval.hasOpenEndTime ? Kirigami.Theme.negativeBackgroundColor : intervalBox.color }
0059 }
0060
0061 QQC2.Label {
0062 id: commentLabel
0063 text: interval.comment
0064 anchors.centerIn: parent
0065 visible: commentLabel.implicitWidth < intervalBox.width
0066 font.italic: true
0067 }
0068 }
0069 }
0070 }
0071 Rectangle {
0072 id: nowMarker
0073 property double position: (Date.now() - dayData.dayBegin) / (24 * 60 * 60 * 1000)
0074 visible: position >= 0.0 && position < 1.0
0075 color: Kirigami.Theme.textColor
0076 width: 2
0077 height: Kirigami.Units.gridUnit
0078 x: position * (delegateRoot.ListView.view.width - delegateRoot.ListView.view.labelWidth - Kirigami.Units.smallSpacing)
0079 + delegateRoot.ListView.view.labelWidth + Kirigami.Units.smallSpacing
0080 }
0081 }
0082 }
0083
0084 Component {
0085 id: mainPage
0086 Kirigami.Page {
0087 id: page
0088 title: "OSM Opening Hours Expression Evaluator Demo"
0089 property var oh: {
0090 var v = OpeningHoursParser.parse(expression.text);
0091 v.setLocation(52.5, 13.0);
0092 return v;
0093 }
0094
0095 function evaluateCurrentState() {
0096 var tmp = OpeningHoursParser.parse(expression.text, intervalMode.checked ? OpeningHours.IntervalMode : OpeningHours.PointInTimeMode);
0097 tmp.setLocation(latitude.text, longitude.text);
0098 tmp.region = region.currentText;
0099 page.oh = tmp;
0100 currentState.text = Qt.binding(function() { return Display.currentState(page.oh); });
0101 }
0102
0103 ColumnLayout {
0104 anchors.fill: parent
0105
0106 QQC2.TextField {
0107 id: expression
0108 Layout.fillWidth: true
0109 text: "Mo-Fr 08:00-12:00,13:00-17:30; Sa 08:00-12:00; Su unknown \"on appointment\""
0110 onTextChanged: evaluateCurrentState();
0111 }
0112
0113 RowLayout {
0114 QQC2.RadioButton {
0115 id: intervalMode
0116 text: "Interval Mode"
0117 checked: true
0118 onCheckedChanged: evaluateCurrentState()
0119 }
0120 QQC2.RadioButton {
0121 id: pointInTimeMode
0122 text: "Point in Time Mode"
0123 onCheckedChanged: evaluateCurrentState()
0124 }
0125 }
0126
0127 RowLayout {
0128 QQC2.Label { text: "Latitude:" }
0129 QQC2.TextField {
0130 id: latitude
0131 text: "52.5"
0132 onTextChanged: evaluateCurrentState();
0133 }
0134 QQC2.Label { text: "Longitude:" }
0135 QQC2.TextField {
0136 id: longitude
0137 text: "13.0"
0138 onTextChanged: evaluateCurrentState();
0139 }
0140 }
0141
0142 KHolidays.HolidayRegionsModel { id: regionModel }
0143 QQC2.ComboBox {
0144 id: region
0145 model: regionModel
0146 textRole: "region"
0147 onCurrentIndexChanged: evaluateCurrentState();
0148 }
0149
0150 QQC2.Label {
0151 text: {
0152 switch (oh.error) {
0153 case OpeningHours.NoError:
0154 return "Expression is valid.";
0155 case OpeningHours.SyntaxError:
0156 return "Syntax error!";
0157 case OpeningHours.MissingRegion:
0158 return "Expression needs to know the ISO 3166-2 region it is evaluated for.";
0159 case OpeningHours.MissingLocation:
0160 return "Expression needs to know the geo coordinates of the location it is evaluated for.";
0161 case OpeningHours.UnsupportedFeature:
0162 return "Expression uses a feature that is not supported/implemented yet.";
0163 case OpeningHours.IncompatibleMode:
0164 return "Expression uses an incompatible evaluation mode.";
0165 case OpeningHours.EvaluationError:
0166 return "Runtime error."
0167 }
0168 }
0169 }
0170 QQC2.Label {
0171 text: "Normalized: " + oh.normalizedExpression
0172 visible: oh.error != OpeningHours.SyntaxError && oh.normalizedExpression != expression.text
0173 }
0174
0175 QQC2.Label {
0176 id: currentState
0177 }
0178
0179 IntervalModel {
0180 id: intervalModel
0181 openingHours: page.oh
0182 beginDate: intervalModel.beginOfWeek(new Date())
0183 endDate: new Date(intervalModel.beginDate.getTime() + 7 * 24 * 3600 * 1000)
0184 }
0185
0186 ListView {
0187 id: intervalView
0188 visible: intervalMode.checked
0189 model: intervalModel
0190 delegate: openingHoursDelegate
0191 property int labelWidth: 0
0192 Layout.fillWidth: true
0193 Layout.fillHeight: true
0194 spacing: Kirigami.Units.smallSpacing
0195 clip: true
0196 header: Row {
0197 id: intervalHeader
0198 property int itemWidth: (intervalHeader.ListView.view.width - intervalHeader.ListView.view.labelWidth - Kirigami.Units.smallSpacing) / 8
0199 x: intervalHeader.ListView.view.labelWidth + Kirigami.Units.smallSpacing + intervalHeader.itemWidth/2
0200 Repeater {
0201 model: [3, 6, 9, 12, 15, 18, 21]
0202 QQC2.Label {
0203 text: intervalModel.formatTimeColumnHeader(modelData, 0);
0204 width: intervalHeader.itemWidth
0205 horizontalAlignment: Qt.AlignHCenter
0206 }
0207 }
0208 }
0209 }
0210
0211 Timer {
0212 interval: 60000
0213 repeat: true
0214 running: true
0215 onTriggered: evaluateCurrentState()
0216 }
0217
0218 Component.onCompleted: evaluateCurrentState()
0219 }
0220 }
0221 }
0222 }
0223