Warning, /pim/itinerary/src/app/JourneyQueryPage.qml is written in an unsupported language. File is not indexed.
0001 /*
0002 SPDX-FileCopyrightText: 2019-2021 Volker Krause <vkrause@kde.org>
0003 SPDX-FileCopyrightText: 2023 Carl Schwan <carl@carlschwan.eu>
0004
0005 SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007
0008 import QtQuick
0009 import QtQuick.Layouts
0010 import QtQuick.Controls as QQC2
0011 import org.kde.kirigami as Kirigami
0012 import org.kde.kitemmodels
0013 import org.kde.kpublictransport
0014 import org.kde.itinerary
0015 import org.kde.kirigamiaddons.formcard as FormCard
0016
0017 Kirigami.ScrollablePage {
0018 id: root
0019
0020 /** The journey selected by the user on this page. */
0021 property var journey
0022 /** The journey to query for. */
0023 property alias journeyRequest: journeyModel.request
0024 property alias publicTransportManager: journeyModel.manager
0025
0026 Kirigami.Theme.inherit: false
0027 Kirigami.Theme.colorSet: Kirigami.Theme.Window
0028
0029
0030 actions: [
0031 Kirigami.Action {
0032 text: i18n("Earlier")
0033 icon.name: "go-up-symbolic"
0034 onTriggered: journeyModel.queryPrevious()
0035 enabled: journeyModel.canQueryPrevious
0036 },
0037 Kirigami.Action {
0038 text: i18n("Later")
0039 icon.name: "go-down-symbolic"
0040 onTriggered: journeyModel.queryNext()
0041 enabled: journeyModel.canQueryNext
0042 }
0043 ]
0044
0045 ListView {
0046 id: journeyView
0047
0048 clip: true
0049
0050 delegate: FormCard.FormCard {
0051 id: top
0052
0053 width: ListView.view.width
0054
0055 required property int index
0056 required property var journey
0057
0058 JourneyDelegateHeader {
0059 journey: top.journey
0060 }
0061
0062 Repeater {
0063 id: journeyRepeater
0064 delegate: JourneySectionDelegate {
0065 Layout.fillWidth: true
0066 modelLength: journeyRepeater.count - 1
0067 }
0068 model: journeyView.currentIndex === top.index ? top.journey.sections : 0
0069 }
0070
0071 JourneySummaryDelegate {
0072 id: summaryButton
0073
0074 journey: top.journey
0075 visible: journeyView.currentIndex !== top.index
0076 onClicked: journeyView.currentIndex = top.index
0077
0078 Layout.fillWidth: true
0079 }
0080
0081 FormCard.FormDelegateSeparator {
0082 visible: journeyView.currentIndex === top.index
0083 above: selectButton
0084 }
0085
0086 FormCard.FormButtonDelegate {
0087 id: selectButton
0088
0089 text: i18n("Select")
0090 icon.name: "checkmark"
0091 visible: journeyView.currentIndex === top.index
0092 enabled: top.journey.disruptionEffect !== Disruption.NoService
0093 onClicked: root.journey = journey
0094 }
0095 }
0096
0097 model: KSortFilterProxyModel {
0098 id: sortedJourneyModel
0099
0100 sourceModel: JourneyQueryModel {
0101 id: journeyModel
0102 }
0103 sortRole: JourneyQueryModel.ScheduledDepartureTime
0104 dynamicSortFilter: true
0105 Component.onCompleted: Util.sortModel(sortedJourneyModel, 0, Qt.Ascending)
0106 }
0107
0108 spacing: Kirigami.Units.largeSpacing
0109
0110 header: VerticalNavigationButton {
0111 visible: journeyModel.canQueryPrevious
0112 width: journeyView.width
0113 text: i18nc("@action:button", "Load earlier connections")
0114 iconName: "go-up-symbolic"
0115 onClicked: journeyModel.queryPrevious()
0116 }
0117
0118 footer: VerticalNavigationButton {
0119 visible: journeyModel.canQueryNext
0120 width: journeyView.width
0121 iconName: "go-down-symbolic"
0122 text: i18nc("@action:button", "Load later connections")
0123 onClicked: journeyModel.queryNext()
0124
0125 FormCard.FormCard {
0126 visible: journeyModel.attributions.length > 0
0127
0128 FormCard.FormTextDelegate {
0129 text: i18n("Data providers:")
0130 description: PublicTransport.attributionSummary(journeyModel.attributions)
0131 onLinkActivated: Qt.openUrlExternally(link)
0132 }
0133 }
0134 }
0135
0136 QQC2.BusyIndicator {
0137 anchors.centerIn: parent
0138 running: journeyModel.loading && journeyView.count === 0
0139 }
0140
0141 QQC2.Label {
0142 anchors.centerIn: parent
0143 width: parent.width - Kirigami.Units.gridUnit * 4
0144 text: journeyModel.errorMessage
0145 color: Kirigami.Theme.negativeTextColor
0146 wrapMode: Text.Wrap
0147 }
0148 }
0149
0150 footer: ColumnLayout {
0151 spacing: 0
0152 height: indicator.running ? layout.implicitHeight : 0
0153 visible: journeyModel.loading && journeyView.count !== 0
0154
0155 Behavior on height {
0156 NumberAnimation { duration: Kirigami.Units.shortDuration }
0157 }
0158
0159 Kirigami.Separator {
0160 Layout.fillWidth: true
0161 }
0162
0163 RowLayout {
0164 id: layout
0165
0166 QQC2.BusyIndicator {
0167 id: indicator
0168 running: journeyModel.loading && journeyView.count !== 0
0169 }
0170
0171 QQC2.Label {
0172 text: i18n("Still fetching results…")
0173 }
0174
0175 Item {
0176 Layout.fillWidth: true
0177 }
0178 }
0179 }
0180 }