Warning, /pim/itinerary/src/app/JourneySectionPage.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 QtLocation as QtLocation
0011 import QtPositioning as QtPositioning
0012 import org.kde.kirigami as Kirigami
0013 import org.kde.kirigamiaddons.formcard as FormCard
0014 import org.kde.kirigamiaddons.components as Components
0015 import org.kde.kpublictransport
0016 import org.kde.itinerary
0017 
0018 
0019 Kirigami.Page {
0020     id: root
0021     Kirigami.Theme.inherit: false
0022     Kirigami.Theme.colorSet: Kirigami.Theme.View
0023 
0024     title: i18n("Journey Details")
0025 
0026     property var journeySection
0027     property alias showProgress: sectionModel.showProgress
0028     property alias enableMapView: mapButton.visible
0029     default property alias _children: root.children
0030 
0031     Kirigami.ColumnView.preventStealing: view.currentItem.objectName === "sectionMap"
0032 
0033     padding: 0
0034     header: ColumnLayout {
0035         spacing: 0
0036         visible: root.journeySection != undefined
0037 
0038         GridLayout {
0039             columns: 2
0040             columnSpacing: Kirigami.Units.largeSpacing
0041             rows: 4
0042             rowSpacing: 0
0043 
0044             Layout.margins: Kirigami.Units.gridUnit
0045 
0046             TransportIcon {
0047                 Layout.rowSpan: 4
0048                 Layout.alignment: Qt.AlignTop
0049                 Layout.rightMargin: Kirigami.Units.largeSpacing
0050                 id: icon
0051                 source: PublicTransport.lineIcon(journeySection.route.line)
0052                 Layout.preferredWidth: height
0053                 Layout.preferredHeight: Kirigami.Units.iconSizes.large
0054                 isMask: !journeySection.route.line.hasLogo && !journeySection.route.line.hasModeLogo
0055             }
0056 
0057             QQC2.Label {
0058                 Layout.row: 0
0059                 Layout.column: 1
0060                 Layout.fillWidth: true
0061                 text: "<b>" + journeySection.route.line.modeString + " " + journeySection.route.line.name + "</b>"
0062             }
0063 
0064             QQC2.Label {
0065                 Layout.row: 1
0066                 Layout.column: 1
0067                 Layout.columnSpan: 2
0068                 text: i18n("Direction: %1", journeySection.route.direction)
0069                 visible: journeySection.route.direction !== ""
0070             }
0071 
0072             QQC2.Label {
0073                 Layout.row: 2
0074                 Layout.column: 1
0075                 Layout.columnSpan: 2
0076                 text: i18n("Distance: %1", Localizer.formatDistance(journeySection.distance))
0077                 visible: journeySection.distance > 0
0078             }
0079             QQC2.Label {
0080                 Layout.row: 3
0081                 Layout.column: 1
0082                 Layout.columnSpan: 2
0083                 text: i18n("Average Speed: %1", Localizer.formatSpeed(journeySection.distance / journeySection.duration * 3.6))
0084                 visible: journeySection.distance > 0 && journeySection.duration > 0
0085             }
0086             QQC2.Label {
0087                 Layout.row: 4
0088                 Layout.column: 1
0089                 Layout.columnSpan: 2
0090                 text: i18n("CO₂: %1", Localizer.formatWeight(journeySection.co2Emission))
0091                 visible: journeySection.co2Emission > 0
0092             }
0093 
0094             QQC2.Label {
0095                 id: notesLabel
0096                 Layout.row: 5
0097                 Layout.column: 1
0098                 Layout.columnSpan: 2
0099                 Layout.fillWidth: true
0100                 text: journeySection.notes.join("<br/>")
0101                 textFormat: Text.RichText
0102                 wrapMode: Text.Wrap
0103                 verticalAlignment: Text.AlignTop
0104                 // Doesn't work with RichText.
0105                 elide: Text.ElideRight
0106                 maximumLineCount: 5
0107                 Layout.maximumHeight: Kirigami.Units.gridUnit * maximumLineCount
0108                 clip: true
0109                 visible: journeySection.notes.length > 0
0110                 font.italic: true
0111                 onLinkActivated: Qt.openUrlExternally(link)
0112 
0113                 SheetDrawer {
0114                     id: moreNotesSheet
0115                     contentItem: QQC2.Label {
0116                         Layout.fillWidth: true
0117                         text: journeySection.notes.join("<br/>")
0118                         textFormat: Text.RichText
0119                         wrapMode: Text.Wrap
0120                         onLinkActivated: Qt.openUrlExternally(link)
0121                         padding: Kirigami.Units.largeSpacing * 2
0122                     }
0123                 }
0124             }
0125 
0126             Kirigami.LinkButton {
0127                 Layout.row: 6
0128                 Layout.column: 1
0129                 Layout.columnSpan: 2
0130                 text: i18nc("@action:button", "Show More…")
0131                 visible: notesLabel.implicitHeight > notesLabel.height
0132                 onClicked: {
0133                     moreNotesSheet.open();
0134                 }
0135             }
0136         }
0137 
0138         Kirigami.Separator {
0139             Layout.fillWidth: true
0140         }
0141     }
0142     JourneySectionModel {
0143         id: sectionModel
0144         journeySection: root.journeySection
0145 
0146     }
0147     SheetDrawer {
0148         id: sheetDrawer
0149         property var stop
0150         property bool isDeparture: false
0151         property bool isArrival: false
0152         anchors.fill: parent
0153         headerItem: Component {
0154             RowLayout {
0155                 id: headerLayout
0156 
0157                 Kirigami.Heading {
0158                     text: sheetDrawer.stop.stopPoint.name
0159                     Layout.fillWidth: true
0160                     Layout.leftMargin: Kirigami.Units.largeSpacing
0161                     elide: Qt.ElideRight
0162                 }
0163                 QQC2.Label {
0164                     id: departureTime
0165                     Layout.rightMargin: delayLabel.visible ? 0:Kirigami.Units.largeSpacing
0166                     text: Localizer.formatTime(sheetDrawer.stop, "scheduledDepartureTime")
0167 //                    visible: sheetDrawer.stop.scheduledDepartureTime > 0
0168                     font.strikeout: sheetDrawer.stop.disruptionEffect === Disruption.NoService
0169                 }
0170 
0171                 QQC2.Label {
0172                     id: delayLabel
0173                     Layout.rightMargin: Kirigami.Units.largeSpacing
0174                     text: (sheetDrawer.stop.departureDelay >= 0 ? "+" : "") + sheetDrawer.stop.departureDelay
0175                     color: sheetDrawer.stop.departureDelay > 1 ? Kirigami.Theme.negativeTextColor : Kirigami.Theme.positiveTextColor
0176                     visible: departureTime.visible && sheetDrawer.stop.hasExpectedDepartureTime && sheetDrawer.stop.disruptionEffect !== Disruption.NoService
0177                 }
0178             }
0179         }
0180 
0181 
0182 
0183         contentItem: Component{
0184 
0185             ColumnLayout {
0186                 id: contentLayout
0187                 spacing:0
0188                 width: parent.width
0189                 FormCard.FormTextDelegate {
0190                     Layout.fillWidth: true
0191                     id: platformDelegate
0192                     text: i18n("Platform:")
0193                     description: {
0194                         const platform = sheetDrawer.stop.hasExpectedPlatform ? sheetDrawer.stop.expectedPlatform : sheetDrawer.stop.scheduledPlatform;
0195 
0196                         if (platform.length === 0) {
0197                             return '';
0198                         }
0199 
0200                         switch (sheetDrawer.stop.route.line.mode) {
0201                             case Line.Train:
0202                             case Line.Funicular:
0203                             case Line.LocalTrain:
0204                             case Line.LongDistanceTrain:
0205                             case Line.Metro:
0206                             case Line.RailShuttle:
0207                             case Line.RapidTransit:
0208                             case Line.Tramway:
0209                                 return platform
0210                             case Line.Ferry:
0211                                 return platform
0212                             default:
0213                                 return platform
0214                         }
0215                     }
0216                     visible: description
0217                 }
0218                 FormCard.AbstractFormDelegate {
0219                     Layout.fillWidth: true
0220                     visible: sheetDrawer.stop.loadInformation != ""
0221                         contentItem: ColumnLayout {
0222                             spacing: Kirigami.Units.mediumSpacing
0223 
0224                             QQC2.Label {
0225                                 text: i18n("Vehicle Load:")
0226                                 elide: Text.ElideRight
0227                                 Layout.fillWidth: true
0228                                 Accessible.ignored: true
0229                             }
0230                             VehicleLoadIndicator {
0231                                 loadInformation: sheetDrawer.stop.loadInformation
0232                             }
0233                         }
0234 
0235                     background: Item{}
0236                 }
0237                 Item{Layout.fillHeight: true}
0238                 FormCard.FormDelegateSeparator {}
0239                 FormCard.FormButtonDelegate {
0240                     Layout.fillWidth: true
0241                     text: i18n("Show location")
0242                     icon.name: "map-symbolic"
0243                     onClicked: {
0244                         sheetDrawer.close()
0245                         const args = {
0246                             coordinate: Qt.point(sheetDrawer.stop.stopPoint.longitude, sheetDrawer.stop.stopPoint.latitude),
0247                             placeName: sheetDrawer.stop.stopPoint.name
0248                         };
0249                         if (!sheetDrawer.isDeparture) {
0250                             args.arrivalPlatformName = sheetDrawer.stop.hasExpectedPlatform ? sheetDrawer.stop.expectedPlatform : sheetDrawer.stop.scheduledPlatform;
0251                             args.arrivalPlatformMode = PublicTransport.lineModeToPlatformMode(sheetDrawer.stop.route.line.mode);
0252                             args.arrivalPlatformIfopt = sheetDrawer.stop.stopPoint.identifier("ifopt");
0253                         }
0254                         if (!sheetDrawer.isArrival) {
0255                             args.departurePlatformName = sheetDrawer.stop.hasExpectedPlatform ? sheetDrawer.stop.expectedPlatform : sheetDrawer.stop.scheduledPlatform;
0256                             args.departurePlatformMode = PublicTransport.lineModeToPlatformMode(sheetDrawer.stop.route.line.mode);
0257                             args.departurePlatformIfopt = sheetDrawer.stop.stopPoint.identifier("ifopt");
0258                         }
0259 
0260                         // ensure the map page ends up on top
0261                         if (applicationWindow().pageStack.layers.depth < 2)
0262                             applicationWindow().pageStack.push(indoorMapPage, args);
0263                         else
0264                             applicationWindow().pageStack.layers.push(indoorMapPage, args);
0265                         }
0266                 }
0267             }
0268         }
0269 
0270     }
0271 
0272     ColumnLayout{
0273         anchors.fill: parent
0274         spacing: 0
0275 
0276         QQC2.SwipeView {
0277             id: view
0278             clip: true
0279             interactive: root.enableMapView
0280             Layout.fillHeight: true
0281             Layout.fillWidth: true
0282             Item {
0283                 id: listPage
0284 
0285                 objectName: "sectionList"
0286 
0287                 QQC2.ScrollView{
0288                     id: scrollview
0289                     anchors.fill: parent
0290 
0291                     ListView {
0292                         clip: true
0293                         model: sectionModel
0294                         header: JourneySectionStopDelegate {
0295                             stop: journeySection.departure
0296                             isDeparture: true
0297                             trailingProgress: sectionModel.departureTrailingProgress
0298                             stopoverPassed: sectionModel.departed
0299                             Binding {
0300                                 target: sectionModel
0301                                 property: "departureTrailingSegmentLength"
0302                                 value: trailingSegmentLength
0303                             }
0304                             visible: root.journeySection != undefined
0305                         }
0306                         delegate: JourneySectionStopDelegate {
0307                             stop: model.stopover
0308                             leadingProgress: model.leadingProgress
0309                             trailingProgress: model.trailingProgress
0310                             stopoverPassed: model.stopoverPassed
0311                             Binding {
0312                                 target: model
0313                                 property: "leadingLength"
0314                                 value: leadingSegmentLength
0315                             }
0316                             Binding {
0317                                 target: model
0318                                 property: "trailingLength"
0319                                 value: trailingSegmentLength
0320                             }
0321                         }
0322                         footer: JourneySectionStopDelegate {
0323                             stop: journeySection.arrival
0324                             isArrival: true
0325                             leadingProgress: sectionModel.arrivalLeadingProgress
0326                             stopoverPassed: sectionModel.arrived
0327                             Binding {
0328                                 target: sectionModel
0329                                 property: "arrivalLeadingSegmentLength"
0330                                 value: leadingSegmentLength
0331                             }
0332                             visible: root.journeySection != undefined
0333                         }
0334                     }
0335                 }
0336             }
0337             Item {
0338                 id: mapPage
0339 
0340                 objectName: "sectionMap"
0341 
0342                 MapView {
0343                     id: map
0344                     anchors.fill: parent
0345                     QtLocation.MapPolyline {
0346                         id: line
0347                         line.width: 10
0348                         line.color: journeySection.route.line.hasColor ? journeySection.route.line.color : Kirigami.Theme.textColor
0349                         path: PublicTransport.pathToGeoCoordinates(journeySection)
0350                         }
0351 
0352                     QtLocation.MapQuickItem {
0353                         coordinate {
0354 
0355                            latitude: journeySection.departure.stopPoint.latitude
0356                            longitude: journeySection.departure.stopPoint.longitude
0357                         }
0358                         anchorPoint.x: sourceItem.width/2
0359                         anchorPoint.y: sourceItem.height/2
0360                         sourceItem: Rectangle {
0361                             width:15
0362                             height:15
0363                             radius: height/2
0364                             border.width: 2
0365                             border.color: line.line.color
0366                             MouseArea {
0367                                 anchors.fill: parent
0368                                 scale: 2
0369                                 onClicked: {
0370                                     sheetDrawer.open()
0371                                     sheetDrawer.isArrival = false
0372                                     sheetDrawer.isDeparture = true
0373                                     sheetDrawer.stop = journeySection.departure
0374                                 }
0375                             }
0376                             }
0377                         }
0378 
0379                     Repeater {
0380                         model: sectionModel
0381 
0382                         QtLocation.MapQuickItem {
0383                             coordinate {
0384 
0385                                latitude: model.stopover.stopPoint.latitude
0386                                longitude: model.stopover.stopPoint.longitude
0387                             }
0388                             anchorPoint.x: sourceItem.width/2
0389                             anchorPoint.y: sourceItem.height/2
0390                             sourceItem: Rectangle {
0391                                 width: 6
0392                                 height: 6
0393                                 radius: height/2
0394                                 opacity: 0.5
0395                                 MouseArea {
0396                                     anchors.fill: parent
0397                                     scale: 3
0398                                     onClicked: {
0399                                         sheetDrawer.open()
0400                                         sheetDrawer.isArrival = false
0401                                         sheetDrawer.isDeparture = false
0402                                         sheetDrawer.stop = model.stopover
0403                                     }
0404                                 }
0405                             }
0406                         }
0407                     }
0408                     QtLocation.MapQuickItem {
0409                         coordinate {
0410 
0411                            latitude: journeySection.arrival.stopPoint.latitude
0412                            longitude: journeySection.arrival.stopPoint.longitude
0413                         }
0414                         anchorPoint.x: sourceItem.width/2
0415                         anchorPoint.y: sourceItem.height/2
0416 
0417                         Component.onCompleted: {
0418                             map.center.latitude = line.path[(line.pathLength()/2).toFixed(0)].latitude
0419                             map.center.longitude = line.path[(line.pathLength()/2).toFixed(0)].longitude
0420                         }
0421                         sourceItem: Rectangle {
0422                             width:15
0423                             height:15
0424                             radius: height/2
0425                             border.width: 2
0426                             border.color: line.line.color
0427                             MouseArea {
0428                                 anchors.fill: parent
0429                                 scale: 2
0430                                 onClicked: {
0431                                     sheetDrawer.open()
0432                                     sheetDrawer.isArrival = true
0433                                     sheetDrawer.isDeparture = false
0434                                     sheetDrawer.stop = journeySection.arrival
0435                                 }
0436                             }
0437                         }
0438                     }
0439                 }
0440             }
0441         }
0442     }
0443 
0444     Components.FloatingButton {
0445         id: mapButton
0446         icon.name: checked ? "format-list-unordered" : "map-gnomonic"
0447         text: i18nc("@action:button", "Show Map")
0448         onClicked: view.currentIndex === 0 ? view.currentIndex = 1 : view.currentIndex = 0
0449         checkable: true
0450         checked: view.currentIndex === 1
0451 
0452         anchors {
0453             right: parent.right
0454             rightMargin: Kirigami.Units.largeSpacing + (scrollview.QQC2.ScrollBar && scrollview.QQC2.ScrollBar.vertical ? scrollview.QQC2.ScrollBar.vertical.width : 0)
0455             bottom: parent.bottom
0456             bottomMargin: Kirigami.Units.largeSpacing
0457         }
0458 
0459     }
0460 
0461 
0462 }