diff --git a/src/apps/marble-maps/AboutDialog.qml b/src/apps/marble-maps/AboutDialog.qml
--- a/src/apps/marble-maps/AboutDialog.qml
+++ b/src/apps/marble-maps/AboutDialog.qml
@@ -13,144 +13,137 @@
import QtQuick.Window 2.2
import QtQuick.Layouts 1.1
-import org.kde.marble 0.20
-
-Item {
- id: root
- height: Screen.pixelDensity * 2 + Math.max(marbleText.height, devText.height)
-
- SystemPalette {
- id: palette
- colorGroup: SystemPalette.Active
- }
+import org.kde.kirigami 2.0 as Kirigami
- Rectangle {
- anchors.fill: parent
- color: palette.base
- }
+import org.kde.marble 0.20
- SwipeView {
- id: tabView
- currentIndex: pageIndicator.currentIndex
+Kirigami.Page {
+ Item {
+ id: root
anchors.fill: parent
+ height: Screen.pixelDensity * 2 + Math.max(marbleText.height, devText.height)
- Item {
- id: marbleItem
- Text {
- id: marbleText
- anchors.bottom: parent.bottom
- anchors.left: parent.left
- anchors.right: marbleLogo.left
- anchors.margins: Screen.pixelDensity * 1
- anchors.leftMargin: Screen.pixelDensity * 2
-
- wrapMode: Text.WrapAtWordBoundaryOrAnywhere
- text: qsTr("
Marble Maps
Find your way! Marble Maps brings the highly detailed OpenStreetMap to your mobile devices. It features a crisp, beautiful map with an intuitive user interface. It's open source, entirely based on free data and open standards and respects your privacy.
")
- onLinkActivated: Qt.openUrlExternally(link)
- }
-
- Image {
- id: marbleLogo
- anchors.right: parent.right
- anchors.bottom: parent.bottom
- anchors.margins: Screen.pixelDensity * 2
- height: 0.8 * marbleText.height
-
- fillMode: Image.PreserveAspectFit
- source: "qrc:/konqi/globe.png"
- }
+ SystemPalette {
+ id: palette
+ colorGroup: SystemPalette.Active
}
- Item {
- id: supportItem
- Text {
- id: groupText
- anchors.left: parent.left
- anchors.right: groupKonqi.left
- anchors.bottom: parent.bottom
- anchors.margins: Screen.pixelDensity * 1
- anchors.leftMargin: Screen.pixelDensity * 2
-
- wrapMode: Text.WrapAtWordBoundaryOrAnywhere
- text: qsTr("Support
Do you have a question? Want to file a suggestion for improvement? Please use the Marble forum to get in touch with fellow Marble users and developers. Further support channels are listed at marble.kde.org. We are looking forward to your feedback!
")
- onLinkActivated: Qt.openUrlExternally(link)
- }
-
- Image {
- id: groupKonqi
- anchors.right: parent.right
- anchors.bottom: parent.bottom
- anchors.bottomMargin: Screen.pixelDensity * 3
- anchors.rightMargin: Screen.pixelDensity * 2
- height: 0.8 * groupText.height
- fillMode: Image.PreserveAspectFit
- source: "qrc:/konqi/group.png"
+ SwipeView {
+ id: tabView
+ currentIndex: pageIndicator.currentIndex
+ anchors.fill: parent
+ spacing: 100
+
+ Item {
+ id: marbleItem
+ Text {
+ id: marbleText
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.margins: Screen.pixelDensity * 1
+ wrapMode: Text.WrapAtWordBoundaryOrAnywhere
+ text: qsTr("Marble Maps
Find your way! Marble Maps brings the highly detailed OpenStreetMap to your mobile devices. It features a crisp, beautiful map with an intuitive user interface. It's open source, entirely based on free data and open standards and respects your privacy.
")
+ onLinkActivated: Qt.openUrlExternally(link)
+ }
+
+ Image {
+ id: marbleLogo
+ anchors.right: parent.right
+ anchors.bottom: parent.bottom
+ anchors.margins: Screen.pixelDensity
+ height: marbleText.height
+
+ fillMode: Image.PreserveAspectFit
+ source: "qrc:/konqi/globe.png"
+ }
}
- }
- Item {
- id: devItem
- Text {
- id: devText
- anchors.left: parent.left
- anchors.right: devKonqi.left
- anchors.bottom: parent.bottom
- anchors.margins: Screen.pixelDensity * 1
- anchors.leftMargin: Screen.pixelDensity * 2
-
- wrapMode: Text.WrapAtWordBoundaryOrAnywhere
- text: qsTr("Development Team
The main developers of this app are Dennis Nienhüser, Torsten Rahn, Sanjiban Bairagya, Friedrich W. H. Kossebau, Gábor Péterffy and Mikhail Ivchenko. They are part of more than 200 developers who already contributed to the Marble project. Contact us via marble-devel@kde.org.
")
- onLinkActivated: Qt.openUrlExternally(link)
+ Item {
+ id: supportItem
+ Text {
+ id: groupText
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.margins: Screen.pixelDensity * 1
+
+ wrapMode: Text.WrapAtWordBoundaryOrAnywhere
+ text: qsTr("Support
Do you have a question? Want to file a suggestion for improvement? Please use the Marble forum to get in touch with fellow Marble users and developers. Further support channels are listed at marble.kde.org. We are looking forward to your feedback!
")
+ onLinkActivated: Qt.openUrlExternally(link)
+ }
+
+ Image {
+ id: groupKonqi
+ anchors.right: parent.right
+ anchors.bottom: parent.bottom
+ anchors.bottomMargin: Screen.pixelDensity * 3
+ anchors.rightMargin: Screen.pixelDensity * 2
+ height: groupText.height
+
+ fillMode: Image.PreserveAspectFit
+ source: "qrc:/konqi/group.png"
+ }
}
-
- Image {
- id: devKonqi
- anchors.right: parent.right
- anchors.bottom: parent.bottom
- anchors.bottomMargin: Screen.pixelDensity * 3
- anchors.rightMargin: Screen.pixelDensity * 2
- height: 0.8 * devText.height
-
- fillMode: Image.PreserveAspectFit
- source: "qrc:/konqi/app-dev.png"
+ Item {
+ id: devItem
+ Text {
+ id: devText
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.margins: Screen.pixelDensity * 1
+
+ wrapMode: Text.WrapAtWordBoundaryOrAnywhere
+ text: qsTr("Development Team
The main developers of this app are Dennis Nienhüser, Torsten Rahn, Sanjiban Bairagya, Friedrich W. H. Kossebau, Gábor Péterffy and Mikhail Ivchenko. They are part of more than 200 developers who already contributed to the Marble project.
Contact us via marble-devel@kde.org.
")
+ onLinkActivated: Qt.openUrlExternally(link)
+ }
+
+ Image {
+ id: devKonqi
+ anchors.right: parent.right
+ anchors.bottom: parent.bottom
+ anchors.bottomMargin: Screen.pixelDensity * 3
+ anchors.rightMargin: Screen.pixelDensity * 2
+ height: devText.height
+
+ fillMode: Image.PreserveAspectFit
+ source: "qrc:/konqi/app-dev.png"
+ }
}
- }
- Item {
- id: attributionItem
- Text {
- id: attributionText
- anchors.left: parent.left
- anchors.right: devQtKonqi.left
- anchors.bottom: parent.bottom
- anchors.margins: Screen.pixelDensity * 1
- anchors.leftMargin: Screen.pixelDensity * 2
-
- wrapMode: Text.WrapAtWordBoundaryOrAnywhere
- width: parent.width
- text: qsTr("Attribution
The map is based on data from the OpenStreetMap project, available under the Open Database License. Additionally public domain data from the Natural Earth project is used. The map style is influenced by and uses icons from OpenStreetMap Carto (CC0 Public Domain).
")
- onLinkActivated: Qt.openUrlExternally(link)
- }
-
- Image {
- id: devQtKonqi
- anchors.right: parent.right
- anchors.bottom: parent.bottom
- anchors.bottomMargin: Screen.pixelDensity * 3
- anchors.rightMargin: Screen.pixelDensity * 2
- height: 0.8 * attributionText.height
-
- fillMode: Image.PreserveAspectFit
- source: "qrc:/konqi/dev-qt.png"
+ Item {
+ id: attributionItem
+ Text {
+ id: attributionText
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.margins: Screen.pixelDensity * 1
+ anchors.leftMargin: Screen.pixelDensity * 2
+
+ wrapMode: Text.WrapAtWordBoundaryOrAnywhere
+ width: parent.width
+ text: qsTr("Attribution
The map is based on data from the OpenStreetMap project, available under the Open Database License. Additionally public domain data from the Natural Earth project is used. The map style is influenced by and uses icons from OpenStreetMap Carto (CC0 Public Domain).
")
+ onLinkActivated: Qt.openUrlExternally(link)
+ }
+
+ Image {
+ id: devQtKonqi
+ anchors.right: parent.right
+ anchors.bottom: parent.bottom
+ anchors.bottomMargin: Screen.pixelDensity * 3
+ anchors.rightMargin: Screen.pixelDensity * 2
+ height: attributionText.height
+
+ fillMode: Image.PreserveAspectFit
+ source: "qrc:/konqi/dev-qt.png"
+ }
}
}
- }
- PageIndicator {
- id: pageIndicator
- interactive: true
- count: tabView.count
- currentIndex: tabView.currentIndex
+ PageIndicator {
+ id: pageIndicator
+ interactive: true
+ count: tabView.count
+ currentIndex: tabView.currentIndex
- anchors.bottom: parent.bottom
- anchors.horizontalCenter: parent.horizontalCenter
+ anchors.bottom: parent.bottom
+ anchors.horizontalCenter: parent.horizontalCenter
+ }
}
}
diff --git a/src/apps/marble-maps/FlatButton.qml b/src/apps/marble-maps/FlatButton.qml
--- a/src/apps/marble-maps/FlatButton.qml
+++ b/src/apps/marble-maps/FlatButton.qml
@@ -25,11 +25,12 @@
style: ButtonStyle {
background: Rectangle {
anchors.fill: parent
- color: root.pressed ? palette.highlight : palette.base
+ color: "transparent"
Image {
id: icon
anchors.fill: parent
source: root.imageSource
+ smooth: true
}
}
}
diff --git a/src/apps/marble-maps/MainScreen.qml b/src/apps/marble-maps/MainScreen.qml
--- a/src/apps/marble-maps/MainScreen.qml
+++ b/src/apps/marble-maps/MainScreen.qml
@@ -10,10 +10,11 @@
// Copyright 2015 Mikhail Ivchenko
//
-
-import QtQuick 2.3
-import QtQuick.Controls 2.0
+import QtQuick 2.7
+import QtQuick.Controls 2.2
import QtQuick.Window 2.2
+import QtQuick.Controls.Material 2.0
+
import org.kde.marble 0.20
import org.kde.kirigami 2.0 as Kirigami
@@ -26,6 +27,9 @@
width: 600
height: 400
+ Material.theme: Material.Light
+ Material.accent: Material.Blue
+
color: "#f9f9f9" // Keep the background white while no dialog is loaded
property alias state: stateTracker.state
@@ -50,6 +54,9 @@
if (!selectedPlacemark) {
app.state = "none"
}
+ else {
+ bookmarkButton.bookmark = bookmarks.isBookmark(selectedPlacemark.longitude, selectedPlacemark.latitude)
+ }
}
SystemPalette{
@@ -61,6 +68,35 @@
id: settings
}
+
+ property bool aboutToQuit: false
+
+ onClosing: {
+ if (app.aboutToQuit === true) {
+ close.accepted = true // we will quit
+ return
+ } else if (sidePanel.drawerOpen) {
+ sidePanel.close()
+ } else if (pageStack.depth > 1) {
+ pageStack.pop()
+ } else if (navigationManager.visible) {
+ navigationManager.visible = false
+ } else if (app.state !== "none") {
+ app.state = "none"
+ }
+ else if(search.searchResultsVisible.visible === true && !sidePanel.drawerOpen){
+ search.searchResultsVisible = false
+ }
+ else {
+ if(search.searchResultsVisible === true){
+ search.searchResultsVisible = false
+ }
+ app.aboutToQuit = true
+ quitHelper.visible = true
+ }
+ close.accepted = false
+ }
+
globalDrawer: Kirigami.GlobalDrawer {
id: sidePanel
title: "Settings"
@@ -143,6 +179,13 @@
sidePanel.close()
app.pageStack.push("qrc:///Options.qml")
}
+ },
+ Kirigami.Action {
+ text: "Routing"
+ iconName: "qrc:///material/directions.svg"
+ onTriggered: {
+ app.state = "route"
+ }
}
]
@@ -166,446 +209,499 @@
bottomPadding: 0
title: "Marble Maps"
- Item {
- id: mapItem
- anchors {
- top: parent.top
- topMargin: mapOffset
- left: parent.left
- right: parent.right
- }
-
- height: !dialogExpanded
- ? parent.height
- : parent.height + animatedMargin
+ Item {
+ id: mapItem
- PinchArea {
- anchors.fill: parent
- enabled: true
+ width: parent.width
+ height: dialogLoader.height === 0 ? parent.height - bottomMenu.height : parent.height - dialogLoader.height - bottomMenu.height
- onPinchStarted: marbleMaps.handlePinchStarted(pinch.center)
- onPinchFinished: marbleMaps.handlePinchFinished(pinch.center)
- onPinchUpdated: marbleMaps.handlePinchUpdated(pinch.center, pinch.scale);
- MarbleMaps {
- id: marbleMaps
+ PinchArea {
+ anchors.fill: parent
+ enabled: true
- property string currentPositionProvider: "QtPositioning"
- property bool wlanOnly: false
- property bool smallZoom : radius < 2 * Math.max(app.width, app.height)
+ onPinchStarted: marbleMaps.handlePinchStarted(pinch.center)
+ onPinchFinished: marbleMaps.handlePinchFinished(pinch.center)
+ onPinchUpdated: marbleMaps.handlePinchUpdated(pinch.center, pinch.scale);
- anchors.fill: parent
+ MarbleMaps {
+ id: marbleMaps
- visible: true
+ property string currentPositionProvider: "QtPositioning"
+ property bool wlanOnly: false
+ property bool smallZoom : radius < 2 * Math.max(app.width, app.height)
- // Theme settings.
- projection: smallZoom ? MarbleItem.Spherical : MarbleItem.Mercator
- mapThemeId: settings.value("MarbleMaps", "mapThemeId", "earth/vectorosm/vectorosm.dgml")
-
- // Visibility of layers/plugins.
- showFrameRate: false
- showAtmosphere: smallZoom
- showCompass: false
- showClouds: false
- showCrosshairs: false
- showGrid: smallZoom
- showOverviewMap: false
- showOtherPlaces: false
- showScaleBar: false
- showBackground: smallZoom
- showPublicTransport: settings.value("MarbleMaps", "showPublicTransport", "false") === "true"
- positionProvider: suspended ? "" : currentPositionProvider
- keepScreenOn: !suspended && navigationManager.guidanceModeEnabled
- showPositionMarker: false
- animationViewContext: dialogAnimation.running
-
- placemarkDelegate: Image {
- id: balloon
- property int xPos: 0
- property int yPos: 0
- property real animationOffset: 0
- property var placemark: null
- x: xPos - 0.5 * width
- y: yPos - height - 30 * Screen.pixelDensity * animationOffset
- opacity: 1.0 - animationOffset
+ anchors.fill: parent
- Connections {
- target: app
- onSelectedPlacemarkChanged: balloonAnimation.restart()
- }
+ visible: true
+
+ // Theme settings.
+ projection: smallZoom ? MarbleItem.Spherical : MarbleItem.Mercator
+ mapThemeId: settings.value("MarbleMaps", "mapThemeId", "earth/vectorosm/vectorosm.dgml")
+
+ // Visibility of layers/plugins.
+ showFrameRate: false
+ showAtmosphere: smallZoom
+ showCompass: false
+ showClouds: false
+ showCrosshairs: false
+ showGrid: smallZoom
+ showOverviewMap: false
+ showOtherPlaces: false
+ showScaleBar: false
+ showBackground: smallZoom
+ showPublicTransport: settings.value("MarbleMaps", "showPublicTransport", "false") === "true"
+ positionProvider: suspended ? "" : currentPositionProvider
+ keepScreenOn: !suspended && navigationManager.guidanceModeEnabled
+ showPositionMarker: false
+ animationViewContext: dialogAnimation.running
+
+ placemarkDelegate: Image {
+ id: balloon
+ property int xPos: 0
+ property int yPos: 0
+ property real animationOffset: 0
+ property var placemark: null
+ x: xPos - 0.5 * width
+ y: yPos - height - 30 * Screen.pixelDensity * animationOffset
+ opacity: 1.0 - animationOffset
+
+ Connections {
+ target: app
+ onSelectedPlacemarkChanged: balloonAnimation.restart()
+ }
- NumberAnimation {
- id: balloonAnimation
- target: balloon
- property: "animationOffset"
- from: 1
- to: 0
- duration: 1000
- easing.type: Easing.OutBounce
- }
+ NumberAnimation {
+ id: balloonAnimation
+ target: balloon
+ property: "animationOffset"
+ from: 1
+ to: 0
+ duration: 1000
+ easing.type: Easing.OutBounce
+ }
- width: Screen.pixelDensity*6
- height: width
- source: "qrc:///ic_place.png"
- onPlacemarkChanged: {
- app.selectedPlacemark = placemark
- if (placemark) {
- app.state = "place"
- } else {
- app.state = "none"
+ width: Screen.pixelDensity*6
+ height: width
+ source: "qrc:///ic_place.png"
+ onPlacemarkChanged: {
+ app.selectedPlacemark = placemark
+ if (placemark) {
+ app.state = "place"
+ } else {
+ app.state = "none"
+ }
}
}
- }
- onPositionAvailableChanged: {
- updateIndicator();
- }
- onPositionVisibleChanged: {
- updateIndicator();
- }
- onVisibleLatLonAltBoxChanged: {
- !panningDetectionTimer.restart();
- updateIndicator();
- }
- onCurrentPositionChanged: {
- updateIndicator();
- }
+ onPositionAvailableChanged: {
+ updateIndicator();
+ }
+ onPositionVisibleChanged: {
+ updateIndicator();
+ }
+ onVisibleLatLonAltBoxChanged: {
+ !panningDetectionTimer.restart();
+ updateIndicator();
+ }
+ onCurrentPositionChanged: {
+ updateIndicator();
+ }
- onZoomChanged: {
- zoomDetectionTimer.restart()
- }
+ onZoomChanged: {
+ zoomDetectionTimer.restart()
+ }
- Component.onCompleted: {
- setPluginSetting("coordinate-grid", "gridColor", "#999999");
- setPluginSetting("coordinate-grid", "tropicsColor", "#888888");
- setPluginSetting("coordinate-grid", "equatorColor", "#777777");
- setPluginSetting("coordinate-grid", "primaryLabels", "false");
- setPluginSetting("coordinate-grid", "secondaryLabels", "false");
- marbleMaps.loadSettings()
- }
- Component.onDestruction: marbleMaps.writeSettings()
+ Component.onCompleted: {
+ setPluginSetting("coordinate-grid", "gridColor", "#999999");
+ setPluginSetting("coordinate-grid", "tropicsColor", "#888888");
+ setPluginSetting("coordinate-grid", "equatorColor", "#777777");
+ setPluginSetting("coordinate-grid", "primaryLabels", "false");
+ setPluginSetting("coordinate-grid", "secondaryLabels", "false");
+ marbleMaps.loadSettings()
+ }
+ Component.onDestruction: marbleMaps.writeSettings()
- Connections {
- target: Qt.application
- onStateChanged: {
- if (Qt.application.state === Qt.ApplicationInactive || Qt.application.state === Qt.ApplicationSuspended) {
- marbleMaps.writeSettings()
+ Connections {
+ target: Qt.application
+ onStateChanged: {
+ if (Qt.application.state === Qt.ApplicationInactive || Qt.application.state === Qt.ApplicationSuspended) {
+ marbleMaps.writeSettings()
+ }
}
}
- }
- function updateIndicator() {
- if ( !positionVisible && positionAvailable ) {
- zoomToPositionButton.updateIndicator();
+ function updateIndicator() {
+ if ( !positionVisible && positionAvailable ) {
+ zoomToPositionButton.updateIndicator();
+ }
}
- }
- RoutingManager {
- id: routingManager
- anchors.fill: parent
- marbleItem: marbleMaps
- visible: hasRoute
-
- function addToRoute() {
- ensureRouteHasDeparture()
- routingManager.addViaByPlacemarkAtIndex(routingManager.waypointCount(), selectedPlacemark)
- routingManager.clearSearchResultPlacemarks()
- selectedPlacemark = null
- app.state = "route"
- }
- function ensureRouteHasDeparture() {
- if (routingManager.routeRequestModel.count === 0) {
- if (marbleMaps.positionAvailable) {
- routingManager.addViaByPlacemark(marbleMaps.currentPosition)
+ RoutingManager {
+ id: routingManager
+ anchors.fill: parent
+ marbleItem: marbleMaps
+ visible: hasRoute
+
+ function addToRoute() {
+ ensureRouteHasDeparture()
+ routingManager.addViaByPlacemarkAtIndex(routingManager.waypointCount(), selectedPlacemark)
+ routingManager.clearSearchResultPlacemarks()
+ selectedPlacemark = null
+ app.state = "route"
+ }
+ function ensureRouteHasDeparture() {
+ if (routingManager.routeRequestModel.count === 0) {
+ if (marbleMaps.positionAvailable) {
+ routingManager.addViaByPlacemark(marbleMaps.currentPosition)
+ }
}
}
- }
- }
+ }
- Timer {
- id: zoomDetectionTimer
- interval: 1000
- }
- Timer {
- id: panningDetectionTimer
- interval: 1000
- }
+ Timer {
+ id: zoomDetectionTimer
+ interval: 1000
+ }
+ Timer {
+ id: panningDetectionTimer
+ interval: 1000
+ }
- PositionMarker {
- id: positionMarker
- x: navigationManager.snappedPositionMarkerScreenPosition.x - positionMarker.width / 2
- y: navigationManager.snappedPositionMarkerScreenPosition.y - positionMarker.height / 2
- angle: marbleMaps.angle
- visible: marbleMaps.positionAvailable && marbleMaps.positionVisible
- radius: navigationManager.screenAccuracy / 2
- showAccuracy: navigationManager.deviated
- allowRadiusAnimation: !zoomDetectionTimer.running
- allowPositionAnimation: !panningDetectionTimer.running
- speed: marbleMaps.speed
+ PositionMarker {
+ id: positionMarker
+ x: navigationManager.snappedPositionMarkerScreenPosition.x - positionMarker.width / 2
+ y: navigationManager.snappedPositionMarkerScreenPosition.y - positionMarker.height / 2
+ angle: marbleMaps.angle
+ visible: marbleMaps.positionAvailable && marbleMaps.positionVisible
+ radius: navigationManager.screenAccuracy / 2
+ showAccuracy: navigationManager.deviated
+ allowRadiusAnimation: !zoomDetectionTimer.running
+ allowPositionAnimation: !panningDetectionTimer.running
+ speed: marbleMaps.speed
+
+ MouseArea {
+ anchors.fill: parent
+ onPressed: app.state = "position"
+ }
+ }
MouseArea {
anchors.fill: parent
- onPressed: app.state = "position"
+ propagateComposedEvents: true
+ onPressed: {
+ marbleMaps.focus = true;
+ mouse.accepted = false;
+ }
}
+
+
}
- MouseArea {
- anchors.fill: parent
- propagateComposedEvents: true
- onPressed: {
- marbleMaps.focus = true;
- mouse.accepted = false;
- }
+ NavigationManager {
+ id: navigationManager
+ width: parent.width
+ height: parent.height
+ visible: false
+ marbleItem: marbleMaps
+ hasRoute: routingManager.hasRoute
}
+ }
+ BoxedText {
+ id: distanceIndicator
+ text: qsTr("%1 km").arg(zoomToPositionButton.distance < 10 ? zoomToPositionButton.distance.toFixed(1) : zoomToPositionButton.distance.toFixed(0))
+ anchors {
+ bottom: zoomToPositionButton.top
+ horizontalCenter: zoomToPositionButton.horizontalCenter
+ }
+ visible: marbleMaps.positionAvailable && !marbleMaps.positionVisible
}
- NavigationManager {
- id: navigationManager
- width: parent.width
- height: parent.height
- visible: false
- marbleItem: marbleMaps
- hasRoute: routingManager.hasRoute
- }
- }
+ PositionButton {
+ id: zoomToPositionButton
+ anchors {
+ right: parent.right
+ rightMargin: Screen.pixelDensity * 1
+ bottom: mapItem.bottom
+ bottomMargin: 10
+ }
- BoxedText {
- id: distanceIndicator
- text: qsTr("%1 km").arg(zoomToPositionButton.distance < 10 ? zoomToPositionButton.distance.toFixed(1) : zoomToPositionButton.distance.toFixed(0))
- anchors {
- bottom: zoomToPositionButton.top
- horizontalCenter: zoomToPositionButton.horizontalCenter
- }
+ enabled: marbleMaps.positionAvailable
- visible: marbleMaps.positionAvailable && !marbleMaps.positionVisible
- }
+ iconSource: marbleMaps.positionAvailable ? "qrc:///gps_fixed.png" : "qrc:///gps_not_fixed.png"
- PositionButton {
- id: zoomToPositionButton
- anchors {
- right: parent.right
- rightMargin: Screen.pixelDensity * 1
- bottom: routeEditorButton.top
- bottomMargin: 10
+ onClicked: marbleMaps.centerOnCurrentPosition()
+
+ property real distance: 0
+
+ function updateIndicator() {
+ var point = marbleMaps.mapFromItem(zoomToPositionButton, diameter * 0.5, diameter * 0.5);
+ distance = 0.001 * marbleMaps.distanceFromPointToCurrentLocation(point);
+ angle = marbleMaps.angleFromPointToCurrentLocation(point);
+ }
+
+ showDirection: marbleMaps.positionAvailable && !marbleMaps.positionVisible
}
+ }
- enabled: marbleMaps.positionAvailable
- iconSource: marbleMaps.positionAvailable ? "qrc:///gps_fixed.png" : "qrc:///gps_not_fixed.png"
+ Row {
+ id: bottomMenu
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.bottom: dialogLoader.top
+ width: parent.width
+ height: bottomMenu.visible ? routeEditorButton.height + Screen.pixelDensity * 2 : 0
+ anchors.topMargin: app.animatedMargin
+ visible: app.state === "place" || app.state === "route"
+
+ onVisibleChanged: bottomMenuAnimation.start()
+
+ NumberAnimation {
+ id: bottomMenuAnimation
+ target: bottomMenu
+ property: "y"
+ from: app.height - bottomMenu.height
+ to: 0
+ duration: 500
+ easing.type: Easing.InExpo
+ }
- onClicked: marbleMaps.centerOnCurrentPosition()
+ Item {
+ id: bottomMenuBackground
+ anchors.fill: parent
+ Rectangle {
+ color: Material.accent
+ anchors.fill : parent
+ }
+ }
- property real distance: 0
+ Row {
+ anchors.centerIn: parent
+ spacing: Kirigami.Units.gridUnit * 2
+
+ FlatButton {
+ id: routeEditorButton
+ property string currentProfileIcon: "qrc:///material/directions-car.svg"
+ height: Screen.pixelDensity * 6
+ width: height
+ enabled: app.state !== "route" || routingManager.hasRoute
+ imageSource: "qrc:///material/directions.svg"
+
+ onClicked: {
+ if (app.state === "route") {
+ app.state = "none"
+ navigationManager.visible = true
+ } else if (app.state === "place") {
+ app.state = "route"
+ routingManager.addToRoute()
+ } else {
+ app.state = "route"
+ navigationManager.visible = false
+ }
+ }
+ states: [
+ State {
+ name: ""
+ PropertyChanges { target: routeEditorButton; imageSource: "qrc:///material/directions.svg"; }
+ },
+ State {
+ name: "routingAction"
+ when: app.state === "route"
+ PropertyChanges { target: routeEditorButton; imageSource: "qrc:///material/navigation.svg"; }
+ },
+ State {
+ name: "placeAction"
+ when: app.state === "place"
+ PropertyChanges { target: routeEditorButton; imageSource: "qrc:///material/directions.svg" }
+ }
+ ]
+ }
- function updateIndicator() {
- var point = marbleMaps.mapFromItem(zoomToPositionButton, diameter * 0.5, diameter * 0.5);
- distance = 0.001 * marbleMaps.distanceFromPointToCurrentLocation(point);
- angle = marbleMaps.angleFromPointToCurrentLocation(point);
+ FlatButton {
+ id: bookmarkButton
+ anchors.verticalCenter: parent.verticalCenter
+ height: Screen.pixelDensity * 6
+ width: height
+ property bool bookmark: bookmarks.isBookmark(app.selectedPlacemark.longitude, app.selectedPlacemark.latitude)
+ enabled: app.state === "place"
+ visible: app.state === "place"
+ imageSource: bookmark ? "qrc:///material/star.svg" : "qrc:///material/star_border.svg"
+ onClicked: {
+ if (bookmarkButton.bookmark) {
+ bookmarks.removeBookmark(app.selectedPlacemark.longitude, app.selectedPlacemark.latitude)
+ } else {
+ bookmarks.addBookmark(app.selectedPlacemark, "Default")
+ }
+ bookmarkButton.bookmark = !bookmarkButton.bookmark
+ }
+ }
+ }
}
- showDirection: marbleMaps.positionAvailable && !marbleMaps.positionVisible
+
+ BorderImage {
+ anchors.top: mapItem.bottom
+ anchors.bottom: dialogLoader.bottom
+ anchors.right: parent.right
+ anchors.left: parent.left
+ anchors.margins: -14
+ border { top: 14; left: 14; right: 14; bottom: 14 }
+ source: "qrc:///border_shadow.png"
}
- CircularButton {
- id: routeEditorButton
+ Search {
+ id: search
+ anchors.fill: parent
+ marbleQuickItem: marbleMaps
+ visible: !navigationManager.visible
+
+ onItemSelected: {
+ if (routingManager) {
+ routingManager.addSearchResultAsPlacemark(suggestedPlacemark);
+ }
+ app.selectedPlacemark = suggestedPlacemark;
+ app.state = "place"
+ }
+ onMenuButtonClicked: sidePanel.open()
+ }
- property string currentProfileIcon: "qrc:///material/directions-car.svg"
+ Loader {
+ id: dialogLoader
+ focus: true
+ width: childrenRect.width
+ height : childrenRect.height
anchors {
- bottom: parent.bottom
- bottomMargin: Screen.pixelDensity * 4 - mapOffset
- horizontalCenter: zoomToPositionButton.horizontalCenter
+ left: parent.left
+ right: parent.right
+ top: parent.bottom
+ bottom: bottomMenu.top
+ topMargin: app.animatedMargin
+ bottomMargin: Kirigami.Units.gridUnits * 10
}
- enabled: app.state !== "route" || routingManager.hasRoute
+ NumberAnimation {
+ id: loaderAnimation
+ target: dialogLoader.item
+ property: "y"
+ from: dialogLoader.height === 0 ? app.height : app.height - dialogLoader.item.height
+ to: 0
+ duration: 500
+ easing.type: Easing.InExpo
+ }
- onClicked: {
- if (app.state === "route") {
- app.state = "none"
- navigationManager.visible = true
- } else if (app.state === "place") {
- app.state = "route"
- routingManager.addToRoute()
- } else {
- app.state = "route"
- navigationManager.visible = false
+ onLoaded: {
+ app.state != "none" ? loaderAnimation.running = true : loaderAnimation.running = false
+ if (app.state === "place") {
+ dialogLoader.item.map = marbleMaps
+ dialogLoader.item.placemark = app.selectedPlacemark
+ dialogLoader.item.showOsmTags = app.showOsmTags
+ dialogLoader.item.showAccessibility = sidePanel.showAccessibility
+ } else if (app.state === "route") {
+ item.routingManager = routingManager
+ item.routingProfile = routingManager.routingProfile
+ item.currentIndex = Qt.binding(function() { return app.currentWaypointIndex })
+ } else if (app.state == "position") {
+ dialogLoader.item.map = marbleMaps
+ dialogLoader.item.navigationManager = navigationManager
+ } else if (app.state == "none"){
+ dialogLoader.height = 0
}
}
- iconSource: "qrc:///material/directions.svg";
+
+ Connections {
+ target: dialogLoader.item
+ onCurrentProfileIconChanged: routeEditorButton.currentProfileIcon = dialogLoader.item.currentProfileIcon
+ ignoreUnknownSignals: true
+ }
+ }
+
+ Rectangle {
+ width: parent.width
+ color: Kirigami.Theme.textColor
+ opacity: 0.4
+ height: 1
+ anchors.bottom: dialogLoader.top
+ }
+
+ Item {
+ id: stateTracker
+ state: "none"
states: [
State {
- name: ""
- PropertyChanges { target: routeEditorButton; iconSource: "qrc:///material/directions.svg"; }
+ name: "none"
+ PropertyChanges { target: dialogLoader; source: "" }
+ },
+ State {
+ name: "position"
+ PropertyChanges { target: dialogLoader; source: "CurrentPosition.qml" }
},
State {
- name: "routingAction"
- when: app.state === "route"
- PropertyChanges { target: routeEditorButton; iconSource: "qrc:///material/navigation.svg"; }
+ name: "route"
+ PropertyChanges { target: dialogLoader; source: "RouteEditor.qml" }
},
State {
- name: "placeAction"
- when: app.state === "place"
- PropertyChanges { target: routeEditorButton; iconSource: currentProfileIcon }
+ name: "place"
+ PropertyChanges { target: dialogLoader; source: "PlacemarkDialog.qml" }
+ },
+ State {
+ name: "about"
+ PropertyChanges { target: dialogLoader; source: "" }
+ },
+ State {
+ name: "settings"
+ PropertyChanges { target: dialogLoader; source: "SettingsDialog.qml" }
+ },
+ State {
+ name: "developer"
+ PropertyChanges { target: dialogLoader; source: "DeveloperDialog.qml" }
+ },
+ State {
+ name: "options"
+ PropertyChanges { target: dialogLoader; source: "" }
+ },
+ State {
+ name: "bookmarks"
+ PropertyChanges { target: dialogLoader; source: "" }
}
]
}
- }
- Search {
- id: search
- anchors.fill: parent
- marbleQuickItem: marbleMaps
- visible: !navigationManager.visible
-
- onItemSelected: {
- if (routingManager) {
- routingManager.addSearchResultAsPlacemark(suggestedPlacemark);
+ BoxedText {
+ id: quitHelper
+ visible: false
+ text: qsTr("Press again to close.")
+ anchors.bottom: parent.bottom
+ anchors.bottomMargin: Screen.pixelDensity * 5
+ anchors.horizontalCenter: parent.horizontalCenter
+ onVisibleChanged: {
+ if (visible) {
+ quitTimer.restart()
+ }
}
- app.selectedPlacemark = suggestedPlacemark;
- app.state = "place"
- }
- onMenuButtonClicked: sidePanel.open()
- }
- Loader {
- id: dialogLoader
- focus: true
- width: childrenRect.width
- height : childrenRect.height
-
- anchors {
- left: parent.left
- right: parent.right
- top: parent.bottom
- topMargin: app.animatedMargin
- }
-
- onLoaded: {
- if (app.state === "place") {
- dialogLoader.item.map = marbleMaps
- dialogLoader.item.placemark = app.selectedPlacemark
- dialogLoader.item.showOsmTags = app.showOsmTags
- dialogLoader.item.showAccessibility = sidePanel.showAccessibility
- } else if (app.state === "route") {
- item.routingManager = routingManager
- item.routingProfile = routingManager.routingProfile
- item.currentIndex = Qt.binding(function() { return app.currentWaypointIndex })
- } else if (app.state == "position") {
- dialogLoader.item.map = marbleMaps
- dialogLoader.item.navigationManager = navigationManager
- }
- }
-
- Connections {
- target: dialogLoader.item
- onCurrentProfileIconChanged: routeEditorButton.currentProfileIcon = dialogLoader.item.currentProfileIcon
- ignoreUnknownSignals: true
- }
- }
-
- BorderImage {
- visible: app.state != "none"
- anchors.fill: dialogLoader
- anchors.margins: -14
- border { top: 14; left: 14; right: 14; bottom: 14 }
- source: "qrc:///border_shadow.png"
- }
-
- BoxedText {
- id: quitHelper
- visible: false
- text: qsTr("Press again to close.")
- anchors.bottom: parent.bottom
- anchors.bottomMargin: Screen.pixelDensity * 5
- anchors.horizontalCenter: parent.horizontalCenter
- onVisibleChanged: {
- if (visible) {
- quitTimer.restart()
+ Timer {
+ id: quitTimer
+ interval: 3000;
+ running: false;
+ repeat: false
+ onTriggered: {
+ app.aboutToQuit = false
+ quitHelper.visible = false
+ }
}
}
- Timer {
- id: quitTimer
- interval: 3000;
- running: false;
- repeat: false
- onTriggered: {
- app.aboutToQuit = false
- quitHelper.visible = false
- }
+ Bookmarks {
+ id: bookmarks
+ map: marbleMaps
}
}
-
- Item {
- id: stateTracker
-
- state: "none"
-
- states: [
- State {
- name: "none"
- PropertyChanges { target: dialogLoader; source: "" }
- },
- State {
- name: "position"
- PropertyChanges { target: dialogLoader; source: "CurrentPosition.qml" }
- },
- State {
- name: "route"
- PropertyChanges { target: dialogLoader; source: "RouteEditor.qml" }
- },
- State {
- name: "place"
- PropertyChanges { target: dialogLoader; source: "PlacemarkDialog.qml" }
- },
- State {
- name: "about"
- PropertyChanges { target: dialogLoader; source: "" }
- },
- State {
- name: "settings"
- PropertyChanges { target: dialogLoader; source: "SettingsDialog.qml" }
- },
- State {
- name: "developer"
- PropertyChanges { target: dialogLoader; source: "DeveloperDialog.qml" }
- },
- State {
- name: "options"
- PropertyChanges { target: dialogLoader; source: "" }
- },
- State {
- name: "bookmarks"
- PropertyChanges { target: dialogLoader; source: "" }
- }
- ]
- }
}
- property bool aboutToQuit: false
-
- onClosing: {
- if (app.aboutToQuit === true) {
- close.accepted = true // we will quit
- return
- } else if (navigationManager.visible) {
- navigationManager.visible = false
- } else if (sidePanel.drawerOpen) {
- sidePanel.close()
- } else if (pageStack.depth > 1) {
- pageStack.pop()
- }
- else if (app.state !== "none") {
- app.state = "none"
- } else {
- app.aboutToQuit = true
- quitHelper.visible = true
- }
- close.accepted = false
- }
-}
diff --git a/src/apps/marble-maps/MarbleMaps.qrc b/src/apps/marble-maps/MarbleMaps.qrc
--- a/src/apps/marble-maps/MarbleMaps.qrc
+++ b/src/apps/marble-maps/MarbleMaps.qrc
@@ -93,5 +93,6 @@
MarbleScrollBar.qml
material-icons/ic_phone_black_48px.svg
material-icons/ic_drag_handle_black_48dp.png
+ qtquickcontrols2.conf
diff --git a/src/apps/marble-maps/PlacemarkDialog.qml b/src/apps/marble-maps/PlacemarkDialog.qml
--- a/src/apps/marble-maps/PlacemarkDialog.qml
+++ b/src/apps/marble-maps/PlacemarkDialog.qml
@@ -24,14 +24,8 @@
property alias showOsmTags: tagsView.visible
property bool showAccessibility: false
- height: placemark === null ? 0 : Screen.pixelDensity * 4 +
- (infoLayout.height > bookmarkButton.height ? infoLayout.height : bookmarkButton.height)
+ height: placemark === null ? 0 : Screen.pixelDensity * 4 +infoLayout.height
- onPlacemarkChanged: {
- if (placemark) {
- bookmarkButton.bookmark = bookmarks.isBookmark(placemark.longitude, placemark.latitude)
- }
- }
SystemPalette {
id: palette
@@ -55,7 +49,7 @@
anchors {
top: parent.top
left: parent.left
- right: bookmarkButton.left
+ right: parent.right
margins: Screen.pixelDensity * 2
}
@@ -167,34 +161,6 @@
}
}
- Image {
- id: bookmarkButton
- anchors.right: parent.right
- anchors.top: parent.top
- anchors.margins: Screen.pixelDensity * 2
- visible: root.height > 0
-
- property bool bookmark: false
-
- width: Screen.pixelDensity * 6
- height: width
- sourceSize.height: height
- sourceSize.width: width
- source: bookmark ? "qrc:/material/star.svg" : "qrc:/material/star_border.svg"
-
- MouseArea {
- id: touchArea
- anchors.fill: parent
- onClicked: {
- if (bookmarkButton.bookmark) {
- bookmarks.removeBookmark(root.placemark.longitude, root.placemark.latitude)
- } else {
- bookmarks.addBookmark(root.placemark, "Default")
- }
- bookmarkButton.bookmark = !bookmarkButton.bookmark
- }
- }
- }
Dialog {
id: routesDialog
diff --git a/src/apps/marble-maps/Search.qml b/src/apps/marble-maps/Search.qml
--- a/src/apps/marble-maps/Search.qml
+++ b/src/apps/marble-maps/Search.qml
@@ -8,7 +8,7 @@
// Copyright 2015 Gábor Péterffy
//
-import QtQuick 2.3
+import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Window 2.2
@@ -73,10 +73,8 @@
Column {
anchors.top: parent.top
- anchors.topMargin: background.itemSpacing
anchors.left: parent.left
anchors.right: parent.right
- anchors.margins: background.itemSpacing
spacing: background.itemSpacing
ListView {
@@ -93,6 +91,9 @@
height: background.itemSpacing + Math.max(bookmarkIcon.height, bookmarkText.height)
spacing: background.itemSpacing
+ leftPadding: 10
+ rightPadding: 10
+
Image {
id: bookmarkIcon
anchors.verticalCenter: parent.verticalCenter
@@ -109,7 +110,7 @@
anchors.leftMargin: Screen.pixelDensity * 2
width: bookmarksView.width - bookmarksView.spacing - bookmarkIcon.width
text: display
- font.pointSize: 18
+ font.pointSize: 14
color: palette.text
elide: Text.ElideMiddle
@@ -136,20 +137,29 @@
Row {
visible: bookmarksView.model.count === 0
width: parent.width
+ anchors.left: parent.left
+ anchors.right: parent.right
+ spacing: Screen.pixelDensity * 2
+ anchors.margins: Screen.pixelDensity * 2
Text {
anchors.bottom: parent.bottom
- width: 0.8 * parent.width
- font.pointSize: 18
+ leftPadding: 10
+ bottomPadding: 3
+ width: parent.width - Screen.pixelDensity * 2 - emptyImage.width
+ font.pointSize: 14
color: paletteDisabled.text
text: qsTr("Your bookmarks will appear here.")
+
wrapMode: Text.WrapAtWordBoundaryOrAnywhere
elide: Text.ElideRight
}
Image {
+ id: emptyImage
anchors.bottom: parent.bottom
- width: 0.2 * parent.width
+ width: Screen.pixelDensity* 10
+
fillMode: Image.PreserveAspectFit
source: "qrc:/konqi/books.png"
}
@@ -169,13 +179,11 @@
SearchField {
id: searchField
- width: parent.width - 2 * anchors.margins <= Screen.pixelDensity * 70 ?
- parent.width - 2 * anchors.margins
- : Screen.pixelDensity * 50
+ width: parent.width
anchors {
top: parent.top
left: parent.left
- margins: Screen.pixelDensity * 3
+ right: parent.right
}
completionModel: backend.completionModel
onSearchRequested: backend.search(query)
diff --git a/src/apps/marble-maps/SearchField.qml b/src/apps/marble-maps/SearchField.qml
--- a/src/apps/marble-maps/SearchField.qml
+++ b/src/apps/marble-maps/SearchField.qml
@@ -74,7 +74,7 @@
anchors.right: parent.right
placeholderText: qsTr("Search")
- font.pointSize: 18
+ font.pointSize: 16
textColor: palette.text
inputMethodHints: Qt.ImhNoPredictiveText
onAccepted: root.search(text)
@@ -137,7 +137,6 @@
visible: !root.busy
enabled: field.text !== ""
imageSource: "qrc:///search.png"
-
onClicked: root.search(field.text)
}
}