Warning, /libraries/kpublictransport/tests/departurequery.qml is written in an unsupported language. File is not indexed.
0001 /* 0002 SPDX-FileCopyrightText: 2018 Volker Krause <vkrause@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 import QtCore 0008 import QtQuick 0009 import QtQuick.Layouts 0010 import QtQuick.Controls as QQC2 0011 import QtQuick.Dialogs as Dialogs 0012 import org.kde.kirigami as Kirigami 0013 import org.kde.kpublictransport 0014 import org.kde.example 0015 0016 Kirigami.ApplicationWindow { 0017 title: "Departure Query" 0018 0019 width: 540 0020 height: 800 0021 0022 pageStack.initialPage: departureQueryPage 0023 0024 globalDrawer: Kirigami.GlobalDrawer { 0025 actions: [ 0026 Kirigami.Action { 0027 text: "Save..." 0028 icon.name: "document-save" 0029 onTriggered: fileDialog.open(); 0030 }, 0031 Kirigami.Action { 0032 icon.name: "help-about-symbolic" 0033 text: "Data Sources" 0034 enabled: departureModel.attributions.length > 0 0035 onTriggered: aboutSheet.open(); 0036 }, 0037 Kirigami.Action { 0038 icon.name: "settings-configure" 0039 text: "Backends" 0040 onTriggered: pageStack.push(backendPage) 0041 } 0042 ] 0043 } 0044 0045 Dialogs.FileDialog { 0046 id: fileDialog 0047 title: "Save Departure Data" 0048 fileMode: Dialog.FileDialog.SaveFile 0049 nameFilters: ["JSON files (*.json)"] 0050 onAccepted: ExampleUtil.saveTo(departureModel, fileDialog.selectedFile); 0051 } 0052 0053 TestLocationsModel { id: exampleModel } 0054 AttributionSheet { 0055 id: aboutSheet 0056 attributions: departureModel.attributions 0057 } 0058 LocationDetailsSheet { id: locationDetailsSheet } 0059 0060 Manager { 0061 id: ptMgr; 0062 } 0063 0064 Settings { 0065 id: settings 0066 property alias allowInsecureBackends: ptMgr.allowInsecureBackends 0067 property alias enabledBackends: ptMgr.enabledBackends 0068 property alias disabledBackends: ptMgr.disabledBackends 0069 } 0070 0071 StopoverQueryModel { 0072 id: departureModel 0073 manager: ptMgr 0074 } 0075 0076 Component { 0077 id: vehicleLayoutPage 0078 VehicleLayoutPage { 0079 publicTransportManager: ptMgr 0080 } 0081 } 0082 0083 Component { 0084 id: indoorMapPage 0085 IndoorMapPage {} 0086 } 0087 0088 Component { 0089 id: departureDelegate 0090 QQC2.ItemDelegate { 0091 enabled: departure.disruptionEffect != Disruption.NoService 0092 highlighted: false 0093 width: ListView.view.width 0094 contentItem: RowLayout { 0095 id: delegateLayout 0096 0097 Kirigami.Icon { 0098 id: icon 0099 source: departure.route.line.hasLogo ? departure.route.line.logo : departure.route.line.modeLogo 0100 width: height 0101 height: Kirigami.Units.iconSizes.large 0102 visible: source != "" 0103 } 0104 0105 Rectangle { 0106 id: colorBar 0107 width: Kirigami.Units.largeSpacing 0108 color: departure.route.line.hasColor ? departure.route.line.color : "transparent" 0109 Layout.fillHeight: true 0110 visible: icon.source == "" 0111 } 0112 0113 QQC2.Label { 0114 text: { 0115 switch (departure.route.line.mode) { 0116 case Line.Air: return "✈️"; 0117 case Line.Boat: return "🛥️"; 0118 case Line.Bus: return "🚍"; 0119 case Line.BusRapidTransit: return "🚌"; 0120 case Line.Coach: return "🚌"; 0121 case Line.Ferry: return "⛴️"; 0122 case Line.Funicular: return "🚞"; 0123 case Line.LocalTrain: return "🚆"; 0124 case Line.LongDistanceTrain: return "🚄"; 0125 case Line.Metro: return "🚇"; 0126 case Line.RailShuttle: return "🚅"; 0127 case Line.RapidTransit: return "🚊"; 0128 case Line.Shuttle: return "🚐"; 0129 case Line.Taxi: return "🚕"; 0130 case Line.Train: return "🚆"; 0131 case Line.Tramway: return "🚈"; 0132 case Line.RideShare: return "🚗"; 0133 default: return "?"; 0134 } 0135 } 0136 font.pointSize: Kirigami.Theme.defaultFont.pointSize * 2 0137 visible: icon.source == "" 0138 } 0139 0140 ColumnLayout { 0141 Layout.fillWidth: true 0142 QQC2.Label { 0143 Layout.fillWidth: true 0144 text: { 0145 if (departure.route.name !== "") { 0146 return departure.route.line.modeString + " " + departure.route.line.name + " (" + departure.route.name 0147 + ") to <a href=\"#dest\">" + departure.route.direction + "</a>" 0148 } 0149 return departure.route.line.modeString + " " + departure.route.line.name 0150 + " to <a href=\"#dest\">" + departure.route.direction + "</a>"; 0151 } 0152 onLinkActivated: { 0153 locationDetailsSheet.location = departure.route.destination; 0154 locationDetailsSheet.open(); 0155 } 0156 } 0157 RowLayout { 0158 QQC2.Label { 0159 text: "Arrival: " + departure.scheduledArrivalTime.toTimeString() 0160 } 0161 QQC2.Label { 0162 text: (departure.arrivalDelay >= 0 ? "+" : "") + departure.arrivalDelay 0163 color: departure.arrivalDelay > 1 ? Kirigami.Theme.negativeTextColor : Kirigami.Theme.positiveTextColor 0164 visible: departure.hasExpectedArrivalTime 0165 } 0166 QQC2.Label { 0167 text: "Departure: " + departure.scheduledDepartureTime.toTimeString() 0168 } 0169 QQC2.Label { 0170 text: (departure.departureDelay >= 0 ? "+" : "") + departure.departureDelay 0171 color: departure.departureDelay > 1 ? Kirigami.Theme.negativeTextColor : Kirigami.Theme.positiveTextColor 0172 visible: departure.hasExpectedDepartureTime 0173 } 0174 QQC2.Label { 0175 text: "<a href=\"#layout\">vehicle</a>" 0176 visible: departure.route.line.mode == Line.LongDistanceTrain || departure.route.line.mode == Line.Train || departure.route.name !== "" 0177 onLinkActivated: applicationWindow().pageStack.push(vehicleLayoutPage, {"departure": departure }); 0178 Layout.fillWidth: true 0179 horizontalAlignment: Text.Right 0180 } 0181 } 0182 RowLayout { 0183 QQC2.Label { 0184 text: "From: <a href=\"#from\">" + departure.stopPoint.name + "</a>" 0185 onLinkActivated: { 0186 locationDetailsSheet.location = departure.stopPoint; 0187 locationDetailsSheet.open(); 0188 } 0189 } 0190 QQC2.Label { 0191 visible: departure.scheduledPlatform != "" 0192 text: "Platform: " + departure.scheduledPlatform + (platformChange.visible ? " -> " : "") 0193 color: (!platformChange.visible && departure.hasExpectedPlatform) ? Kirigami.Theme.positiveTextColor : Kirigami.Theme.textColor 0194 } 0195 QQC2.Label { 0196 id: platformChange 0197 text: departure.expectedPlatform 0198 visible: departure.hasExpectedPlatform && departure.scheduledPlatform != departure.expectedPlatform 0199 color: Kirigami.Theme.negativeTextColor 0200 } 0201 } 0202 RowLayout { 0203 visible: departure.loadInformation.length > 0 0204 QQC2.Label { 0205 text: "Load: "; 0206 } 0207 Repeater { 0208 model: departure.loadInformation 0209 RowLayout { 0210 QQC2.Label { 0211 text: { 0212 switch (modelData.load) { 0213 case Load.Low: return "Low"; 0214 case Load.Medium: return "Medium"; 0215 case Load.High: return "High"; 0216 case Load.Full: return "Full"; 0217 default: return "?" 0218 } 0219 } 0220 color: { 0221 switch (modelData.load) { 0222 case Load.Low: return Kirigami.Theme.positiveTextColor; 0223 case Load.Medium: return Kirigami.Theme.neutralTextColor; 0224 case Load.High: 0225 case Load.Full: 0226 return Kirigami.Theme.negativeTextColor; 0227 default: 0228 return Kirigami.Theme.textColor; 0229 } 0230 } 0231 } 0232 QQC2.Label { 0233 text: "(class " + modelData.seatingClass + ")" 0234 visible: modelData.seatingClass != "" 0235 } 0236 } 0237 } 0238 } 0239 QQC2.Label { 0240 text: departure.notes.join("<br/>") 0241 visible: departure.notes.length > 0 0242 font.italic: true 0243 textFormat: Text.RichText 0244 } 0245 } 0246 } 0247 } 0248 } 0249 0250 Component { 0251 id: backendPage 0252 BackendPage { 0253 publicTransportManager: ptMgr 0254 } 0255 } 0256 0257 Component { 0258 id: departureQueryPage 0259 Kirigami.Page { 0260 Settings { 0261 id: settings 0262 property alias queryArrivals: arrivalBox.checked 0263 property alias singleBackend: backendBox.checked 0264 property alias backend: backendSelector.currentIndex 0265 property alias maxResults: maxResults.text 0266 } 0267 0268 ColumnLayout { 0269 anchors.fill: parent 0270 0271 QQC2.CheckBox { 0272 id: arrivalBox 0273 text: checked ? "Arrival" : "Departure" 0274 } 0275 0276 QQC2.CheckBox { 0277 text: "Allow insecure backends" 0278 checked: ptMgr.allowInsecureBackends 0279 onToggled: ptMgr.allowInsecureBackends = checked 0280 } 0281 0282 RowLayout { 0283 QQC2.CheckBox { 0284 id: backendBox 0285 text: "Select Backend:" 0286 } 0287 QQC2.ComboBox { 0288 id: backendSelector 0289 Layout.fillWidth: true 0290 textRole: "identifier" 0291 model: BackendModel { 0292 manager: ptMgr 0293 } 0294 enabled: backendBox.checked 0295 } 0296 } 0297 RowLayout { 0298 QQC2.Label { text: "Results:" } 0299 QQC2.TextField { 0300 id: maxResults 0301 text: "10" 0302 } 0303 } 0304 0305 QQC2.ComboBox { 0306 id: exampleSelector 0307 Layout.fillWidth: true 0308 model: exampleModel 0309 textRole: "label" 0310 onCurrentIndexChanged: { 0311 var obj = exampleModel.get(currentIndex); 0312 nameQuery.text = obj.name == "" ? obj.label : obj.name; 0313 lonQuery.text = obj.lon; 0314 latQuery.text = obj.lat; 0315 } 0316 } 0317 0318 RowLayout { 0319 Layout.fillWidth: true 0320 QQC2.TextField { 0321 Layout.fillWidth: true 0322 id: nameQuery 0323 } 0324 QQC2.TextField { 0325 id: lonQuery 0326 Layout.preferredWidth: 100 0327 } 0328 QQC2.TextField { 0329 id: latQuery 0330 Layout.preferredWidth: 100 0331 } 0332 } 0333 0334 QQC2.ComboBox { 0335 id: lineModeSelector 0336 Layout.fillWidth: true 0337 model: [ "All", "Only long distance", "Local public transport", "Local trains only", "Rapit transit/metro/tram", "Bus" ] 0338 property var currentMode: { 0339 switch (currentIndex) { 0340 case 1: return [Line.LongDistanceTrain, Line.Train]; 0341 case 2: return [Line.LocalTrain, Line.RapidTransit, Line.Metro, Line.Tramway, Line.Funicular, Line.Bus]; 0342 case 3: return [Line.LocalTrain]; 0343 case 4: return [Line.RapidTransit, Line.Metro, Line.Tramway, Line.Funicular]; 0344 case 5: return [Line.Bus]; 0345 } 0346 return []; 0347 } 0348 } 0349 0350 RowLayout { 0351 Layout.fillWidth: true 0352 QQC2.Button { 0353 text: "Query" 0354 onClicked: { 0355 var stop = departureModel.request.stop; 0356 stop.latitude = latQuery.text; 0357 stop.longitude = lonQuery.text; 0358 stop.name = nameQuery.text; 0359 departureModel.request.stop = stop; 0360 departureModel.request.mode = arrivalBox.checked ? StopoverRequest.QueryArrival : StopoverRequest.QueryDeparture; 0361 departureModel.request.backends = backendBox.checked ? [ backendSelector.currentText ] : []; 0362 departureModel.request.downloadAssets = true; 0363 departureModel.request.maximumResults = maxResults.text; 0364 departureModel.request.lineModes = lineModeSelector.currentMode 0365 } 0366 } 0367 QQC2.Button { 0368 text: "Query Name" 0369 onClicked: { 0370 var stop = departureModel.request.stop; 0371 stop.latitude = NaN; 0372 stop.longitude = NaN; 0373 stop.name = nameQuery.text; 0374 departureModel.request.stop = stop; 0375 departureModel.request.mode = arrivalBox.checked ? StopoverRequest.QueryArrival : StopoverRequest.QueryDeparture; 0376 departureModel.request.backends = backendBox.checked ? [ backendSelector.currentText ] : []; 0377 departureModel.request.downloadAssets = true; 0378 departureModel.request.lineModes = lineModeSelector.currentMode 0379 departureModel.request.maximumResults = maxResults.text; 0380 } 0381 } 0382 QQC2.Button { 0383 text: "Query Coord" 0384 onClicked: { 0385 var stop = departureModel.request.stop; 0386 stop.latitude = latQuery.text; 0387 stop.longitude = lonQuery.text; 0388 stop.name = ""; 0389 departureModel.request.stop = stop; 0390 departureModel.request.mode = arrivalBox.checked ? StopoverRequest.QueryArrival : StopoverRequest.QueryDeparture; 0391 departureModel.request.backends = backendBox.checked ? [ backendSelector.currentText ] : []; 0392 departureModel.request.downloadAssets = true; 0393 departureModel.request.maximumResults = maxResults.text; 0394 departureModel.request.lineModes = lineModeSelector.currentMode 0395 } 0396 } 0397 QQC2.Button { 0398 text: "Earlier" 0399 enabled: departureModel.canQueryPrevious 0400 onClicked: departureModel.queryPrevious() 0401 } 0402 QQC2.Button { 0403 text: "Later" 0404 enabled: departureModel.canQueryNext 0405 onClicked: departureModel.queryNext() 0406 } 0407 } 0408 0409 ListView { 0410 Layout.fillHeight: true 0411 Layout.fillWidth: true 0412 model: departureModel 0413 clip: true 0414 delegate: departureDelegate 0415 0416 QQC2.BusyIndicator { 0417 anchors.centerIn: parent 0418 running: departureModel.loading 0419 } 0420 0421 QQC2.Label { 0422 anchors.centerIn: parent 0423 width: parent.width 0424 text: departureModel.errorMessage 0425 color: Kirigami.Theme.negativeTextColor 0426 wrapMode: Text.Wrap 0427 } 0428 } 0429 0430 } 0431 } 0432 } 0433 }