Warning, /education/marble/src/apps/marble-maps/Search.qml is written in an unsupported language. File is not indexed.
0001 // SPDX-License-Identifier: LGPL-2.1-or-later
0002 //
0003 // SPDX-FileCopyrightText: 2015 Gábor Péterffy <peterffy95@gmail.com>
0004 //
0005
0006 import QtQuick 2.7
0007 import QtQuick.Controls 2.0
0008 import QtQuick.Window 2.2
0009
0010 import org.kde.marble 0.20
0011
0012 Item {
0013 id: root
0014
0015 property var marbleQuickItem: null
0016
0017 signal itemSelected(var suggestedPlacemark)
0018 signal menuButtonClicked()
0019 readonly property alias searchResultPlacemark: backend.selectedPlacemark
0020 readonly property alias searchResultsVisible: searchResults.visible
0021
0022 onVisibleChanged: {
0023 if( !visible ) {
0024 searchResults.visible = false;
0025 searchField.query = "";
0026 }
0027 }
0028
0029 SystemPalette {
0030 id: palette
0031 colorGroup: SystemPalette.Active
0032 }
0033
0034 SystemPalette {
0035 id: paletteDisabled
0036 colorGroup: SystemPalette.Disabled
0037 }
0038
0039 SearchResults {
0040 id: searchResults
0041 anchors {
0042 top: searchField.bottom
0043 left: searchField.left
0044 }
0045 width: searchField.width
0046 height: delegateHeight * Math.min(10,count)
0047
0048 visible: false
0049 onItemSelected: {
0050 backend.setSelectedPlacemark(index);
0051 root.itemSelected(backend.selectedPlacemark);
0052 searchResults.visible = false;
0053 }
0054 }
0055
0056 Rectangle {
0057 id: background
0058 visible: searchField.hasFocus && searchField.query === ""
0059 anchors.top: searchField.bottom
0060 anchors.left: searchField.left
0061 width: searchField.width
0062 height: childrenRect.height
0063 color: palette.base
0064
0065 property int delegateHeight: 0
0066
0067 property double itemSpacing: Screen.pixelDensity * 1
0068
0069 Column {
0070 anchors.top: parent.top
0071 anchors.left: parent.left
0072 anchors.right: parent.right
0073 spacing: background.itemSpacing
0074
0075 ListView {
0076 id: bookmarksView
0077 anchors.left: parent.left
0078 anchors.right: parent.right
0079 height: background.delegateHeight * Math.min(6, model.count) + 2 * background.itemSpacing
0080 clip: true
0081 ScrollIndicator.vertical: ScrollIndicator { }
0082
0083 model: bookmarks.model
0084
0085 MouseArea {
0086 anchors.bottom: parent.bottom
0087 height: 2 * background.itemSpacing
0088 width: parent.width
0089 visible: bookmarks.model.count <= 6
0090 onClicked: {
0091 app.selectedPlacemark = bookmarks.placemark(bookmarks.model.count - 1)
0092 itemSelected(bookmarks.placemark(bookmarks.model.count - 1))
0093 marbleMaps.centerOn(selectedPlacemark.longitude, selectedPlacemark.latitude)
0094 dialogLoader.focus = true
0095 }
0096 }
0097
0098 delegate: Row {
0099 width: bookmarksView.width
0100 height: background.itemSpacing + Math.max(bookmarkIcon.height, bookmarkText.height)
0101 spacing: background.itemSpacing
0102
0103 leftPadding: 10
0104 rightPadding: 10
0105
0106 Image {
0107 id: bookmarkIcon
0108 anchors.verticalCenter: parent.verticalCenter
0109 source: iconPath.substr(0,1) === '/' ? "file://" + iconPath : iconPath
0110 width: Screen.pixelDensity * 4
0111 height: width
0112 sourceSize.width: width
0113 sourceSize.height: height
0114 }
0115
0116 Text {
0117 id: bookmarkText
0118 anchors.verticalCenter: parent.verticalCenter
0119 anchors.leftMargin: Screen.pixelDensity * 2
0120 width: bookmarksView.width - bookmarksView.spacing - bookmarkIcon.width
0121 text: display
0122 font.pointSize: 14
0123 color: palette.text
0124 elide: Text.ElideMiddle
0125
0126 MouseArea {
0127 anchors.fill: parent
0128 onClicked: {
0129 bookmarksView.currentIndex = index
0130 app.selectedPlacemark = bookmarks.placemark(index);
0131 itemSelected(bookmarks.placemark(index))
0132 marbleMaps.centerOn(selectedPlacemark.longitude, selectedPlacemark.latitude)
0133 dialogLoader.focus = true
0134 }
0135 }
0136 }
0137
0138 onHeightChanged: {
0139 if( background.delegateHeight !== height ) {
0140 background.delegateHeight = height;
0141 }
0142 }
0143 }
0144 }
0145
0146 Row {
0147 visible: bookmarksView.model.count === 0
0148 width: parent.width
0149 anchors.left: parent.left
0150 anchors.right: parent.right
0151 spacing: Screen.pixelDensity * 2
0152 anchors.margins: Screen.pixelDensity * 2
0153
0154 Text {
0155 anchors.bottom: parent.bottom
0156 leftPadding: 10
0157 bottomPadding: 3
0158 width: parent.width - Screen.pixelDensity * 2 - emptyImage.width
0159 font.pointSize: 14
0160 color: paletteDisabled.text
0161 text: qsTr("Your bookmarks will appear here.")
0162
0163 wrapMode: Text.WrapAtWordBoundaryOrAnywhere
0164 elide: Text.ElideRight
0165 }
0166
0167 Image {
0168 id: emptyImage
0169 anchors.bottom: parent.bottom
0170 width: Screen.pixelDensity* 10
0171
0172 fillMode: Image.PreserveAspectFit
0173 source: "qrc:/konqi/books.png"
0174 }
0175 }
0176 }
0177 }
0178
0179 SearchBackend {
0180 id: backend
0181 marbleQuickItem: root.marbleQuickItem
0182 onSearchResultChanged: {
0183 searchResults.model = model;
0184 searchResults.visible = true;
0185 }
0186 onSearchFinished: searchField.busy = false
0187 }
0188
0189 SearchField {
0190 id: searchField
0191 width: parent.width
0192 anchors {
0193 top: parent.top
0194 left: parent.left
0195 right: parent.right
0196 }
0197 completionModel: backend.completionModel
0198 onSearchRequested: backend.search(query)
0199 onCompletionRequested: backend.setCompletionPrefix(query)
0200 onCleared: searchResults.visible = false
0201 onMenuButtonClicked: root.menuButtonClicked()
0202 }
0203
0204 Bookmarks {
0205 id: bookmarks
0206 map: root.marbleQuickItem
0207 }
0208 }