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