summaryrefslogtreecommitdiffstats
path: root/mobile-widgets/qml/main.qml
diff options
context:
space:
mode:
Diffstat (limited to 'mobile-widgets/qml/main.qml')
-rw-r--r--mobile-widgets/qml/main.qml360
1 files changed, 360 insertions, 0 deletions
diff --git a/mobile-widgets/qml/main.qml b/mobile-widgets/qml/main.qml
new file mode 100644
index 000000000..f4f6ea28b
--- /dev/null
+++ b/mobile-widgets/qml/main.qml
@@ -0,0 +1,360 @@
+import QtQuick 2.4
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Styles 1.2
+import QtQuick.Window 2.2
+import QtQuick.Dialogs 1.2
+import QtQuick.Layouts 1.1
+import QtQuick.Window 2.2
+import org.subsurfacedivelog.mobile 1.0
+import org.kde.kirigami 1.0 as Kirigami
+
+Kirigami.ApplicationWindow {
+ id: rootItem
+ title: qsTr("Subsurface-mobile")
+
+ header.minimumHeight: 0
+ header.preferredHeight: Kirigami.Units.gridUnit
+ header.maximumHeight: Kirigami.Units.gridUnit * 2
+ property bool fullscreen: true
+ property int oldStatus: -1
+ property alias accessingCloud: manager.accessingCloud
+ property QtObject notification: null
+ property bool showingDiveList: false
+ property alias syncToCloud: manager.syncToCloud
+ onAccessingCloudChanged: {
+ if (accessingCloud >= 0) {
+ // we now keep updating this to show progress, so timing out after 30 seconds is more useful
+ // but should still be very conservative
+ showPassiveNotification("Accessing Subsurface Cloud Storage " + accessingCloud +"%", 30000);
+ } else {
+ hidePassiveNotification();
+ }
+ }
+
+ FontMetrics {
+ id: fontMetrics
+ }
+
+ visible: false
+ opacity: 0
+
+ function returnTopPage() {
+ for (var i=stackView.depth; i>1; i--) {
+ stackView.pop()
+ }
+ detailsWindow.endEditMode()
+ }
+
+ function scrollToTop() {
+ diveList.scrollToTop()
+ }
+
+ function showMap(location) {
+ var urlPrefix = "https://www.google.com/maps/place/"
+ var locationPair = location + "/@" + location
+ var urlSuffix = ",5000m/data=!3m1!1e3!4m2!3m1!1s0x0:0x0"
+ Qt.openUrlExternally(urlPrefix + locationPair + urlSuffix)
+
+ }
+
+ function startAddDive() {
+ detailsWindow.state = "add"
+ detailsWindow.dive_id = manager.addDive();
+ detailsWindow.number = manager.getNumber(detailsWindow.dive_id)
+ detailsWindow.date = manager.getDate(detailsWindow.dive_id)
+ detailsWindow.airtemp = ""
+ detailsWindow.watertemp = ""
+ detailsWindow.buddy = ""
+ detailsWindow.depth = ""
+ detailsWindow.divemaster = ""
+ detailsWindow.notes = ""
+ detailsWindow.location = ""
+ detailsWindow.duration = ""
+ detailsWindow.suit = ""
+ detailsWindow.weight = ""
+ detailsWindow.gasmix = ""
+ detailsWindow.startpressure = ""
+ detailsWindow.endpressure = ""
+ stackView.push(detailsWindow)
+ }
+
+ globalDrawer: Kirigami.GlobalDrawer {
+ title: "Subsurface"
+ titleIcon: "qrc:/qml/subsurface-mobile-icon.png"
+
+ bannerImageSource: "dive.jpg"
+ actions: [
+ Kirigami.Action {
+ text: "Dive list"
+ onTriggered: {
+ manager.appendTextToLog("requested dive list with credential status " + manager.credentialStatus)
+ if (manager.credentialStatus == QMLManager.UNKNOWN) {
+ // the user has asked to change credentials - if the credentials before that
+ // were valid, go back to dive list
+ if (oldStatus == QMLManager.VALID || oldStatus == QMLManager.VALID_EMAIL) {
+ manager.credentialStatus = oldStatus
+ }
+ }
+ returnTopPage()
+ globalDrawer.close()
+ }
+ },
+ Kirigami.Action {
+ text: "Cloud credentials"
+ onTriggered: {
+ returnTopPage()
+ oldStatus = manager.credentialStatus
+ if (diveList.numDives > 0) {
+ manager.startPageText = "Enter different credentials or return to dive list"
+ } else {
+ manager.startPageText = "Enter valid cloud storage credentials"
+ }
+
+ manager.credentialStatus = QMLManager.UNKNOWN
+ }
+ },
+ Kirigami.Action {
+ text: "Manage dives"
+ enabled: manager.credentialStatus === QMLManager.VALID || manager.credentialStatus === QMLManager.VALID_EMAIL
+ /*
+ * disable for the beta to avoid confusion
+ Action {
+ text: "Download from computer"
+ onTriggered: {
+ detailsWindow.endEditMode()
+ stackView.push(downloadDivesWindow)
+ }
+ }
+ */
+ Kirigami.Action {
+ text: "Add dive manually"
+ onTriggered: {
+ returnTopPage() // otherwise odd things happen with the page stack
+ startAddDive()
+ }
+ }
+ Kirigami.Action {
+ text: "Manual sync with cloud"
+ onTriggered: {
+ globalDrawer.close()
+ detailsWindow.endEditMode()
+ manager.saveChanges();
+ }
+ }
+ Kirigami.Action {
+ text: syncToCloud ? "Disable auto cloud sync" : "Enable auto cloud sync"
+ onTriggered: {
+ syncToCloud = !syncToCloud
+ if (!syncToCloud) {
+ var alertText = "Turning off automatic sync to cloud causes all data to only be stored locally.\n"
+ alertText += "This can be very useful in situations with limited or no network access.\n"
+ alertText += "Please chose 'Manual sync with cloud' if you have network connectivity\n"
+ alertText += "and want to sync your data to cloud storage."
+ showPassiveNotification(alertText, 10000)
+ }
+ }
+ }
+ },
+
+ Kirigami.Action {
+ text: "GPS"
+ enabled: manager.credentialStatus === QMLManager.VALID || manager.credentialStatus === QMLManager.VALID_EMAIL
+ Kirigami.Action {
+ text: "GPS-tag dives"
+ onTriggered: {
+ manager.applyGpsData();
+ }
+ }
+
+ Kirigami.Action {
+ text: "Upload GPS data"
+ onTriggered: {
+ manager.sendGpsData();
+ }
+ }
+
+ Kirigami.Action {
+ text: "Download GPS data"
+ onTriggered: {
+ manager.downloadGpsData();
+ }
+ }
+
+ Kirigami.Action {
+ text: "Show GPS fixes"
+ onTriggered: {
+ returnTopPage()
+ manager.populateGpsData();
+ stackView.push(gpsWindow)
+ }
+ }
+
+ Kirigami.Action {
+ text: "Clear GPS cache"
+ onTriggered: {
+ manager.clearGpsData();
+ }
+ }
+ Kirigami.Action {
+ text: "Preferences"
+ onTriggered: {
+ stackView.push(prefsWindow)
+ detailsWindow.endEditMode()
+ }
+ }
+ },
+
+ Kirigami.Action {
+ text: "Developer"
+ Kirigami.Action {
+ text: "App log"
+ onTriggered: {
+ stackView.push(logWindow)
+ }
+ }
+
+ Kirigami.Action {
+ text: "Theme information"
+ onTriggered: {
+ stackView.push(themetest)
+ }
+ }
+ },
+ Kirigami.Action {
+ text: "User manual"
+ onTriggered: {
+ Qt.openUrlExternally("https://subsurface-divelog.org/documentation/subsurface-mobile-user-manual/")
+ }
+ },
+ Kirigami.Action {
+ text: "About"
+ onTriggered: {
+ stackView.push(aboutWindow)
+ detailsWindow.endEditMode()
+ }
+ }
+ ] // end actions
+
+ MouseArea {
+ height: childrenRect.height
+ width: Kirigami.Units.gridUnit * 10
+ CheckBox {
+ //text: "Run location service"
+ id: locationCheckbox
+ anchors {
+ left: parent.left
+ top: parent.top
+ }
+ checked: manager.locationServiceEnabled
+ onCheckedChanged: {
+ manager.locationServiceEnabled = checked;
+ }
+ }
+ Kirigami.Label {
+ x: Kirigami.Units.gridUnit * 1.5
+ anchors {
+ left: locationCheckbox.right
+ //leftMargin: units.smallSpacing
+ verticalCenter: locationCheckbox.verticalCenter
+ }
+ text: "Run location service"
+ }
+ onClicked: {
+ print("Click.")
+ locationCheckbox.checked = !locationCheckbox.checked
+ }
+ }
+ }
+
+ contextDrawer: Kirigami.ContextDrawer {
+ id: contextDrawer
+ actions: rootItem.pageStack.currentPage ? rootItem.pageStack.currentPage.contextualActions : null
+ title: "Actions"
+ }
+
+ QtObject {
+ id: subsurfaceTheme
+ property int titlePointSize: Math.round(fontMetrics.font.pointSize * 1.5)
+ property int smallPointSize: Math.round(fontMetrics.font.pointSize * 0.8)
+ property color accentColor: "#2d5b9a"
+ property color shadedColor: "#132744"
+ property color accentTextColor: "#ececec"
+ property color diveListTextColor: "#000000" // the Kirigami theme text color is too light
+ property int columnWidth: Math.round(rootItem.width/(Kirigami.Units.gridUnit*30)) > 0 ? Math.round(rootItem.width / Math.round(rootItem.width/(Kirigami.Units.gridUnit*30))) : rootItem.width
+ }
+/*
+ toolBar: TopBar {
+ width: parent.width
+ height: Layout.minimumHeight
+ }
+ */
+
+ property Item stackView: pageStack
+ pageStack.initialPage: DiveList {
+ anchors.fill: detailsPage
+ id: diveList
+ opacity: 0
+ Behavior on opacity {
+ NumberAnimation {
+ duration: 200
+ easing.type: Easing.OutQuad
+ }
+ }
+
+ }
+
+ QMLManager {
+ id: manager
+ }
+
+ Preferences {
+ id: prefsWindow
+ visible: false
+ }
+
+ About {
+ id: aboutWindow
+ visible: false
+ }
+
+ DiveDetails {
+ id: detailsWindow
+ visible: false
+ width: parent.width
+ height: parent.height
+ }
+
+ DownloadFromDiveComputer {
+ id: downloadDivesWindow
+ visible: false
+ }
+
+ Log {
+ id: logWindow
+ visible: false
+ }
+
+ GpsList {
+ id: gpsWindow
+ visible: false
+ }
+
+ ThemeTest {
+ id: themetest
+ visible: false
+ }
+
+ Component.onCompleted: {
+ Kirigami.Theme.highlightColor = subsurfaceTheme.accentColor
+ manager.finishSetup();
+ rootItem.visible = true
+ diveList.opacity = 1
+ rootItem.opacity = 1
+ }
+ Behavior on opacity {
+ NumberAnimation {
+ duration: 200
+ easing.type: Easing.OutQuad
+ }
+ }
+}