Warning, /pim/itinerary/src/app/StopPickerPage.qml is written in an unsupported language. File is not indexed.
0001 /*
0002 SPDX-FileCopyrightText: 2021 Volker Krause <vkrause@kde.org>
0003 SPDX-License-Identifier: LGPL-2.0-or-later
0004 */
0005
0006 import QtQuick
0007 import QtQuick.Layouts
0008 import QtQuick.Controls as QQC2
0009 import org.kde.kirigami as Kirigami
0010 import org.kde.kitemmodels
0011 import org.kde.i18n.localeData
0012 import org.kde.kpublictransport
0013 import org.kde.itinerary
0014
0015 Kirigami.ScrollablePage {
0016 id: root
0017 property var publicTransportManager
0018 /**
0019 * Initially selected country.
0020 * If not specified the country from the current locale is used.
0021 */
0022 property string initialCountry: Qt.locale().name.match(/_([A-Z]{2})/)[1]
0023 property var location
0024
0025 QQC2.ActionGroup { id: sortActionGroup }
0026 actions: [
0027 Kirigami.Action {
0028 text: i18n("Clear history")
0029 icon.name: "edit-clear-history"
0030 onTriggered: locationHistoryModel.clear()
0031 },
0032 Kirigami.Action { separator: true },
0033
0034 Kirigami.Action {
0035 QQC2.ActionGroup.group: sortActionGroup
0036 checkable: true
0037 checked: historySortModel.sortRoleName == "locationName"
0038 text: i18n("Sort by name")
0039 onTriggered: historySortModel.sortRoleName = "locationName"
0040 },
0041 Kirigami.Action {
0042 QQC2.ActionGroup.group: sortActionGroup
0043 checkable: true
0044 checked: historySortModel.sortRoleName == "lastUsed"
0045 text: i18n("Most recently used")
0046 onTriggered: historySortModel.sortRoleName = "lastUsed"
0047 },
0048 Kirigami.Action {
0049 QQC2.ActionGroup.group: sortActionGroup
0050 checkable: true
0051 checked: historySortModel.sortRoleName == "useCount"
0052 text: i18n("Most often used")
0053 onTriggered: historySortModel.sortRoleName = "useCount"
0054 }
0055 ]
0056 header: ColumnLayout {
0057 spacing: Kirigami.Units.smallSpacing
0058 CountryComboBox {
0059 id: countryCombo
0060 Layout.topMargin: Kirigami.Units.smallSpacing
0061 Layout.leftMargin: Kirigami.Units.smallSpacing
0062 Layout.rightMargin: Kirigami.Units.smallSpacing
0063 Layout.fillWidth: true
0064 model: {
0065 var countries = new Array();
0066 for (const b of publicTransportManager.backends) {
0067 if (!publicTransportManager.isBackendEnabled(b.identifier)) {
0068 continue;
0069 }
0070 for (const t of [CoverageArea.Realtime, CoverageArea.Regular, CoverageArea.Any]) {
0071 for (const c of b.coverageArea(t).regions) {
0072 if (c != 'UN' && c != 'EU') {
0073 countries.push(c.substr(0, 2));
0074 }
0075 }
0076 }
0077 }
0078 return [...new Set(countries)];
0079 }
0080 initialCountry: root.initialCountry
0081 onCurrentValueChanged: {
0082 var loc = locationQueryModel.request.location;
0083 loc.country = countryCombo.currentValue;
0084 locationQueryModel.request.location = loc;
0085 locationQueryModel.request.type = Location.Stop
0086 }
0087 }
0088 Kirigami.SearchField {
0089 id: queryTextField
0090 Layout.leftMargin: Kirigami.Units.smallSpacing
0091 Layout.rightMargin: Kirigami.Units.smallSpacing
0092 Layout.bottomMargin: Kirigami.Units.smallSpacing
0093 Layout.fillWidth: true
0094 onAccepted: {
0095 if (text !== "" && countryCombo.currentValue !== "") {
0096 var loc = locationQueryModel.request.location;
0097 loc.name = text;
0098 loc.country = countryCombo.currentValue;
0099 locationQueryModel.request.location = loc;
0100 locationQueryModel.request.type = Location.Stop
0101 }
0102 }
0103 }
0104 }
0105
0106 LocationQueryModel {
0107 id: locationQueryModel
0108 manager: publicTransportManager
0109 queryDelay: 500
0110 }
0111 LocationHistoryModel {
0112 id: locationHistoryModel
0113 }
0114 KSortFilterProxyModel {
0115 id: historySortModel
0116 sourceModel: locationHistoryModel
0117 sortRoleName: Settings.read("StopPicker/historySortMode", "lastUsed")
0118 onSortRoleChanged: Settings.write("StopPicker/historySortMode", sortRoleName)
0119 sortOrder: sortRoleName == "locationName" ? Qt.AscendingOrder : Qt.DescendingOrder
0120 }
0121
0122 Component {
0123 id: historyDelegate
0124 Kirigami.SwipeListItem {
0125 id: delegate
0126 readonly property var sourceModel: ListView.view.model
0127 text: model.location.name
0128 contentItem: QQC2.Label {
0129 text: model.location.name
0130 elide: Text.ElideRight
0131 Accessible.ignored: true
0132 }
0133 actions: [
0134 Kirigami.Action {
0135 icon.name: "edit-delete"
0136 text: i18n("Remove history entry")
0137 onTriggered: {
0138 sourceModel.removeRows(model.index, 1)
0139 }
0140 }
0141 ]
0142 onClicked: {
0143 root.location = model.location;
0144 locationHistoryModel.addLocation(model.location);
0145 applicationWindow().pageStack.goBack();
0146 }
0147 Accessible.onPressAction: delegate.clicked()
0148 }
0149 }
0150
0151 Component {
0152 id: queryResultDelegate
0153 QQC2.ItemDelegate {
0154 id: delegate
0155 text: model.location.name
0156 width: ListView.view.width
0157 contentItem: Kirigami.TitleSubtitle {
0158 title: model.location.name
0159 }
0160 onClicked: {
0161 root.location = model.location
0162 locationHistoryModel.addLocation(model.location);
0163 applicationWindow().pageStack.goBack();
0164 queryTextField.clear();
0165 }
0166 Accessible.onPressAction: delegate.clicked()
0167 }
0168 }
0169
0170 ListView {
0171 id: locationView
0172 model: queryTextField.text === "" ? historySortModel : locationQueryModel
0173 delegate: queryTextField.text === "" ? historyDelegate : queryResultDelegate
0174
0175 QQC2.BusyIndicator {
0176 anchors.centerIn: parent
0177 running: locationQueryModel.loading
0178 }
0179
0180 QQC2.Label {
0181 anchors.centerIn: parent
0182 width: parent.width
0183 text: locationQueryModel.errorMessage
0184 color: Kirigami.Theme.negativeTextColor
0185 wrapMode: Text.Wrap
0186 }
0187
0188 Kirigami.PlaceholderMessage {
0189 text: i18n("No locations found")
0190 visible: locationView.count === 0 && !locationQueryModel.loading && queryTextField !== ""
0191 anchors.centerIn: parent
0192 }
0193 }
0194 }