Warning, /pim/itinerary/src/app/JourneySectionDelegate.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.kpublictransport
0012 import org.kde.itinerary
0013 import org.kde.kirigamiaddons.formcard as FormCard
0014 
0015 FormCard.AbstractFormDelegate {
0016     id: root
0017     required property var modelData
0018     required property int index
0019     required property int modelLength
0020 
0021     topPadding: 0
0022     bottomPadding: 0
0023 
0024     onClicked: {
0025         if (modelData.mode == JourneySection.PublicTransport) {
0026             applicationWindow().pageStack.push(journeySectionPage, {
0027                 journeySection: root.modelData,
0028             });
0029         } else if (modelData.path.sections.length > 1) {
0030             applicationWindow().pageStack.push(journeyPathPage, {
0031                 path: root.modelData.path,
0032             });
0033         }
0034     }
0035 
0036     contentItem: GridLayout {
0037         rowSpacing: 0
0038         columns: 3
0039 
0040         // top row: departure time, departure location, departure platform
0041         Item {
0042             visible: modelData.mode !== JourneySection.Walking || index === 0
0043             width: departureLine.width
0044             Layout.fillHeight: true
0045             Rectangle{
0046                 visible: index != 0 || modelData.mode == JourneySection.Walking
0047                 height: parent.height
0048                 anchors.centerIn: parent
0049                 Layout.margins: 0
0050                 color: Kirigami.Theme.disabledTextColor
0051                 width: Kirigami.Units.smallSpacing / 2
0052             }
0053 
0054             JourneySectionStopDelegateLineSegment {
0055                 id: departureLine
0056                 anchors.topMargin: Kirigami.Units.mediumSpacing
0057                 anchors.fill: parent
0058                 lineColor: modelData.route.line.hasColor ? modelData.route.line.color : Kirigami.Theme.textColor
0059                 isDeparture: true
0060                 visible:  modelData.mode !== JourneySection.Transfer && modelData.mode !== JourneySection.Walking
0061             }
0062         }
0063         RowLayout {
0064             Layout.minimumWidth: depTime.width + Kirigami.Units.largeSpacing * 3.5
0065             Layout.topMargin: Kirigami.Units.mediumSpacing
0066             visible: ( root.modelData.mode !== JourneySection.Waiting && modelData.mode !== JourneySection.Walking ) || index === 0
0067 
0068 
0069             QQC2.Label {
0070                 id: depTime
0071                 text: Localizer.formatTime(root.modelData, "scheduledDepartureTime")
0072             }
0073             QQC2.Label {
0074                 text: {
0075                     if (root.modelData.disruption === Disruption.NoService)
0076                         return i18nc("a train/bus journey canceled by its operator", "Canceled");
0077                     return (root.modelData.departureDelay >= 0 ? "+" : "") + root.modelData.departureDelay;
0078                 }
0079                 color: {
0080                     if (root.modelData.departureDelay > 1 || root.modelData.disruption === Disruption.NoService)
0081                         return Kirigami.Theme.negativeTextColor;
0082                     return Kirigami.Theme.positiveTextColor;
0083                 }
0084                 visible: root.modelData.hasExpectedDepartureTime || root.modelData.disruption === Disruption.NoService
0085             }
0086         }
0087         RowLayout {
0088             Layout.topMargin: Kirigami.Units.mediumSpacing
0089             visible: ( root.modelData.mode !== JourneySection.Waiting && modelData.mode !== JourneySection.Walking ) || index === 0
0090 
0091             QQC2.Label {
0092                 text: modelData.from.name
0093                 font.bold: true
0094                 Layout.fillWidth: true
0095                 elide: Text.ElideRight
0096             }
0097             QQC2.Label {
0098                 text: modelData.hasExpectedDeparturePlatform ? modelData.expectedDeparturePlatform : modelData.scheduledDeparturePlatform
0099                 color: modelData.departurePlatformChanged ? Kirigami.Theme.negativeTextColor
0100                     : modelData.hasExpectedDeparturePlatform ? Kirigami.Theme.positiveTextColor
0101                     : Kirigami.Theme.textColor
0102                 visible: root.modelData.scheduledDeparturePlatform.length > 0
0103             }
0104         }
0105         // middle row: mode symbol, transport mode, duration
0106         Item {
0107             width: departureLine.width
0108             Layout.fillHeight: true
0109 
0110             Rectangle{
0111                 height: parent.height
0112                 anchors.centerIn: parent
0113                 color: Kirigami.Theme.disabledTextColor
0114                 width: Math.round(Kirigami.Units.smallSpacing / 2)
0115             }
0116             JourneySectionStopDelegateLineSegment {
0117                 anchors.fill: parent
0118                 lineColor: modelData.route.line.hasColor ? modelData.route.line.color : Kirigami.Theme.textColor
0119                 hasStop: false
0120                 visible: modelData.mode !== JourneySection.Transfer && modelData.mode !== JourneySection.Walking
0121             }
0122         }
0123         Item{
0124             Layout.preferredWidth: depTime.width + Kirigami.Units.largeSpacing * 3.5
0125             implicitHeight: Kirigami.Units.iconSizes.smallMedium
0126 
0127             Rectangle {
0128                 color: (root.modelData.route.line.hasColor && !modelData.route.line.hasLogo && !modelData.route.line.hasModeLogo) ? modelData.route.line.color : "transparent"
0129                 implicitHeight: parent.height
0130                 implicitWidth: modeIcon.width
0131                 anchors.centerIn: parent
0132                 radius: Kirigami.Units.smallSpacing
0133 
0134                 TransportIcon {
0135                     id: modeIcon
0136                     anchors.centerIn: parent
0137                     source: PublicTransport.journeySectionIcon(modelData)
0138                     color: modelData.route.line.hasTextColor ? modelData.route.line.textColor : Kirigami.Theme.textColor
0139                     width: !isMask ? implicitWidth : height
0140                     height: parent.height
0141                     isMask: modelData.mode != JourneySection.PublicTransport || (!modelData.route.line.hasLogo && !modelData.route.line.hasModeLogo)
0142                 }
0143             }
0144         }
0145         RowLayout {
0146             Layout.topMargin: modelData.mode === JourneySection.Walking ? Kirigami.Units.largeSpacing * 3 : 0
0147             Layout.bottomMargin: modelData.mode === JourneySection.Walking? Kirigami.Units.largeSpacing * 3 : 0
0148 
0149             Layout.fillWidth: true
0150             QQC2.Label {
0151                 id: journeyTitleLabel
0152                 Layout.fillWidth: true
0153                 text: {
0154                     switch (modelData.mode) {
0155                     case JourneySection.PublicTransport:
0156                     {
0157                         var l = ""
0158 
0159                         if (modelData.route.line.modeString) {
0160                             l += modelData.route.line.modeString + " "
0161                         }
0162 
0163                         l += modelData.route.line.name;
0164 
0165                         if (modelData.route.direction)
0166                             return i18n("%1 to %2 (%3)", l, modelData.route.direction, Localizer.formatDuration(modelData.duration));
0167                         return i18n("%1 (%2)", l, Localizer.formatDuration(modelData.duration));
0168                     }
0169                     case JourneySection.Walking:
0170                         if (modelData.distance == 0)
0171                             return i18n("Walk (%1)", Localizer.formatDuration(modelData.duration));
0172                         return i18n("Walk %1 (%2)", Localizer.formatDistance(modelData.distance), Localizer.formatDuration(modelData.duration));
0173                     case JourneySection.Transfer:
0174                         return i18n("Transfer (%1)", Localizer.formatDuration(modelData.duration))
0175                     case JourneySection.Waiting:
0176                         return i18n("Wait (%1)", Localizer.formatDuration(modelData.duration))
0177                     case JourneySection.RentedVehicle:
0178                         return i18n("%1 %2 (%3)", modelData.rentalVehicle.network.name, Localizer.formatDistance(modelData.distance), Localizer.formatDuration(modelData.duration));
0179                     case JourneySection.IndividualTransport:
0180                         return i18n("Drive %1 (%2)", Localizer.formatDistance(modelData.distance), Localizer.formatDuration(modelData.duration));
0181                     return "???";
0182                 }}
0183                 color: PublicTransport.warnAboutSection(modelData) ? Kirigami.Theme.negativeTextColor : Kirigami.Theme.textColor
0184                 elide: Text.ElideMiddle
0185             }
0186             VehicleLoadIndicator {
0187                 loadInformation: modelData.loadInformation
0188             }
0189         }
0190         // optional middle row: notes
0191         Item {
0192             visible: modelData.notes.length > 0
0193             width: departureLine.width
0194             Layout.fillHeight: true
0195             Rectangle{
0196                 height: parent.height
0197                 anchors.centerIn: parent
0198                 color: Kirigami.Theme.disabledTextColor
0199                 width: Kirigami.Units.smallSpacing / 2
0200             }
0201             JourneySectionStopDelegateLineSegment {
0202                 anchors.fill: parent
0203                 lineColor: modelData.route.line.hasColor ? modelData.route.line.color : Kirigami.Theme.textColor
0204                 hasStop: false
0205                 visible: !(modelData.mode == JourneySection.Transfer || modelData.mode == JourneySection.Walking)
0206             }
0207         }
0208         Item {
0209             visible: modelData.notes.length > 0
0210             Layout.preferredWidth: Kirigami.Units.largeSpacing
0211             Layout.fillHeight: true
0212         }
0213         ColumnLayout {
0214             visible: modelData.notes.length > 0
0215             Layout.fillWidth: true
0216             QQC2.Label {
0217                 id: notesLabel
0218                 Layout.fillWidth: true
0219                 Layout.fillHeight: true
0220                 text: modelData.notes.join("<br/>")
0221                 color: Kirigami.Theme.disabledTextColor
0222                 textFormat: Text.RichText
0223                 wrapMode: Text.Wrap
0224                 verticalAlignment: Text.AlignTop
0225                 // Doesn't work with RichText.
0226                 elide: Text.ElideRight
0227                 maximumLineCount: 3
0228                 Layout.maximumHeight: Kirigami.Units.gridUnit * maximumLineCount
0229                 visible: modelData.notes.length > 0
0230                 font.italic: true
0231                 clip: implicitHeight > height
0232                 onLinkActivated: Qt.openUrlExternally(link)
0233 
0234                 SheetDrawer {
0235                     id: moreNotesSheet
0236                     parent: applicationWindow().overlay
0237 
0238                     headerItem: Kirigami.Heading {
0239                         text: journeyTitleLabel.text
0240                         elide: Qt.ElideRight
0241                         Layout.fillWidth: true
0242                         leftPadding: Kirigami.Units.smallSpacing
0243                         rightPadding: Kirigami.Units.smallSpacing
0244                     }
0245 
0246                     contentItem: QQC2.Label {
0247                         Layout.fillWidth: true
0248                         Layout.preferredWidth: Kirigami.Units.gridUnit * 60
0249                         Layout.maximumWidth: root.width
0250                         text: modelData.notes.join("<br/>")
0251                         textFormat: Text.RichText
0252                         wrapMode: Text.Wrap
0253                         onLinkActivated: Qt.openUrlExternally(link)
0254                         padding: Kirigami.Units.largeSpacing * 2
0255 
0256                     }
0257                 }
0258             }
0259             Kirigami.LinkButton {
0260                 Layout.fillHeight: true
0261                 Layout.bottomMargin: Kirigami.Units.smallSpacing
0262                 text: i18nc("@action:button", "Show Moreā€¦")
0263                 visible: notesLabel.implicitHeight > notesLabel.Layout.maximumHeight
0264                 onClicked: {
0265                     moreNotesSheet.open();
0266                 }
0267             }
0268         }
0269         // last row: arrival information
0270         Item {
0271             Layout.preferredWidth: departureLine.width
0272             Layout.fillHeight: true
0273             visible: modelData.mode !== JourneySection.Walking || index === modelLength
0274 
0275             Rectangle{
0276                 visible: index !== modelLength || modelData.mode === JourneySection.Walking
0277                 height: parent.height
0278                 anchors.centerIn: parent
0279                 Layout.margins: 0
0280                 color: Kirigami.Theme.disabledTextColor
0281                 width: Math.round(Kirigami.Units.smallSpacing / 2)
0282             }
0283             JourneySectionStopDelegateLineSegment {
0284                 anchors.fill: parent
0285                 anchors.bottomMargin: Kirigami.Units.mediumSpacing
0286                 lineColor: modelData.route.line.hasColor ? modelData.route.line.color : Kirigami.Theme.textColor
0287                 isArrival: true
0288                 visible:  modelData.mode !== JourneySection.Transfer && modelData.mode !== JourneySection.Walking
0289             }
0290         }
0291         RowLayout {
0292             Layout.minimumWidth: depTime.width + Kirigami.Units.largeSpacing * 3.5
0293             Layout.bottomMargin: Kirigami.Units.mediumSpacing
0294             visible: ( modelData.mode !== JourneySection.Waiting && modelData.mode !== JourneySection.Walking) || index === modelLength
0295 
0296             QQC2.Label {
0297                 text: Localizer.formatTime(modelData, "scheduledArrivalTime")
0298             }
0299             QQC2.Label {
0300                 text: (modelData.arrivalDelay >= 0 ? "+" : "") + modelData.arrivalDelay
0301                 color: modelData.arrivalDelay > 1 ? Kirigami.Theme.negativeTextColor : Kirigami.Theme.positiveTextColor
0302                 visible: modelData.hasExpectedArrivalTime
0303             }
0304         }
0305         RowLayout {
0306             Layout.bottomMargin: Kirigami.Units.mediumSpacing
0307             visible: ( modelData.mode !== JourneySection.Waiting && modelData.mode !== JourneySection.Walking ) || index === modelLength
0308 
0309             QQC2.Label {
0310                 text: modelData.to.name
0311                 font.bold: true
0312                 Layout.fillWidth: true
0313                 elide: Text.ElideRight
0314             }
0315             QQC2.Label {
0316                 text: modelData.hasExpectedArrivalPlatform ? modelData.expectedArrivalPlatform : modelData.scheduledArrivalPlatform
0317                 color: modelData.arrivalPlatformChanged ? Kirigami.Theme.negativeTextColor
0318                     : modelData.hasExpectedArrivalPlatform ? Kirigami.Theme.positiveTextColor
0319                     : Kirigami.Theme.textColor
0320                 visible: modelData.scheduledArrivalPlatform !== ""
0321             }
0322         }
0323 
0324 
0325     }
0326 }