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) } }