Warning, /pim/itinerary/src/app/TransferPage.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.kitemmodels
0012 import org.kde.kpublictransport
0013 import org.kde.itinerary
0014 import org.kde.kirigamiaddons.formcard as FormCard
0015
0016 Kirigami.ScrollablePage {
0017 id: root
0018 property var transfer
0019 readonly property var reservation: ReservationManager.reservation(transfer.reservationId)
0020 title: i18n("Select Transfer")
0021
0022 JourneyQueryModel {
0023 id: journeyModel
0024 manager: LiveDataManager.publicTransportManager
0025 }
0026
0027 KSortFilterProxyModel {
0028 id: sortedJourneyModel
0029 sourceModel: journeyModel
0030 sortRole: JourneyQueryModel.ScheduledDepartureTime
0031 dynamicSortFilter: true
0032 Component.onCompleted: Util.sortModel(sortedJourneyModel, 0, Qt.Ascending)
0033 }
0034
0035 background: Rectangle {
0036 Kirigami.Theme.colorSet: Kirigami.Theme.Window
0037 Kirigami.Theme.inherit: false
0038 color: Kirigami.Theme.backgroundColor
0039 }
0040
0041 actions: [
0042 Kirigami.Action {
0043 text: i18n("Depart Now")
0044 icon.name: "clock"
0045 onTriggered: {
0046 var req = journeyModel.request;
0047 req.dateTime = new Date();
0048 req.dateTimeMode = JourneyRequest.Departure;
0049 journeyModel.request = req;
0050 }
0051 },
0052 Kirigami.Action {
0053 text: i18n("Discard")
0054 icon.name: "edit-delete"
0055 onTriggered: {
0056 TransferManager.discardTransfer(root.transfer);
0057 applicationWindow().pageStack.pop();
0058 }
0059 },
0060 Kirigami.Action {
0061 text: i18n("Earlier")
0062 icon.name: "go-up-symbolic"
0063 onTriggered: journeyModel.queryPrevious()
0064 enabled: journeyModel.canQueryPrevious
0065 },
0066 Kirigami.Action {
0067 text: i18n("Later")
0068 icon.name: "go-down-symbolic"
0069 onTriggered: journeyModel.queryNext()
0070 enabled: journeyModel.canQueryNext
0071 },
0072 Kirigami.Action { separator: true },
0073 Kirigami.Action {
0074 id: bikeAction
0075 text: i18n("Bike")
0076 icon.source: "qrc:///images/bike.svg"
0077 checkable: true
0078 onCheckedChanged: queryJourney()
0079 },
0080 Kirigami.Action {
0081 id: bikeRideAction
0082 text: i18n("Bike & Ride")
0083 icon.source: "qrc:///images/bike.svg"
0084 checkable: true
0085 visible: root.transfer.alignment == Transfer.Before && root.transfer.floatingLocationType == Transfer.FavoriteLocation
0086 onCheckedChanged: queryJourney()
0087 },
0088 Kirigami.Action {
0089 id: bikeSharingAction
0090 text: i18n("Shared Bikes")
0091 icon.source: "qrc:///images/bike.svg"
0092 checkable: true
0093 onCheckedChanged: queryJourney()
0094 },
0095 Kirigami.Action {
0096 id: parkRideAction
0097 text: i18n("Park & Ride")
0098 icon.source: "qrc:///images/car.svg"
0099 checkable: true
0100 visible: root.transfer.alignment == Transfer.Before && root.transfer.floatingLocationType == Transfer.FavoriteLocation
0101 onCheckedChanged: queryJourney()
0102 },
0103
0104 Kirigami.Action { separator: true },
0105
0106 Kirigami.Action {
0107 id: longDistanceModeAction
0108 text: i18nc("journey query search constraint, title", "Long distance trains")
0109 icon.source: PublicTransport.lineModeIcon(Line.LongDistanceTrain)
0110 checkable: true
0111 checked: true
0112 onCheckedChanged: queryJourney()
0113 },
0114 Kirigami.Action {
0115 id: localTrainModeAction
0116 text: i18nc("journey query search constraint, title", "Local trains")
0117 icon.source: PublicTransport.lineModeIcon(Line.LocalTrain)
0118 checkable: true
0119 checked: true
0120 onCheckedChanged: queryJourney()
0121 },
0122 Kirigami.Action {
0123 id: rapidTransitModeAction
0124 text: i18nc("journey query search constraint, title", "Rapid transit")
0125 icon.source: PublicTransport.lineModeIcon(Line.Tramway)
0126 checkable: true
0127 checked: true
0128 onCheckedChanged: queryJourney()
0129 },
0130 Kirigami.Action {
0131 id: busModeAction
0132 text: i18nc("journey query search constraint, title", "Bus")
0133 icon.source: PublicTransport.lineModeIcon(Line.Bus)
0134 checkable: true
0135 checked: true
0136 onCheckedChanged: queryJourney()
0137 },
0138 Kirigami.Action {
0139 id: ferryModeAction
0140 text: i18nc("journey query search constraint, title", "Ferry")
0141 icon.source: PublicTransport.lineModeIcon(Line.Ferry)
0142 checkable: true
0143 checked: true
0144 onCheckedChanged: queryJourney()
0145 }
0146 ]
0147
0148 function allLineModes()
0149 {
0150 for (const s of [longDistanceModeAction, localTrainModeAction, rapidTransitModeAction, busModeAction, ferryModeAction]) {
0151 if (!s.checked) {
0152 return false;
0153 }
0154 }
0155 return true;
0156 }
0157
0158 function queryJourney() {
0159 journeyModel.request = TransferManager.journeyRequestForTransfer(transfer);
0160 let lineModes = [];
0161 let accessMode = [];
0162 let egressMode = [];
0163
0164 if (!allLineModes()) {
0165 if (longDistanceModeAction.checked)
0166 lineModes.push(Line.LongDistanceTrain, Line.Train);
0167 if (localTrainModeAction.checked)
0168 lineModes.push(Line.LocalTrain);
0169 if (rapidTransitModeAction.checked)
0170 lineModes.push(Line.RapidTransit, Line.Metro, Line.Tramway, Line.RailShuttle);
0171 if (busModeAction.checked)
0172 lineModes.push(Line.Bus, Line.Coach);
0173 if (ferryModeAction.checked)
0174 lineModes.push(Line.Ferry, Line.Boat);
0175 }
0176
0177 if (bikeAction.checked) {
0178 accessMode.push({ mode: IndividualTransport.Bike });
0179 egressMode.push({ mode: IndividualTransport.Bike });
0180 }
0181 if (bikeRideAction.checked) {
0182 accessMode.push({ mode: IndividualTransport.Bike, qualifier: IndividualTransport.Park });
0183 }
0184 if (bikeSharingAction.checked) {
0185 accessMode.push({ mode: IndividualTransport.Bike, qualifier: IndividualTransport.Rent });
0186 egressMode.push({ mode: IndividualTransport.Bike, qualifier: IndividualTransport.Rent });
0187 }
0188
0189 if (parkRideAction.checked) {
0190 accessMode.push({ mode: IndividualTransport.Car, qualifier: IndividualTransport.Park });
0191 }
0192
0193 journeyModel.request.lineModes = lineModes;
0194 journeyModel.request.accessModes = accessMode;
0195 journeyModel.request.egressModes = egressMode;
0196 }
0197
0198 Component.onCompleted: {
0199 if (transfer.floatingLocationType == Transfer.FavoriteLocation) {
0200 favLocCombo.currentIndex = favLocCombo.find(transfer.alignment == Transfer.Before ? transfer.fromName : transfer.toName);
0201 }
0202 queryJourney();
0203 }
0204
0205 Component {
0206 id: journeyDelegate
0207
0208 FormCard.FormCard {
0209 id: top
0210
0211 required property int index
0212 required property var journey
0213
0214 width: ListView.view.width
0215
0216 JourneyDelegateHeader {
0217 journey: top.journey
0218 }
0219
0220 Repeater {
0221 id: journeyRepeater
0222 delegate: JourneySectionDelegate{
0223 Layout.fillWidth: true
0224 modelLength: journeyRepeater.count - 1
0225
0226 }
0227 model: journeyView.currentIndex === top.index ? top.journey.sections : 0
0228 }
0229
0230 JourneySummaryDelegate {
0231 id: summaryButton
0232
0233 journey: top.journey
0234 visible: journeyView.currentIndex !== top.index
0235 onClicked: journeyView.currentIndex = top.index
0236
0237 Layout.fillWidth: true
0238 }
0239
0240 FormCard.FormDelegateSeparator {
0241 above: selectButton
0242 visible: journeyView.currentIndex === top.index
0243 }
0244
0245 FormCard.FormButtonDelegate {
0246 id: selectButton
0247
0248 text: i18n("Select")
0249 icon.name: "checkmark"
0250 visible: journeyView.currentIndex === top.index
0251 enabled: top.journey.disruptionEffect !== Disruption.NoService
0252 onClicked: {
0253 TransferManager.setJourneyForTransfer(root.transfer, top.journey);
0254 applicationWindow().pageStack.pop();
0255 }
0256 }
0257 }
0258 }
0259
0260 header: QQC2.Pane {
0261 Kirigami.Theme.colorSet: Kirigami.Theme.Header
0262 Kirigami.Theme.inherit: false
0263
0264 contentItem: ColumnLayout {
0265 id: topLayout
0266
0267 QQC2.Label {
0268 text: {
0269 if (!Util.isLocationChange(root.reservation)) {
0270 return i18n("%1 ends at %2", root.reservation.reservationFor.name, Localizer.formatTime(transfer, "anchorTime"));
0271 }
0272 return i18n("Preceding arrival %1 at %2", Localizer.formatTime(transfer, "anchorTime"), transfer.fromName);
0273 }
0274 visible: transfer.alignment === Transfer.After
0275 Layout.fillWidth: true
0276 }
0277
0278 QQC2.Label {
0279 Layout.fillWidth: true
0280 text: {
0281 if (!Util.isLocationChange(root.reservation)) {
0282 return i18n("%1 starts at %2", root.reservation.reservationFor.name, Localizer.formatTime(transfer, "anchorTime"));
0283 }
0284 return i18n("Following departure %1 from %2", Localizer.formatTime(transfer, "anchorTime"), transfer.toName);
0285 }
0286 visible: transfer.alignment === Transfer.Before
0287 }
0288
0289 QQC2.ComboBox {
0290 id: favLocCombo
0291 model: FavoriteLocationModel
0292 visible: transfer.floatingLocationType === Transfer.FavoriteLocation
0293 textRole: "display"
0294 Layout.fillWidth: true
0295 onActivated: {
0296 var favLoc = delegateModel.items.get(currentIndex)
0297 console.log(favLoc.model.favoriteLocation);
0298 root.transfer = TransferManager.setFavoriteLocationForTransfer(root.transfer, favLoc.model.favoriteLocation);
0299 queryJourney();
0300 }
0301 }
0302 }
0303 }
0304
0305 ListView {
0306 id: journeyView
0307
0308 clip: true
0309 delegate: journeyDelegate
0310 model: sortedJourneyModel
0311 spacing: Kirigami.Units.largeSpacing
0312
0313 header: VerticalNavigationButton {
0314 visible: journeyModel.canQueryPrevious
0315 width: journeyView.width
0316 text: i18nc("@action:button", "Load earlier connections")
0317 iconName: "go-up-symbolic"
0318 onClicked: journeyModel.queryPrevious()
0319 }
0320
0321 footer: VerticalNavigationButton {
0322 visible: journeyModel.canQueryNext
0323 width: journeyView.width
0324 iconName: "go-down-symbolic"
0325 text: i18nc("@action:button", "Load later connections")
0326 onClicked: journeyModel.queryNext()
0327
0328 FormCard.FormCard {
0329 visible: journeyModel.attributions.length > 0
0330
0331 FormCard.FormTextDelegate {
0332 text: i18n("Data providers:")
0333 description: PublicTransport.attributionSummary(journeyModel.attributions)
0334 onLinkActivated: Qt.openUrlExternally(link)
0335 }
0336 }
0337 }
0338
0339 QQC2.BusyIndicator {
0340 anchors.centerIn: parent
0341 running: journeyModel.loading
0342 }
0343
0344 QQC2.Label {
0345 anchors.centerIn: parent
0346 width: parent.width - Kirigami.Units.gridUnit * 4
0347 text: journeyModel.errorMessage
0348 color: Kirigami.Theme.negativeTextColor
0349 wrapMode: Text.Wrap
0350 }
0351 }
0352 }