Warning, /plasma-bigscreen/calamares-bigscreen-branding/bigscreen/Map.qml is written in an unsupported language. File is not indexed.

0001 /* === This file is part of Calamares - <https://calamares.io> ===
0002  *
0003  *   SPDX-FileCopyrightText: 2020 Anke Boersma <demm@kaosx.us>
0004  *   SPDX-License-Identifier: GPL-3.0-or-later
0005  *
0006  *   Calamares is Free Software: see the License-Identifier above.
0007  *
0008  */
0009 
0010 import QtQuick 2.10
0011 import QtQuick.Controls 2.10
0012 import QtQuick.Window 2.14
0013 import QtQuick.Layouts 1.3
0014 
0015 import org.kde.kirigami 2.7 as Kirigami
0016 
0017 import QtLocation 5.14
0018 import QtPositioning 5.14
0019 
0020 Column {
0021     width: parent.width
0022 
0023     // These are used by the map query to initially center the
0024     //   map on the user's likely location. They are updated by
0025     //   getIp() which does a more accurate GeoIP lookup than
0026     //   the default one in Calamares
0027     property var cityName: ""
0028     property var countryName: ""
0029 
0030     /* This is an extra GeoIP lookup, which will find better-accuracy
0031      * location data for the user's IP, and then sets the current timezone
0032      * and map location. Call it from Component.onCompleted so that
0033      * it happens "on time" before the page is shown.
0034      */
0035     function getIpOnline() {
0036         var xhr = new XMLHttpRequest
0037 
0038         xhr.onreadystatechange = function() {
0039             if (xhr.readyState === XMLHttpRequest.DONE) {
0040                 var responseJSON = JSON.parse(xhr.responseText)
0041                 var tz = responseJSON.timezone
0042                 var ct = responseJSON.city
0043                 var cy = responseJSON.country
0044 
0045                 cityName = ct
0046                 countryName = cy
0047 
0048                 config.setCurrentLocation(tz)
0049             }
0050         }
0051 
0052         // Define the target of the request
0053         xhr.open("GET", "https://get.geojs.io/v1/ip/geo.json")
0054         // Execute the request
0055         xhr.send()
0056     }
0057 
0058     /* This is an "offline" GeoIP lookup -- it just follows what
0059      * Calamares itself has figured out with its GeoIP or configuration.
0060      * Call it from the **Component** onActivate() -- in localeq.qml --
0061      * so it happens as the page is shown.
0062      */
0063     function getIpOffline() {
0064         cityName = config.currentLocation.zone
0065         countryName = config.currentLocation.countryCode
0066     }
0067 
0068     /* This is an **accurate** TZ lookup method: it queries an
0069      * online service for the TZ at the given coordinates. It
0070      * requires an internet connection, though, and the distribution
0071      * will need to have an account with geonames to not hit the
0072      * daily query limit.
0073      *
0074      * See below, in MouseArea, for calling the right method.
0075      */
0076     function getTzOnline() {
0077         var xhr = new XMLHttpRequest
0078         var latC = map.center.latitude
0079         var lonC = map.center.longitude
0080 
0081         xhr.onreadystatechange = function() {
0082             if (xhr.readyState === XMLHttpRequest.DONE) {
0083                 var responseJSON = JSON.parse(xhr.responseText)
0084                 var tz2 = responseJSON.timezoneId
0085 
0086                 config.setCurrentLocation(tz2)
0087             }
0088         }
0089 
0090         console.log("Online lookup", latC, lonC)
0091         // Needs to move to localeq.conf, each distribution will need their own account
0092         xhr.open("GET", "http://api.geonames.org/timezoneJSON?lat=" + latC + "&lng=" + lonC + "&username=SOME_USERNAME")
0093         xhr.send()
0094     }
0095 
0096     /* This is a quick TZ lookup method: it uses the existing
0097      * Calamares "closest TZ" code, which has lots of caveats.
0098      *
0099      * See below, in MouseArea, for calling the right method.
0100      */
0101     function getTzOffline() {
0102         var latC = map.center.latitude
0103         var lonC = map.center.longitude
0104         var tz = config.zonesModel.lookup(latC, lonC)
0105         console.log("Offline lookup", latC, lonC)
0106         config.setCurrentLocation(tz.region, tz.zone)
0107     }
0108 
0109     Rectangle {
0110         width: parent.width
0111         height: parent.height / 1.28
0112 
0113         Plugin {
0114             id: mapPlugin
0115             name: "esri" // "esri", "here", "itemsoverlay", "mapbox", "mapboxgl",  "osm"
0116         }
0117 
0118         Map {
0119             id: map
0120             anchors.fill: parent
0121             plugin: mapPlugin
0122             activeMapType: supportedMapTypes[0]
0123             //might be desirable to set zoom level configurable?
0124             zoomLevel: 5
0125             bearing: 0
0126             tilt: 0
0127             copyrightsVisible : true
0128             fieldOfView : 0
0129 
0130             GeocodeModel {
0131                 id: geocodeModel
0132                 plugin: mapPlugin
0133                 autoUpdate: true
0134                 query: Address {
0135                     id: address
0136                     city: cityName
0137                     country: countryName
0138                 }
0139 
0140                 onLocationsChanged: {
0141                     if (count == 1) {
0142                         map.center.latitude = get(0).coordinate.latitude
0143                         map.center.longitude = get(0).coordinate.longitude
0144                     }
0145                 }
0146             }
0147 
0148             MapQuickItem {
0149                 id: marker
0150                 anchorPoint.x: image.width/4
0151                 anchorPoint.y: image.height
0152                 coordinate: QtPositioning.coordinate(
0153                     map.center.latitude,
0154                     map.center.longitude)
0155                 //coordinate: QtPositioning.coordinate(40.730610, -73.935242) // New York
0156 
0157                 sourceItem: Image {
0158                     id: image
0159                     width: 32
0160                     height: 32
0161                     source: "img/pin.svg"
0162                 }
0163             }
0164 
0165             MouseArea {
0166                 acceptedButtons: Qt.LeftButton
0167                 anchors.fill: map
0168                 hoverEnabled: true
0169                 property var coordinate: map.toCoordinate(Qt.point(mouseX, mouseY))
0170                 Label {
0171                     x: parent.mouseX - width -5
0172                     y: parent.mouseY - height - 5
0173                     text: "%1, %2".arg(
0174                         parent.coordinate.latitude).arg(parent.coordinate.longitude)
0175                 }
0176 
0177                 onClicked: {
0178                     marker.coordinate = coordinate
0179                     map.center.latitude = coordinate.latitude
0180                     map.center.longitude = coordinate.longitude
0181 
0182                     // Pick a TZ lookup method here (quick:offline, accurate:online)
0183                     getTzOffline();
0184                 }
0185             }
0186         }
0187 
0188         Column {
0189             anchors.bottom: parent.bottom
0190             anchors.right: parent.right
0191             anchors.bottomMargin: 5
0192             anchors.rightMargin: 10
0193 
0194             MouseArea {
0195                 width: 32
0196                 height:32
0197                 cursorShape: Qt.PointingHandCursor
0198                 Image {
0199                     source: "img/plus.png"
0200                     anchors.centerIn: parent
0201                     width: 36
0202                     height: 36
0203                 }
0204 
0205                 onClicked: map.zoomLevel++
0206             }
0207 
0208             MouseArea {
0209                 width: 32
0210                 height:32
0211                 cursorShape: Qt.PointingHandCursor
0212                 Image {
0213                     source: "img/minus.png"
0214                     anchors.centerIn: parent
0215                     width: 32
0216                     height: 32
0217                 }
0218 
0219                 onClicked: map.zoomLevel--
0220             }
0221         }
0222     }
0223 
0224     Rectangle {
0225         width: parent.width
0226         height: 100
0227         anchors.horizontalCenter: parent.horizontalCenter
0228 
0229         Item {
0230             id: location
0231             Kirigami.Theme.inherit: false
0232             Kirigami.Theme.colorSet: Kirigami.Theme.Complementary
0233             anchors.horizontalCenter: parent.horizontalCenter
0234 
0235             Rectangle {
0236                 anchors.centerIn: parent
0237                 width: 300
0238                 height: 30
0239                 color: Kirigami.Theme.backgroundColor
0240 
0241                 Text {
0242                     id: tzText
0243                     text: qsTr("Timezone: %1").arg(config.currentTimezoneName)
0244                     color: Kirigami.Theme.textColor
0245                     anchors.centerIn: parent
0246                 }
0247 
0248                 /* If you want an extra (and accurate) GeoIP lookup,
0249                  * enable this one and disable the offline lookup in
0250                  * onActivate().
0251                 Component.onCompleted: getIpOnline();
0252                  */
0253             }
0254         }
0255 
0256         Text {
0257             anchors.top: location.bottom
0258             anchors.topMargin: 20
0259             padding: 10
0260             width: parent.width
0261             wrapMode: Text.WordWrap
0262             horizontalAlignment: Text.AlignHCenter
0263             Kirigami.Theme.backgroundColor: Kirigami.Theme.backgroundColor
0264             text: qsTr("Please select your preferred location on the map so the installer can suggest the locale
0265             and timezone settings for you. You can fine-tune the suggested settings below. Search the map by dragging
0266             to move and using the +/- buttons to zoom in/out or use mouse scrolling for zooming.")
0267         }
0268     }
0269 }