Check if bluetooth is enabled.
[qzeecontrol] / qml / QZeeControl / MainPage.qml
index dc08d05..4021400 100644 (file)
 import QtQuick 1.1
 import com.nokia.meego 1.0
 import QtMobility.connectivity 1.2
+import QtMobility.systeminfo 1.2
 import "settingsstorage.js" as SettingsStorage
 import qzeecontrol 1.0
 
 Page {
     tools: commonTools
 
+    orientationLock: PageOrientation.LockPortrait
+
+    property bool initializing: true
+
     Component.onCompleted: {
         SettingsStorage.initialize();
 
@@ -36,6 +41,47 @@ Page {
             addressField.text = address
             portField.text = port
         }
+
+        if(SettingsStorage.getSetting("A") === "Unknown"){
+            console.log("Initializing key bindings.")
+            setKeyBindingsToDefault()
+        }
+
+        loadKeyBindings()
+        initializing = false
+    }
+
+    function setKeyBindingsToDefault(){
+        console.log("Setting key bindings to default.")
+        SettingsStorage.setSetting("A", "a")
+        SettingsStorage.setSetting("B", "b")
+        SettingsStorage.setSetting("C", "c")
+        SettingsStorage.setSetting("D", "d")
+
+        SettingsStorage.setSetting("Up", "Up")
+        SettingsStorage.setSetting("Down", "Down")
+        SettingsStorage.setSetting("Left", "Left")
+        SettingsStorage.setSetting("Right", "Right")
+    }
+
+    function loadKeyBindings(){
+        console.log("Loading key bindings.")
+        btConn.keyBindingA = SettingsStorage.getSetting("A")
+        btConn.keyBindingB = SettingsStorage.getSetting("B")
+        btConn.keyBindingC = SettingsStorage.getSetting("C")
+        btConn.keyBindingD = SettingsStorage.getSetting("D")
+
+        btConn.keyBindingUp = SettingsStorage.getSetting("Up")
+        btConn.keyBindingDown = SettingsStorage.getSetting("Down")
+        btConn.keyBindingLeft = SettingsStorage.getSetting("Left")
+        btConn.keyBindingRight = SettingsStorage.getSetting("Right")
+    }
+
+    function updateConnectButton(){
+        if((addressField.text !== "No device found yet.") && deviceInfo.currentBluetoothPowerState){
+            connectButton.enabled = true
+            infoText.text = "Press \"Connect\" to connect to the device."
+        }
     }
 
     states: [
@@ -86,8 +132,61 @@ Page {
                 target: labelD
                 color: "blue"
             }
+        },
+        State {
+            name: "connecting"
+            PropertyChanges {
+                target: scanButton
+                enabled: false
+            }
+            PropertyChanges {
+                target: addressField
+                enabled: false
+            }
+            PropertyChanges {
+                target: portField
+                enabled: false
+            }
+            PropertyChanges {
+                target: connectButton
+                enabled: false
+            }
+            PropertyChanges {
+                target: disconnectButton
+                enabled: false
+            }
+            PropertyChanges {
+                target: infoText
+                text: "Connecting..."
+            }
+        },
+        State {
+            name: "disconnected"
+            PropertyChanges {
+                target: scanButton
+                enabled: true
+            }
+            PropertyChanges {
+                target: addressField
+                enabled: true
+            }
+            PropertyChanges {
+                target: portField
+                enabled: true
+            }
+            PropertyChanges {
+                target: connectButton
+                enabled: true
+            }
+            PropertyChanges {
+                target: disconnectButton
+                enabled: false
+            }
+            PropertyChanges {
+                target: infoText
+                text: "Press \"Connect\" to connect to the device."
+            }
         }
-
     ]
 
     Connections {
@@ -102,132 +201,188 @@ Page {
         }
     }
 
-    Button{
-        id: scanButton
-        anchors{bottom: addressRow.top; bottomMargin: 10; horizontalCenter: parent.horizontalCenter}
-        enabled: true
-
-        text: "Scan"
-
-        onClicked: {
-            btDiscovery.discovery = true
+    Item {
+        id: headerItem
+        anchors{top: parent.top; left: parent.left; right: parent.right}
+        height: header.height
+        z: 1
+
+        Image {
+            id: header
+            height: 72
+            source: "image://theme/color8-meegotouch-view-header-fixed"
+            anchors.fill: parent
+
+            Text {
+                text: "QZeeControl"
+                color: "white"
+                font.family: "Nokia Pure Text Light"
+                font.pixelSize: 32
+                anchors.left: parent.left
+                anchors.leftMargin: 20
+                anchors.verticalCenter: parent.verticalCenter
+            }
         }
     }
 
-    Row{
-        id: addressRow
-        spacing: 5
-        anchors{bottom: infoText.top; bottomMargin: 10; horizontalCenter: parent.horizontalCenter}
+    Flickable {
+        anchors{top: headerItem.bottom; bottom: parent.bottom; left: parent.left; right: parent.right}
+        contentHeight: contentColumn.height
 
-        TextField{
-            id: addressField
-            text: "No device found yet."
+            Column{
+                id: contentColumn
+                spacing: 10
+                anchors{top: parent.top; left: parent.left; right: parent.right; topMargin: 10}
 
-            onTextChanged: {
-                if(text === "No device found yet.")
-                    return
+            Button{
+                id: scanButton
+                enabled: deviceInfo.currentBluetoothPowerState
 
-                connectButton.enabled = true
-                infoText.text = "Press \"Connect\" to connect to the device."
-                console.log("Storing address in DB: " + text)
-                SettingsStorage.setSetting("address", text)
-            }
-        }
-        TextField{
-            id: portField
-            text: "na"
-            width: 60
-            validator: IntValidator{}
+                anchors.horizontalCenter: parent.horizontalCenter
+                text: "Scan"
 
-            onTextChanged: {
-                if(text === "na")
-                    return
-
-                console.log("Storing port in DB: " + text)
-                SettingsStorage.setSetting("port", text)
+                onClicked: {
+                    btDiscovery.discovery = true
+                }
             }
-        }
-    }
 
-    Label {
-        id: infoText
-        anchors{bottom: connectButton.top; bottomMargin: 10; horizontalCenter: parent.horizontalCenter}
-        width: parent.width
+            Row{
+                id: addressRow
+                anchors.horizontalCenter: parent.horizontalCenter
+                spacing: 5
+
+                TextField{
+                    id: addressField
+                    text: "No device found yet."
+
+                    onTextChanged: {
+                        if(initializing)
+                            return
+
+                        if(text === "No device found yet.")
+                            return
+
+                        updateConnectButton();
+
+                        console.log("Storing address in DB: " + text)
+                        SettingsStorage.setSetting("address", text)
+                    }
+                }
+                TextField{
+                    id: portField
+                    text: "na"
+                    width: 60
+                    validator: IntValidator{}
+
+                    onTextChanged: {
+                        if(initializing)
+                            return
+
+                        if(text === "na")
+                            return
+
+                        console.log("Storing port in DB: " + text)
+                        SettingsStorage.setSetting("port", text)
+                    }
+                }
+            }
 
-        text: "Please scan for a device first."
-        horizontalAlignment: Text.AlignHCenter
-        wrapMode: Text.WordWrap
-    }
+            Label {
+                id: infoText
+                width: parent.width
 
-    Button{
-        id: connectButton
-        anchors{bottom: disconnectButton.top; bottomMargin: 10; horizontalCenter: parent.horizontalCenter}
-        enabled: false
+                text: "Please scan for a device first."
+                horizontalAlignment: Text.AlignHCenter
+                wrapMode: Text.WordWrap
+            }
 
-        text: "Connect"
+            Button{
+                id: connectButton
+                anchors.horizontalCenter: parent.horizontalCenter
+                enabled: false
 
-        onClicked: {
-            enabled = false
-            btConn.connect(addressField.text, parseInt(portField.text))
-        }
-    }
+                text: "Connect"
 
-    Button{
-        id: disconnectButton
-        anchors{bottom: buttonRow.top; bottomMargin: 10; horizontalCenter: parent.horizontalCenter}
+                onClicked: {
+                    mainPage.state = "connecting"
+                    btConn.connect(addressField.text, parseInt(portField.text))
+                }
+            }
 
-        text: "Disconnect"
+            Button{
+                id: disconnectButton
+                anchors.horizontalCenter: parent.horizontalCenter
 
-        onClicked: {
-            btConn.disconnect()
+                text: "Disconnect"
 
-        }
-    }
+                onClicked: {
+                    btConn.disconnect()
+                }
+            }
 
-    Row{
-        id: buttonRow
-        anchors.centerIn: parent
-        spacing: 20
+            Row{
+                id: buttonRow
+                anchors.horizontalCenter: parent.horizontalCenter
+
+                spacing: 20
+
+                Label{
+                    id: labelA
+                    text: "A"
+                    color: btConn.a ? "red" : "blue"
+                }
+                Label{
+                    id: labelB
+                    text: "B"
+                    color: btConn.b ? "red" : "blue"
+                }
+                Label{
+                    id: labelC
+                    text: "C"
+                    color: btConn.c ? "red" : "blue"
+                }
+                Label{
+                    id: labelD
+                    text: "D"
+                    color: btConn.d ? "red" : "blue"
+                }
+            }
 
-        Label{
-            id: labelA
-            text: "A"
-            color: btConn.a ? "red" : "blue"
-        }
-        Label{
-            id: labelB
-            text: "B"
-            color: btConn.b ? "red" : "blue"
-        }
-        Label{
-            id: labelC
-            text: "C"
-            color: btConn.c ? "red" : "blue"
-        }
-        Label{
-            id: labelD
-            text: "D"
-            color: btConn.d ? "red" : "blue"
+            Item{
+                id: testArea
+                anchors.horizontalCenter: parent.horizontalCenter
+                height: moveArea.height
+                width: moveArea.width
+
+                Rectangle{
+                    id: moveArea
+                    color: "gray"
+
+                    width: 256
+                    height: 256
+                }
+
+                Rectangle{
+                    id: cursorRectangle
+                    width: 10
+                    height: 10
+                    color: "red"
+
+                    x: moveArea.x + (moveArea.width * 0.5) + btConn.x - (cursorRectangle.width * 0.5)
+                    y: moveArea.y + (moveArea.height * 0.5) + btConn.y - (cursorRectangle.height * 0.5)
+                }
+            }
         }
     }
 
-    Rectangle{
-        id: moveArea
-        anchors{top: buttonRow.bottom; topMargin: 10; horizontalCenter: parent.horizontalCenter}
-        color: "gray"
+    DeviceInfo{
+        id: deviceInfo
 
-        width: 256
-        height: 256
-    }
-
-    Rectangle{
-        id: cursorRectangle
-        width: 10
-        height: 10
-        color: "red"
+        monitorBluetoothStateChanges: true
 
-        x: moveArea.x + (moveArea.width * 0.5) + btConn.x - (cursorRectangle.width * 0.5)
-        y: moveArea.y + (moveArea.height * 0.5) + btConn.y - (cursorRectangle.height * 0.5)
+        onBluetoothStateChanged: {
+            updateConnectButton()
+        }
     }
 
     BluetoothDiscoveryModel{
@@ -242,12 +397,18 @@ Page {
                 scanButton.enabled = false
                 connectButton.enabled = false
                 disconnectButton.enabled = false
+                addressField.enabled = false
+                portField.enabled = false
             }else{
                 scanButton.enabled = true
                 disconnectButton.enabled = false
+                addressField.enabled = true
+                portField.enabled = true
 
-                if(addressField.text !== "No device found yet." && portField.text !== "na")
+                if(addressField.text !== "No device found yet." && portField.text !== "na"){
+                    infoText.text = "Device found. You can now connect."
                     connectButton.enabled = true
+                }
             }
         }
 
@@ -258,6 +419,8 @@ Page {
             if(service.serviceName === "Zeemote"){
                 addressField.text = service.deviceAddress
                 portField.text = service.servicePort
+                discovery = false
+                console.log("Found device. Stopped further discovery.")
             }
         }
     }
@@ -265,7 +428,17 @@ Page {
     BtConnector{
         id: btConn
 
-        property int joystickThreshold: 50
+        threshold: 50
+
+        property string keyBindingA
+        property string keyBindingB
+        property string keyBindingC
+        property string keyBindingD
+
+        property string keyBindingUp
+        property string keyBindingDown
+        property string keyBindingLeft
+        property string keyBindingRight
 
         onConnected: {
             disconnectButton.enabled = true
@@ -273,9 +446,7 @@ Page {
         }
 
         onDisconnected: {
-            connectButton.enabled = true
-            disconnectButton.enabled = false
-            infoText.text = "Press \"Connect\" to connect to the device."
+            mainPage.state = "disconnected"
         }
 
 //        onStickMoved: {
@@ -288,42 +459,47 @@ Page {
 
         onAChanged: {
 //            console.log("A changed to: " + val)
-            xtstAdapter.sendKey("a", val);
+            xtstAdapter.sendKey(keyBindingA, val);
         }
         onBChanged: {
 //            console.log("B changed to: " + val)
-            xtstAdapter.sendKey("b", val);
+            xtstAdapter.sendKey(keyBindingB, val);
         }
         onCChanged: {
 //            console.log("C changed to: " + val)
-            xtstAdapter.sendKey("c", val);
+            xtstAdapter.sendKey(keyBindingC, val);
         }
         onDChanged: {
 //            console.log("D changed to: " + val)
-            xtstAdapter.sendKey("d", val);
+            xtstAdapter.sendKey(keyBindingD, val);
         }
 
-        onXChanged: {
-            if(val > joystickThreshold){
-                xtstAdapter.sendKey("Right", true);
-            }else if(val < -joystickThreshold){
-                xtstAdapter.sendKey("Left", true);
-            }else{
-                xtstAdapter.sendKey("Right", false);
-                xtstAdapter.sendKey("Left", false);
-            }
-        }
+        onUpChanged: xtstAdapter.sendKey(keyBindingUp, val)
+        onDownChanged: xtstAdapter.sendKey(keyBindingDown, val)
+        onLeftChanged: xtstAdapter.sendKey(keyBindingLeft, val)
+        onRightChanged: xtstAdapter.sendKey(keyBindingRight, val)
+
+//        onXChanged: {
+//            if(val > joystickThreshold){
+//                xtstAdapter.sendKey("Right", true);
+//            }else if(val < -joystickThreshold){
+//                xtstAdapter.sendKey("Left", true);
+//            }else{
+//                xtstAdapter.sendKey("Right", false);
+//                xtstAdapter.sendKey("Left", false);
+//            }
+//        }
 
-        onYChanged: {
-            if(val > joystickThreshold){
-                xtstAdapter.sendKey("Down", true);
-            }else if(val < -joystickThreshold){
-                xtstAdapter.sendKey("Up", true);
-            }else{
-                xtstAdapter.sendKey("Down", false);
-                xtstAdapter.sendKey("Up", false);
-            }
-        }
+//        onYChanged: {
+//            if(val > joystickThreshold){
+//                xtstAdapter.sendKey("Down", true);
+//            }else if(val < -joystickThreshold){
+//                xtstAdapter.sendKey("Up", true);
+//            }else{
+//                xtstAdapter.sendKey("Down", false);
+//                xtstAdapter.sendKey("Up", false);
+//            }
+//        }
     }
 
     XtstAdapter{