Warning, /utilities/kweather/src/qml/locationslist/LocationsListView.qml is written in an unsupported language. File is not indexed.
0001 /* 0002 * SPDX-FileCopyrightText: 2020 Han Young <hanyoung@protonmail.com> 0003 * SPDX-FileCopyrightText: 2020-2022 Devin Lin <espidev@gmail.com> 0004 * SPDX-FileCopyrightText: 2021 Nicolas Fella <nicolas.fella@gmx.de> 0005 * 0006 * SPDX-License-Identifier: GPL-2.0-or-later 0007 */ 0008 0009 import QtQuick 0010 import QtQuick.Controls 0011 import QtQuick.Layouts 0012 import QtQml.Models 0013 0014 import org.kde.kirigami as Kirigami 0015 0016 import org.kde.kweather 0017 0018 import org.kde.kweather.components 0019 0020 ListView { 0021 id: root 0022 0023 signal closeRequested() 0024 0025 DelegateModel { 0026 id: visualModel 0027 model: WeatherLocationListModel 0028 delegate: delegateComponent 0029 } 0030 0031 model: visualModel 0032 0033 reuseItems: true 0034 currentIndex: -1 // no default highlight 0035 0036 add: Transition { 0037 NumberAnimation { property: "opacity"; from: 0; to: 1.0; duration: Kirigami.Units.shortDuration } 0038 } 0039 remove: Transition { 0040 NumberAnimation { property: "opacity"; from: 0; to: 1.0; duration: Kirigami.Units.shortDuration } 0041 } 0042 displaced: Transition { 0043 NumberAnimation { properties: "x,y"; duration: Kirigami.Units.longDuration; easing.type: Easing.InOutQuad} 0044 } 0045 moveDisplaced: Transition { 0046 YAnimator { 0047 duration: Kirigami.Units.longDuration 0048 easing.type: Easing.InOutQuad 0049 } 0050 } 0051 0052 Connections { 0053 target: WeatherLocationListModel 0054 function onNetworkErrorCreating() { 0055 showPassiveNotification(i18n("Unable to fetch timezone information")); 0056 } 0057 } 0058 0059 Kirigami.PlaceholderMessage { 0060 anchors.centerIn: parent 0061 anchors.left: parent.left 0062 anchors.right: parent.right 0063 anchors.margins: Kirigami.Units.largeSpacing 0064 0065 icon.name: "globe" 0066 text: i18n("Add a location") 0067 visible: root.count == 0 0068 0069 helpfulAction: Kirigami.Action { 0070 icon.name: "list-add" 0071 text: i18n("Add Location") 0072 onTriggered: applicationWindow().openAddLocation() 0073 } 0074 } 0075 0076 Component { 0077 id: delegateComponent 0078 0079 Item { 0080 id: dragParent 0081 width: listItem.width 0082 height: listItem.height 0083 0084 property int visualIndex: DelegateModel.itemsIndex 0085 property bool held: false // whether it is being dragged 0086 z: held ? 1 : 0 0087 0088 // logic for receiving drag events 0089 DropArea { 0090 anchors.fill: parent 0091 0092 onEntered: (drag) => { 0093 let from = drag.source.visualIndex; 0094 let to = dragParent.visualIndex; 0095 0096 if (from !== undefined && to !== undefined && from !== to) { 0097 visualModel.items.move(from, to); 0098 WeatherLocationListModel.move(from, to); 0099 } 0100 } 0101 } 0102 0103 ListDelegate { 0104 id: listItem 0105 width: root.width 0106 0107 leftPadding: Kirigami.Units.largeSpacing 0108 rightPadding: Kirigami.Units.largeSpacing 0109 topPadding: Kirigami.Units.largeSpacing 0110 bottomPadding: Kirigami.Units.largeSpacing 0111 0112 onClicked: { 0113 root.closeRequested(); 0114 applicationWindow().switchToPage(applicationWindow().getPage("Forecast"), 0); 0115 applicationWindow().getPage("Forecast").switchPageIndex(index); 0116 } 0117 0118 function deleteItem() { 0119 // if there are no locations left 0120 if (WeatherLocationListModel.count === 1) { 0121 root.closeRequested(); 0122 } 0123 WeatherLocationListModel.remove(index); 0124 } 0125 0126 // drag logic 0127 Drag.active: dragParent.held 0128 Drag.source: dragHandle 0129 Drag.hotSpot.x: width / 2 0130 Drag.hotSpot.y: height / 2 0131 0132 // remove anchors when dragging 0133 anchors.horizontalCenter: parent.horizontalCenter 0134 anchors.verticalCenter: parent.verticalCenter 0135 states: [ 0136 State { 0137 when: dragHandle.drag.active 0138 ParentChange { 0139 target: listItem 0140 parent: root 0141 } 0142 0143 AnchorChanges { 0144 target: listItem 0145 anchors.horizontalCenter: undefined 0146 anchors.verticalCenter: undefined 0147 } 0148 } 0149 ] 0150 0151 // list delegate contents 0152 contentItem: RowLayout { 0153 spacing: 0 0154 0155 // handle for desktop users to drag 0156 MouseArea { 0157 id: dragHandle 0158 implicitWidth: Kirigami.Units.iconSizes.smallMedium 0159 implicitHeight: Kirigami.Units.iconSizes.smallMedium 0160 cursorShape: pressed ? Qt.ClosedHandCursor : Qt.OpenHandCursor 0161 preventStealing: true 0162 0163 property int visualIndex: dragParent.visualIndex 0164 0165 drag.target: dragParent.held ? listItem : undefined 0166 drag.axis: Drag.YAxis 0167 0168 onPressed: dragParent.held = true; 0169 onReleased: dragParent.held = false; 0170 0171 Kirigami.Icon { 0172 anchors.fill: parent 0173 source: "handle-sort" 0174 opacity: dragHandle.pressed || (!Kirigami.Settings.tabletMode && dragHandle.hovered) ? 1 : 0.6 0175 } 0176 } 0177 0178 // weather icon and temperature 0179 ColumnLayout { 0180 Layout.leftMargin: Kirigami.Units.largeSpacing * 2 0181 Layout.rightMargin: Kirigami.Units.largeSpacing * 2 0182 spacing: Kirigami.Units.smallSpacing 0183 Kirigami.Icon { 0184 Layout.alignment: Qt.AlignHCenter 0185 source: model.location.hourForecasts[0] ? model.location.hourForecasts[0].weatherIcon : "weather-none-available" 0186 Layout.maximumHeight: Kirigami.Units.iconSizes.sizeForLabels * 2 0187 Layout.preferredWidth: height 0188 Layout.preferredHeight: Kirigami.Units.iconSizes.sizeForLabels * 2 0189 } 0190 Label { 0191 Layout.alignment: Qt.AlignHCenter 0192 font.pointSize: Kirigami.Theme.defaultFont.pointSize * 1.3 0193 text: Formatter.formatTemperatureRounded(model.location.hourForecasts[0].temperature, settingsModel.temperatureUnits) 0194 } 0195 } 0196 0197 // location name 0198 Kirigami.Heading { 0199 Layout.alignment: Qt.AlignLeft 0200 Layout.fillWidth: true 0201 0202 level: 2 0203 text: model.location.name 0204 elide: Text.ElideRight 0205 maximumLineCount: 2 0206 wrapMode: Text.Wrap 0207 } 0208 0209 ToolButton { 0210 Layout.alignment: Qt.AlignVCenter | Qt.AlignRight 0211 Layout.leftMargin: Kirigami.Units.smallSpacing 0212 0213 icon.name: "delete" 0214 text: i18n("Delete") 0215 onClicked: listItem.deleteItem(); 0216 display: AbstractButton.IconOnly 0217 0218 ToolTip.delay: Kirigami.Units.toolTipDelay 0219 ToolTip.timeout: 5000 0220 ToolTip.visible: Kirigami.Settings.tabletMode ? pressed : hovered 0221 ToolTip.text: text 0222 } 0223 } 0224 } 0225 } 0226 } 0227 0228 delegate: delegateComponent 0229 }