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/BookmarkManager.qml b/src/apps/marble-maps/BookmarkManager.qml
--- a/src/apps/marble-maps/BookmarkManager.qml
+++ b/src/apps/marble-maps/BookmarkManager.qml
@@ -21,7 +21,218 @@
import org.kde.marble 0.20
Kirigami.Page {
+ id: bookmarkPage
+ title: "Bookmarks"
+ property alias marbleQuickItem: root.marbleQuickItem
+ signal backTriggered()
+
+ Item{
+ id: root
+ anchors.fill: parent
+ property int currentIndex: 0
+ property var marbleQuickItem: null
+
+ SystemPalette{
+ id: palette
+ colorGroup: SystemPalette.Active
+ }
+
+ ColumnLayout {
+ anchors {
+ fill: parent
+ margins: Screen.pixelDensity
+ }
+
+ ListModel {
+ id: listModel
+ ListElement { text: "Lorem ipsum dolor sit amet" }
+ ListElement { text: "Curabitur sit amet risus" }
+ ListElement { text: "Suspendisse vehicula nisi" }
+ ListElement { text: "Mauris imperdiet libero" }
+ ListElement { text: "Sed vitae dui aliquet augue" }
+ ListElement { text: "Praesent in elit eu nulla" }
+ ListElement { text: "Etiam vitae magna" }
+ ListElement { text: "Pellentesque eget elit euismod" }
+ ListElement { text: "Nulla at enim porta" }
+ ListElement { text: "Fusce tincidunt odio" }
+ ListElement { text: "Fusce tincidunt odio" }
+
+ }
+
+ ListView {
+ id: listView
+ anchors.fill: parent
+ spacing: 5
+ interactive: false
+
+ model: DelegateModel {
+ id: visualModel
+ model: listModel
+
+ delegate:
+ MouseArea {
+ id: delegateRoot
+ propagateComposedEvents: true
+ property int visualIndex: DelegateModel.itemsIndex
+ width: parent.width
+ height: 100
+ drag.target: icon
+ drag.axis: Drag.YAxis
+
+ SwipeDelegate {
+ id: delegate
+ text: modelData
+ width: parent.width
+
+ contentItem: Rectangle {
+ id: icon
+ width: parent.width
+ height: Screen.pixelDensity * 4 + Math.max(text.height, imageButton.height)
+
+ anchors {
+ horizontalCenter: parent.horizontalCenter;
+ verticalCenter: parent.verticalCenter
+ }
+
+ Drag.active: delegateRoot.drag.active
+ Drag.source: delegateRoot
+ Drag.hotSpot.x: 50
+ Drag.hotSpot.y: 50
+
+ color: "blue"//palette.base
+
+ Text{
+ id: bookmarkText
+ rightPadding: delegate.spacing
+
+ text: delegate.text
+ font: delegate.font
+ color: delegate.enabled ? (delegate.down ? "#17a81a" : "#21be2b") : "#bdbebf"
+ elide: Text.ElideRight
+ visible: delegate.text
+ horizontalAlignment: Text.AlignLeft
+ anchors.verticalCenter: parent.verticalCenter
+ }
+ }
+
+ background: Rectangle {
+ width: parent.width
+ height: parent.height
+ opacity: enabled ? 1 : 0.3
+ color: delegate.down ? "#dddedf" : "#eeeeee"
+ }
+
+
+ swipe.behind: Rectangle {
+ width: parent.width
+ height: parent.height
+
+ clip: true
+ color: SwipeDelegate.pressed ? "#555" : "transparent" //"#666"
+
+ Label {
+ font.family: "Fontello"
+ text: delegate.swipe.complete ? "\ue805" // icon-cw-circled
+ : "\ue801" // icon-cancel-circled-1
+
+ padding: 20
+ anchors.fill: parent
+ horizontalAlignment: Qt.AlignRight
+ verticalAlignment: Qt.AlignVCenter
+
+ opacity: 2 * -delegate.swipe.position
+
+ color: Material.color(delegate.swipe.complete ? Material.Green : Material.Red, Material.Shade200)
+ Behavior on color { ColorAnimation { } }
+ }
+
+ Rectangle{
+ width: parent.width
+ color: "#333333"
+ height: parent.height
+ Label {
+ text: qsTr("Removed")
+ color: "white"
+
+ padding: 20
+ anchors.fill: parent
+ horizontalAlignment: Qt.AlignLeft
+ verticalAlignment: Qt.AlignVCenter
+
+ opacity: delegate.swipe.complete ? 1 : 0
+ Behavior on opacity { NumberAnimation { } }
+ }
+ }
+
+ SwipeDelegate.onClicked: delegate.swipe.close()
+ SwipeDelegate.onPressedChanged: undoTimer.stop()
+ }
+
+
+ Timer {
+ id: undoTimer
+ interval: 1600
+ onTriggered: listModel.remove(index)
+ }
+
+ swipe.onCompleted: undoTimer.start()
+
+ states: [
+ State {
+ when: icon.Drag.active
+ ParentChange {
+ target: icon
+ parent: root
+ }
+
+ AnchorChanges {
+ target: icon;
+ anchors.horizontalCenter: undefined;
+ anchors.verticalCenter: undefined
+ }
+ }
+ ]
+ }
+
+ DropArea {
+ anchors { fill: parent; margins: 15 }
+ onEntered: visualModel.items.move(drag.source.visualIndex, delegateRoot.visualIndex)
+ }
+
+ onClicked: {
+ if (index === root.currentIndex) {
+ //root.currentIndex = -1
+ } else {
+ root.currentIndex = index
+ }
+ }
+ }
+ }
+
+ remove: Transition {
+ SequentialAnimation {
+ PauseAnimation { duration: 125 }
+ NumberAnimation { property: "height"; to: 0; easing.type: Easing.InOutQuad }
+ }
+ }
+
+ displaced: Transition {
+ SequentialAnimation {
+ PauseAnimation { duration: 125 }
+ NumberAnimation { property: "y"; easing.type: Easing.InOutQuad }
+ }
+ }
+
+ ScrollIndicator.vertical: ScrollIndicator { }
+ }
+ }
+ }
+
+ Bookmarks {
+ id: bookmarks
+ map: root.marbleQuickItem
+ }
}
diff --git a/src/apps/marble-maps/CMakeLists.txt b/src/apps/marble-maps/CMakeLists.txt
--- a/src/apps/marble-maps/CMakeLists.txt
+++ b/src/apps/marble-maps/CMakeLists.txt
@@ -59,6 +59,7 @@
set(QT_ANDROID_APP_PACKAGE_SOURCE_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/package")
set(QT_ANDROID_APP_PACKAGE_NAME "org.kde.marble.maps")
set(QT_ANDROID_APP_NAME "Marble Maps")
+ set(QT_ANDROID_APP_EXTRA_PLUGINS "${ABSOLUTE_INSTALL_PATH}//share,${ABSOLUTE_INSTALL_PATH}//lib/qml")
configure_file(package/deploy-marble-maps.json.in ${CMAKE_CURRENT_BINARY_DIR}/deploy-marble-maps.json @ONLY)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/deploy-marble-maps.json DESTINATION "${CMAKE_INSTALL_PREFIX}/share")
install(TARGETS ${TARGET} LIBRARY DESTINATION libs/${ANDROID_ABI})
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,7 +25,7 @@
style: ButtonStyle {
background: Rectangle {
anchors.fill: parent
- color: root.pressed ? palette.highlight : palette.base
+ color: "transparent"
Image {
id: icon
anchors.fill: parent
diff --git a/src/apps/marble-maps/ImageButton.qml b/src/apps/marble-maps/ImageButton.qml
--- a/src/apps/marble-maps/ImageButton.qml
+++ b/src/apps/marble-maps/ImageButton.qml
@@ -21,6 +21,9 @@
height: image.height + 10
property alias imageSource: image.source
+ property alias image: image
+ property alias backgroundColor: background.color
+ property alias touchArea: touchArea
signal clicked()
SystemPalette{
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
@@ -9,23 +9,25 @@
// Copyright 2015 Dennis Nienhüser
// Copyright 2015 Mikhail Ivchenko
//
+import QtQuick 2.7
+import QtQuick.Dialogs 1.2
+import QtQuick.Controls 2.2
+import QtQuick.Window 2.1
+import QtQuick.Layouts 1.3
+import QtQuick.Controls.Material 2.0
-
-import QtQuick 2.3
-import QtQuick.Controls 2.0
-import QtQuick.Window 2.2
+import org.kde.kirigami 2.0 as Kirigami
import org.kde.marble 0.20
-ApplicationWindow {
+Kirigami.ApplicationWindow {
id: app
- title: qsTr("Marble Maps")
+ width: 500
+ height: 800
visible: true
- width: 600
- height: 400
-
- color: "#f9f9f9" // Keep the background white while no dialog is loaded
+ Material.theme: Material.Light
+ Material.accent: Material.Pink
property alias state: stateTracker.state
@@ -51,452 +53,608 @@
}
}
- SystemPalette{
- id: palette
- colorGroup: SystemPalette.Active
- }
-
Settings {
id: settings
}
- Item {
- id: mapItem
- anchors {
- top: parent.top
- topMargin: mapOffset
- left: parent.left
- right: parent.right
+ 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
}
- height: !dialogExpanded
- ? parent.height
- : parent.height + animatedMargin
+ else {
+ if(search.searchResultsVisible === true){
+ search.searchResultsVisible = false
+ }
+ app.aboutToQuit = true
+ quitHelper.visible = true
+ }
+ close.accepted = false
+ }
- PinchArea {
- anchors.fill: parent
- enabled: true
+ globalDrawer: Kirigami.GlobalDrawer {
+ id: sidePanel
+ title: "Settings"
- onPinchStarted: marbleMaps.handlePinchStarted(pinch.center)
- onPinchFinished: marbleMaps.handlePinchFinished(pinch.center)
- onPinchUpdated: marbleMaps.handlePinchUpdated(pinch.center, pinch.scale);
+ handleVisible: false
+ property alias showAccessibility: accessibilityAction.checked
- MarbleMaps {
- id: marbleMaps
+ Settings {
+ id: sidePanelSettings
+ property bool showUpdateInfo: Number(value("MarbleMaps", "updateInfoVersion", "0")) < 1
+ Component.onDestruction: {
+ sidePanelSettings.setValue("MarbleMaps", "showAccessibility", accessibilityAction.checked ? "true" : "false")
+ }
+ }
- property string currentPositionProvider: "QtPositioning"
- property bool wlanOnly: false
- property bool smallZoom : radius < 2 * Math.max(app.width, app.height)
+ actions: [
+ Kirigami.Action {
+ id: publicTransportAction
+ text: qsTr("Public Transport")
+ checkable: true
+ checked: marbleMaps.showPublicTransport
+ iconName: "qrc:///material/directions-bus.svg"
+ visible: true
+ onTriggered: {
+ sidePanel.close()
+ marbleMaps.showPublicTransport = checked
+ publicTransportDialog.open()
+ }
+ },
+ Kirigami.Action {
+ id: outdoorActivitiesAction
+ checkable: true
+ checked: marbleMaps.showOutdoorActivities
+ text: qsTr("Outdoor Activities")
+ visible: true
+ iconName: "qrc:///material/directions-run.svg"
+ onTriggered: {
+ sidePanel.close()
+ marbleMaps.showOutdoorActivities = checked
+ }
+ },
+ Kirigami.Action {
+ id: accessibilityAction
+ checkable: true
+ checked: settings.value("MarbleMaps", "showAccessibility", "false") === "true"
+ text: qsTr("Accessibility")
+ visible: true
+ iconName: "qrc:///material/wheelchair.svg"
+ onTriggered: {
+ sidePanelSettings.value("MarbleMaps", "showAccessibility", "false") === "true"
- anchors.fill: parent
+ }
+ },
+ Kirigami.Action{ enabled: false},
+ Kirigami.Action {
+ text: "About"
+ iconName: "qrc:///marble.svg"
visible: true
+ onTriggered: {
+ app.state = "about"
+ sidePanel.close()
+ source = ""
+ app.pageStack.push("qrc:///AboutDialog.qml")
+ }
+ },
+ Kirigami.Action {
+ text: "Bookmarks"
+ iconName: "qrc:///material/star.svg"
+ onTriggered: {
+ app.state = "bookmarks"
+ sidePanel.close()
+ app.pageStack.push("qrc:///BookmarkManager.qml")
+ }
+ },
+ Kirigami.Action {
+ text: "Layer Options"
+ iconName: "qrc:///settings.png"
+ onTriggered: {
+ app.state = "options"
+ sidePanel.close()
+ app.pageStack.push("qrc:///Options.qml")
+ }
+ }
+ ]
- // 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
+ Binding {
+ target: pageStack.currentItem
+ property: "marbleQuickItem"
+ value: marbleMaps
+ when: app.state === "bookmarks"
+ }
+ }
- Connections {
- target: app
- onSelectedPlacemarkChanged: balloonAnimation.restart()
- }
+ pageStack.initialPage: page
- NumberAnimation {
- id: balloonAnimation
- target: balloon
- property: "animationOffset"
- from: 1
- to: 0
- duration: 1000
- easing.type: Easing.OutBounce
- }
+ Kirigami.Page {
+ id: page
+ padding: 0
+ topPadding: 0
+ leftPadding: 0
+ rightPadding: 0
+ bottomPadding: 0
+ title: "Marble Maps"
+ Item {
+ id: mapItem
+ width: parent.width
+ height: dialogLoader.height === 0 ? parent.height - bottomMenu.height : parent.height - dialogLoader.height - bottomMenu.height
- width: Screen.pixelDensity*6
- height: width
- source: "qrc:///ic_place.png"
- onPlacemarkChanged: {
- app.selectedPlacemark = placemark
- if (placemark) {
- app.state = "place"
- } else {
- app.state = "none"
- }
- }
- }
+ PinchArea {
+ id: pinchArea
+ anchors.fill: parent
+ enabled: true
- onPositionAvailableChanged: {
- updateIndicator();
- }
- onPositionVisibleChanged: {
- updateIndicator();
- }
- onVisibleLatLonAltBoxChanged: {
- !panningDetectionTimer.restart();
- updateIndicator();
- }
- onCurrentPositionChanged: {
- updateIndicator();
- }
+ onPinchStarted: marbleMaps.handlePinchStarted(pinch.center)
+ onPinchFinished: marbleMaps.handlePinchFinished(pinch.center)
+ onPinchUpdated: marbleMaps.handlePinchUpdated(pinch.center, pinch.scale);
- onZoomChanged: {
- zoomDetectionTimer.restart()
- }
+ MarbleMaps {
+ id: marbleMaps
- 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()
+ property string currentPositionProvider: "QtPositioning"
+ property bool wlanOnly: false
+ property bool smallZoom : radius < 2 * Math.max(app.width, app.height)
+
+ anchors.fill: parent
- Connections {
- target: Qt.application
- onStateChanged: {
- if (Qt.application.state === Qt.ApplicationInactive || Qt.application.state === Qt.ApplicationSuspended) {
- marbleMaps.writeSettings()
+ 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
+
+ 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
+ }
+
+ width: Screen.pixelDensity*6
+ height: width
+ source: "qrc:///ic_place.png"
+ onPlacemarkChanged: {
+ app.selectedPlacemark = placemark
+ if (placemark) {
+ app.state = "place"
+ } else {
+ app.state = "none"
+ }
}
}
- }
- function updateIndicator() {
- if ( !positionVisible && positionAvailable ) {
- zoomToPositionButton.updateIndicator();
+ onPositionAvailableChanged: {
+ updateIndicator();
+ }
+ onPositionVisibleChanged: {
+ updateIndicator();
+ }
+ onVisibleLatLonAltBoxChanged: {
+ !panningDetectionTimer.restart();
+ updateIndicator();
+ }
+ onCurrentPositionChanged: {
+ updateIndicator();
}
- }
- RoutingManager {
- id: routingManager
- anchors.fill: parent
- marbleItem: marbleMaps
- visible: hasRoute
+ onZoomChanged: {
+ zoomDetectionTimer.restart()
+ }
- function addToRoute() {
- ensureRouteHasDeparture()
- routingManager.addViaByPlacemarkAtIndex(routingManager.waypointCount(), selectedPlacemark)
- routingManager.clearSearchResultPlacemarks()
- selectedPlacemark = null
- app.state = "route"
+ 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()
}
- function ensureRouteHasDeparture() {
- if (routingManager.routeRequestModel.count === 0) {
- if (marbleMaps.positionAvailable) {
- routingManager.addViaByPlacemark(marbleMaps.currentPosition)
+ Component.onDestruction: 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();
+ }
+ }
- }
+ 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
+ color: Kirigami.Theme.highlightColor
+ textColor: Kirigami.Theme.highlightedTextColor
+ text: qsTr("%1 km").arg(zoomToPositionButton.distance < 10 ? zoomToPositionButton.distance.toFixed(1) : zoomToPositionButton.distance.toFixed(0))
+ anchors {
+ bottom: CircularButton.top
+ horizontalCenter: CircularButton.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
+
+ iconSource: marbleMaps.positionAvailable ? "qrc:///gps_fixed.png" : "qrc:///gps_not_fixed.png"
+
+ 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
}
- visible: marbleMaps.positionAvailable && !marbleMaps.positionVisible
}
- PositionButton {
- id: zoomToPositionButton
- anchors {
- right: parent.right
- rightMargin: Screen.pixelDensity * 1
- bottom: routeEditorButton.top
- bottomMargin: 10
+ Row {
+ id: bottomMenu
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.bottom: dialogLoader.top
+ width: parent.width
+ height: routeEditorButton.height + Screen.pixelDensity * 2
+ anchors.topMargin: app.animatedMargin
+
+ Item {
+ id: bottomMenuBackground
+ anchors.fill: parent
+ Rectangle {
+ color: Kirigami.Theme.highlightColor //Kirigami.Theme.backgroundColor
+ anchors.fill : parent
+ }
+ }
+ FlatButton {
+ id: routeEditorButton
+ property string currentProfileIcon: "qrc:///material/directions-car.svg"
+ anchors.verticalCenter: parent.verticalCenter
+ anchors.left: parent.left
+ anchors.leftMargin: 10
+ 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: currentProfileIcon }
+ }
+ ]
}
- enabled: marbleMaps.positionAvailable
-
- iconSource: marbleMaps.positionAvailable ? "qrc:///gps_fixed.png" : "qrc:///gps_not_fixed.png"
+ }
- onClicked: marbleMaps.centerOnCurrentPosition()
+ 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"
+ }
- property real distance: 0
+ Search {
+ id: search
+ anchors.fill: parent
+ marbleQuickItem: marbleMaps
+ visible: !navigationManager.visible //true
- function updateIndicator() {
- var point = marbleMaps.mapFromItem(zoomToPositionButton, diameter * 0.5, diameter * 0.5);
- distance = 0.001 * marbleMaps.distanceFromPointToCurrentLocation(point);
- angle = marbleMaps.angleFromPointToCurrentLocation(point);
+ onItemSelected: {
+ if (routingManager) {
+ routingManager.addSearchResultAsPlacemark(suggestedPlacemark);
+ }
+ app.selectedPlacemark = suggestedPlacemark;
+ app.state = "place"
}
-
- showDirection: marbleMaps.positionAvailable && !marbleMaps.positionVisible
+ onMenuButtonClicked: sidePanel.open()
}
- CircularButton {
- id: routeEditorButton
+ Loader {
+ id: dialogLoader
+ focus: true
- property string currentProfileIcon: "qrc:///material/directions-car.svg"
+ 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
-
- 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
- }
+ NumberAnimation {
+ id: loaderAnimation
+ target: dialogLoader.item
+ property: "y"
+ from: app.height - dialogLoader.item.height
+ to: 0
+ duration: 500
+ easing.type: Easing.InExpo
}
- iconSource: "qrc:///material/directions.svg";
- states: [
- State {
- name: ""
- PropertyChanges { target: routeEditorButton; iconSource: "qrc:///material/directions.svg"; }
- },
- State {
- name: "routingAction"
- when: app.state === "route"
- PropertyChanges { target: routeEditorButton; iconSource: "qrc:///material/navigation.svg"; }
- },
- State {
- name: "placeAction"
- when: app.state === "place"
- PropertyChanges { target: routeEditorButton; iconSource: currentProfileIcon }
+ 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
}
- ]
- }
- }
- Search {
- id: search
- anchors.fill: parent
- marbleQuickItem: marbleMaps
- visible: !navigationManager.visible
+ }
- onItemSelected: {
- if (routingManager) {
- routingManager.addSearchResultAsPlacemark(suggestedPlacemark);
+ Connections {
+ target: dialogLoader.item
+ onCurrentProfileIconChanged: routeEditorButton.currentProfileIcon = dialogLoader.item.currentProfileIcon
+ ignoreUnknownSignals: true
}
- app.selectedPlacemark = suggestedPlacemark;
- app.state = "place"
}
- onMenuButtonClicked: drawer.open()
- }
-
- Loader {
- id: dialogLoader
- focus: true
+ Rectangle {
+ width: parent.width
+ color: Kirigami.Theme.textColor
+ opacity: 0.4
+ height: 1
+ anchors.bottom: dialogLoader.top
- 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 = drawer.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
- }
- }
+ Item {
+ id: stateTracker
+ state: "none"
- 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"
- }
+ states: [
+ State {
+ name: "none"
+ PropertyChanges { target: dialogLoader; source: "" }
- SidePanel {
- id: drawer
- width: 0.67 * app.width
- height: app.height
- marbleMaps: marbleMaps
+ },
+ 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: "" }
+ PropertyChanges {
+ target: pageStack
+ interactive: true
+ }
+ },
+ State {
+ name: "settings"
+ PropertyChanges { target: dialogLoader; source: "SettingsDialog.qml" }
+ },
+ State {
+ name: "developer"
+ PropertyChanges { target: dialogLoader; source: "DeveloperDialog.qml" }
+ },
+ State {
+ name: "bookmarks"
+ PropertyChanges { target: dialogLoader; source: "" }
+ PropertyChanges {
+ target: pageStack
+ interactive: false
+ }
+ },
+ State {
+ name: "options"
+ PropertyChanges { target: dialogLoader; source: "" }
+ PropertyChanges {
+ target: pageStack
+ interactive: true
+ }
+ }
- onAboutActionTriggered: {
- app.state = "about"
- dialogLoader.focus = true
+ ]
}
- }
- 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()
+ 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
+ }
}
}
}
-
- 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 (app.state !== "none") {
- app.state = "none"
- } else {
- app.aboutToQuit = true
- quitHelper.visible = true
- }
- close.accepted = false
- }
-
- 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: "AboutDialog.qml" }
- },
- State {
- name: "settings"
- PropertyChanges { target: dialogLoader; source: "SettingsDialog.qml" }
- },
- State {
- name: "developer"
- PropertyChanges { target: dialogLoader; source: "DeveloperDialog.qml" }
- }
- ]
- }
}
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
@@ -30,6 +30,8 @@
SidePanel.qml
PublicTransport.qml
OutdoorActivities.qml
+ BookmarkManager.qml
+ DragDropGridType.qml
drawer.svg
../../../data/android/drawable-xxxhdpi/search.png
../../../data/android/drawable-xxxhdpi/ic_menu_black_48dp.png
@@ -55,6 +57,7 @@
../../../data/android/drawable-xxxhdpi/ic_place_via.png
../../../data/android/drawable-xxxhdpi/ic_add_black_48dp.png
../../../data/android/drawable-xxxhdpi/ic_settings_black_48dp.png
+ icons/marble-lineart-simplified-logo.svg
material-icons/ic_local_gas_station_48px.svg
material-icons/ic_open_in_browser_48px.svg
material-icons/ic_volume_off_48px.svg
@@ -81,6 +84,8 @@
material-icons/ic_star_24px.svg
material-icons/ic_star_border_24px.svg
material-icons/ic_label_48px.svg
+ material-icons/ic_drag_handle_black_48dp.png
+ material-icons/ic_phone_black_48px.svg
konqi/konqi-app-dev.png
konqi/konqi-dev-qt.png
konqi/konqi-group.png
@@ -88,6 +93,8 @@
konqi/konqi-books.png
RouteProfileRadioButton.qml
MarbleScrollBar.qml
- material-icons/ic_phone_black_48px.svg
+ roboto/Roboto-Medium.ttf
+ qtquickcontrols2.conf
+ Options.qml
diff --git a/src/apps/marble-maps/Options.qml b/src/apps/marble-maps/Options.qml
--- a/src/apps/marble-maps/Options.qml
+++ b/src/apps/marble-maps/Options.qml
@@ -17,5 +17,70 @@
import org.kde.marble 0.20
Kirigami.Page {
+ id: optionsPage
+ padding: 0
+ topPadding: 0
+ leftPadding: 0
+ rightPadding: 0
+ bottomPadding: 0
+ signal backTriggered()
+
+ Item{
+ id: root
+ anchors {
+ fill: parent
+ margins: Kirigami.Units.gridUnit
+ }
+
+ Column {
+ anchors.fill: parent
+ spacing: 5
+
+ Label {
+ text: qsTr("Layer Options
")
+ }
+
+ Label {
+ text: qsTr("Public Transport Layers
")
+ }
+
+ Item{
+ implicitHeight: publicTransportLoader.height + Kirigami.Units.gridUnit * 4
+ width: parent.width
+
+ Loader {
+ anchors.fill: parent
+ id: publicTransportLoader
+ source: "PublicTransport.qml"
+
+ onLoaded: {
+ item.implicitWidth = parent.width
+ item.marbleMaps = marbleMaps
+ }
+ }
+ }
+
+ Label {
+ topPadding: Kirigami.Units.gridUnit
+ text: qsTr("Outdoor Activities Layers
")
+ }
+
+ Item{
+ implicitHeight: outdoorActivitiesLoader.height + Kirigami.Units.gridUnit * 6
+ width: parent.width
+
+ Loader {
+ anchors.fill: parent
+ id: outdoorActivitiesLoader
+ source: "OutdoorActivities.qml"
+
+ onLoaded: {
+ item.implicitWidth = parent.width
+ item.marbleMaps = marbleMaps
+ }
+ }
+ }
+ }
+ }
}
diff --git a/src/apps/marble-maps/OutdoorActivities.qml b/src/apps/marble-maps/OutdoorActivities.qml
--- a/src/apps/marble-maps/OutdoorActivities.qml
+++ b/src/apps/marble-maps/OutdoorActivities.qml
@@ -61,7 +61,7 @@
model: transportModel
clip: true
- spacing: Screen.pixelDensity * 2
+ spacing: Screen.pixelDensity
delegate: Row {
CheckBox {
@@ -71,7 +71,7 @@
checked: root.marbleMaps.isRelationTypeVisible(key)
contentItem: Row {
- spacing: Screen.pixelDensity * 1
+ spacing: Screen.pixelDensity
Item {
height: parent.height
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)
}
}
diff --git a/src/apps/marble-maps/SidePanel.qml b/src/apps/marble-maps/SidePanel.qml
--- a/src/apps/marble-maps/SidePanel.qml
+++ b/src/apps/marble-maps/SidePanel.qml
@@ -12,6 +12,8 @@
import QtQuick.Controls 2.0
import QtQuick.Window 2.2
import QtQuick.Dialogs 1.2
+import org.kde.kirigami 2.0 as Kirigami
+
import org.kde.marble 0.20
Drawer {
@@ -20,6 +22,7 @@
property var marbleMaps
property alias showAccessibility: accessibilityAction.checked
signal aboutActionTriggered()
+ signal bookmarkActionTriggered()
Settings {
id: settings
@@ -31,7 +34,7 @@
}
}
- Column {
+ Column {
id: drawerContent
anchors.fill: parent
spacing: Screen.pixelDensity * 2
@@ -111,9 +114,20 @@
root.aboutActionTriggered()
}
}
+
+
+ MenuIcon {
+ text: qsTr("Bookmarks")
+ anchors.leftMargin: Screen.pixelDensity * 2
+ anchors.rightMargin: anchors.leftMargin
+ onTriggered: {
+ root.close()
+ root.bookmarkActionTriggered()
+ }
+ }
}
- Dialog {
+ Kirigami.Dialog {
id: publicTransportDialog
title: qsTr("Public Transport")
@@ -126,7 +140,7 @@
}
}
- Dialog {
+ Kirigami.Dialog {
id: outdoorActivitiesDialog
title: qsTr("Outdoor Activities")
diff --git a/src/apps/marble-maps/main.cpp b/src/apps/marble-maps/main.cpp
--- a/src/apps/marble-maps/main.cpp
+++ b/src/apps/marble-maps/main.cpp
@@ -11,6 +11,8 @@
#include
#include
#include
+#include
+#include
#include "declarative/MarbleDeclarativePlugin.h"
#include
@@ -96,6 +98,8 @@
int main(int argc, char ** argv)
{
QApplication app(argc, argv);
+ QFont newFont("Roboto", 15, QFont::Normal, false);
+ app.setFont(newFont);
app.setApplicationName( "Marble Maps" );
app.setOrganizationName( "KDE" );
app.setOrganizationDomain( "kde.org" );
@@ -113,6 +117,9 @@
QQmlApplicationEngine engine;
TextToSpeechClient * tts = new TextToSpeechClient(&engine);
+ engine.addImportPath("qmlmaterial/modules/");
+ engine.addImportPath("qmlextras/modules/");
+
engine.rootContext()->setContextProperty("textToSpeechClient", tts);
engine.load(QUrl("qrc:/MainScreen.qml"));
// @todo Ship translations and only fall back to english if no translations for the system locale are installed
diff --git a/src/apps/marble-maps/package/deploy-marble-maps.json.in b/src/apps/marble-maps/package/deploy-marble-maps.json.in
--- a/src/apps/marble-maps/package/deploy-marble-maps.json.in
+++ b/src/apps/marble-maps/package/deploy-marble-maps.json.in
@@ -12,5 +12,6 @@
"android-package": "@QT_ANDROID_APP_PACKAGE_NAME@",
"android-app-name": "@QT_ANDROID_APP_NAME@",
"android-extra-libs": "@QT_ANDROID_APP_EXTRA_LIBS@",
+ "android-extra-plugins": "@QT_ANDROID_APP_EXTRA_PLUGINS@",
"android-package-source-directory": "@QT_ANDROID_APP_PACKAGE_SOURCE_ROOT@"
}
diff --git a/src/lib/marble/declarative/MarbleQuickItem.cpp b/src/lib/marble/declarative/MarbleQuickItem.cpp
--- a/src/lib/marble/declarative/MarbleQuickItem.cpp
+++ b/src/lib/marble/declarative/MarbleQuickItem.cpp
@@ -231,7 +231,7 @@
for (AbstractFloatItem *item: d->m_map.floatItems()) {
if (item->nameId() == QLatin1String("license")) {
- item->setPosition(QPointF(5.0, -10.0));
+ item->setPosition(QPointF(9.0, -10.0));
} else {
item->hide();
}