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 }