Warning, /pim/itinerary/src/app/DepartureQueryPage.qml is written in an unsupported language. File is not indexed.
0001 /* 0002 SPDX-FileCopyrightText: 2019 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.kirigamiaddons.formcard as FormCard 0012 import org.kde.kpublictransport 0013 import org.kde.itinerary 0014 0015 Kirigami.ScrollablePage { 0016 id: root 0017 0018 property var stop 0019 property var dateTime 0020 0021 title: i18n("Departures") 0022 actions: [ 0023 Kirigami.Action { 0024 text: i18n("Earlier") 0025 icon.name: "go-up-symbolic" 0026 onTriggered: departureModel.queryPrevious() 0027 enabled: departureModel.canQueryPrevious 0028 }, 0029 Kirigami.Action { 0030 text: i18n("Later") 0031 icon.name: "go-down-symbolic" 0032 onTriggered: departureModel.queryNext() 0033 enabled: departureModel.canQueryNext 0034 }, 0035 0036 Kirigami.Action { separator: true }, 0037 0038 Kirigami.Action { 0039 id: longDistanceModeAction 0040 text: i18nc("journey query search constraint, title", "Long distance trains") 0041 icon.source: PublicTransport.lineModeIcon(Line.LongDistanceTrain) 0042 checkable: true 0043 checked: true 0044 }, 0045 Kirigami.Action { 0046 id: localTrainModeAction 0047 text: i18nc("journey query search constraint, title", "Local trains") 0048 icon.source: PublicTransport.lineModeIcon(Line.LocalTrain) 0049 checkable: true 0050 checked: true 0051 }, 0052 Kirigami.Action { 0053 id: rapidTransitModeAction 0054 text: i18nc("journey query search constraint, title", "Rapid transit") 0055 icon.source: PublicTransport.lineModeIcon(Line.Tramway) 0056 checkable: true 0057 checked: true 0058 }, 0059 Kirigami.Action { 0060 id: busModeAction 0061 text: i18nc("journey query search constraint, title", "Bus") 0062 icon.source: PublicTransport.lineModeIcon(Line.Bus) 0063 checkable: true 0064 checked: true 0065 }, 0066 Kirigami.Action { 0067 id: ferryModeAction 0068 text: i18nc("journey query search constraint, title", "Ferry") 0069 icon.source: PublicTransport.lineModeIcon(Line.Ferry) 0070 checkable: true 0071 checked: true 0072 } 0073 ] 0074 0075 function allLineModes() 0076 { 0077 for (const s of [longDistanceModeAction, localTrainModeAction, rapidTransitModeAction, busModeAction, ferryModeAction]) { 0078 if (!s.checked) { 0079 return false; 0080 } 0081 } 0082 return true; 0083 } 0084 0085 function stopoverRequest() 0086 { 0087 let req = PublicTransport.stopoverRequestForPlace(stop, dateTime); 0088 let lineModes = []; 0089 if (!allLineModes()) { 0090 if (longDistanceModeAction.checked) 0091 lineModes.push(Line.LongDistanceTrain, Line.Train); 0092 if (localTrainModeAction.checked) 0093 lineModes.push(Line.LocalTrain); 0094 if (rapidTransitModeAction.checked) 0095 lineModes.push(Line.RapidTransit, Line.Metro, Line.Tramway, Line.RailShuttle); 0096 if (busModeAction.checked) 0097 lineModes.push(Line.Bus, Line.Coach); 0098 if (ferryModeAction.checked) 0099 lineModes.push(Line.Ferry, Line.Boat); 0100 } 0101 req.lineModes = lineModes; 0102 return req; 0103 } 0104 0105 StopoverQueryModel { 0106 id: departureModel 0107 manager: LiveDataManager.publicTransportManager 0108 request: stopoverRequest(); 0109 } 0110 0111 Component { 0112 id: departureDelegate 0113 FormCard.FormCard { 0114 id: top 0115 required property var departure 0116 width: ListView.view.width 0117 0118 FormCard.AbstractFormDelegate { 0119 contentItem: GridLayout { 0120 id: contentLayout 0121 columns: 2 0122 0123 // top row: departure time, departure location, departure platform 0124 RowLayout { 0125 QQC2.Label { 0126 text: Localizer.formatTime(departure, "scheduledDepartureTime") 0127 } 0128 QQC2.Label { 0129 text: { 0130 if (departure.disruption == Disruption.NoService) 0131 return i18nc("a train/bus journey canceled by its operator", "Canceled"); 0132 return (departure.departureDelay >= 0 ? "+" : "") + departure.departureDelay; 0133 } 0134 color: { 0135 if (departure.departureDelay > 1 || departure.disruption == Disruption.NoService) 0136 return Kirigami.Theme.negativeTextColor; 0137 return Kirigami.Theme.positiveTextColor; 0138 } 0139 // Keeping it visible so the layout is more uniform 0140 opacity: (departure.hasExpectedDepartureTime || departure.disruption == Disruption.NoService) ? 1 : 0 0141 } 0142 } 0143 RowLayout { 0144 QQC2.Label { 0145 text: departure.stopPoint.name 0146 Layout.fillWidth: true 0147 elide: Text.ElideRight 0148 } 0149 QQC2.Label { 0150 text: departure.hasExpectedPlatform ? departure.expectedPlatform : departure.scheduledPlatform 0151 color: departure.departurePlatformChanged ? Kirigami.Theme.negativeTextColor 0152 : departure.hasExpectedPlatform ? Kirigami.Theme.positiveTextColor 0153 : Kirigami.Theme.textColor 0154 visible: departure.scheduledPlatform !== "" 0155 } 0156 } 0157 0158 // middle row: mode symbol, transport mode, duration 0159 Rectangle { 0160 color: (departure.route.line.hasColor && modeIcon.isMask) ? departure.route.line.color : "transparent" 0161 implicitHeight: Kirigami.Units.iconSizes.smallMedium 0162 implicitWidth: modeIcon.width 0163 Layout.alignment: Qt.AlignHCenter 0164 0165 Kirigami.Icon { 0166 id: modeIcon 0167 anchors.centerIn: parent 0168 source: PublicTransport.lineIcon(departure.route.line); 0169 color: departure.route.line.hasTextColor ? departure.route.line.textColor : Kirigami.Theme.textColor 0170 width: (departure.route.line.hasLogo || departure.route.line.hasModeLogo) ? implicitWidth : height 0171 height: parent.height 0172 isMask: !departure.route.line.hasLogo && !departure.route.line.hasModeLogo 0173 } 0174 } 0175 QQC2.Label { 0176 Layout.fillWidth: true 0177 text: departure.route.line.modeString + " " + departure.route.line.name; 0178 } 0179 0180 // last row: arrival information 0181 RowLayout { 0182 QQC2.Label { 0183 text: i18nc("destination", "To:") 0184 } 0185 } 0186 RowLayout { 0187 QQC2.Label { 0188 text: departure.route.direction 0189 Layout.fillWidth: true 0190 elide: Text.ElideRight 0191 } 0192 } 0193 0194 // optional bottom row: notes if present 0195 QQC2.Label { 0196 Layout.columnSpan: 2 0197 Layout.fillWidth: true 0198 text: departure.notes.join("<br/>") 0199 textFormat: Text.RichText 0200 wrapMode: Text.Wrap 0201 visible: departure.notes.length > 0 0202 font.italic: true 0203 onLinkActivated: Qt.openUrlExternally(link) 0204 } 0205 } 0206 } 0207 } 0208 } 0209 0210 0211 ListView { 0212 id: journeyView 0213 anchors.fill: parent 0214 clip: true 0215 delegate: departureDelegate 0216 model: departureModel 0217 spacing: Kirigami.Units.largeSpacing 0218 0219 header: VerticalNavigationButton { 0220 visible: departureModel.canQueryPrevious 0221 width: journeyView.width 0222 text: i18nc("@action:button", "Load earlier departures") 0223 iconName: "go-up-symbolic" 0224 onClicked: departureModel.queryPrevious() 0225 } 0226 0227 footer: VerticalNavigationButton { 0228 visible: departureModel.canQueryNext 0229 width: journeyView.width 0230 iconName: "go-down-symbolic" 0231 text: i18nc("@action:button", "Load later connections") 0232 onClicked: departureModel.queryNext() 0233 0234 FormCard.FormCard { 0235 visible: departureModel.attributions.length > 0 0236 0237 Layout.fillWidth: true 0238 0239 FormCard.FormTextDelegate { 0240 text: i18n("Data providers:") 0241 description: PublicTransport.attributionSummary(departureModel.attributions) 0242 onLinkActivated: Qt.openUrlExternally(link) 0243 } 0244 } 0245 } 0246 0247 QQC2.BusyIndicator { 0248 anchors.centerIn: parent 0249 running: departureModel.loading 0250 } 0251 0252 QQC2.Label { 0253 anchors.centerIn: parent 0254 width: parent.width 0255 text: departureModel.errorMessage 0256 color: Kirigami.Theme.negativeTextColor 0257 wrapMode: Text.Wrap 0258 } 0259 } 0260 }