Skip to content
main.qml 6.87 KiB
Newer Older
/*
    This file is part of Gabriel's Qt/QML CardBoard Sample (or short GQQCS)

    GQQCS is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    GQQCS is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with Foobar.  If not, see <http://www.gnu.org/licenses/>.

    Updated: 07/08/2015 by: Gabriel F.
*/

import QtQuick 2.4
import QtQuick.Window 2.2
import QtSensors 5.0

Window {
    id: mainRoot
    property string fileName: "main.qml"
    property bool   debug: false
    property double l_scale: 0.5
    property bool   stereo: true
    property bool   gyro: false
    property bool   useGyro: true
    property string appState: "Unknown"
    onAppStateChanged: {
        console.log(appState)
        if (appState != "Active" && !config.visible) {
            Qt.quit()
        }
    }

    property var rotations: []
    property int updateCounter: 0
    onUpdateCounterChanged: {
        if (updateCounter > 1000) {
            updateCounter = 0
        }
        mainSensorLoop()
    }

    property var rotXY: {"x":0,"y":0}

    visible: true
    width: 1280*l_scale
    height: 720*l_scale
    color: "black"

    LocaleHelper {
        id: localeHelper
        loadCallback: function() { config.visible = true }
    }

    function logMe(message,owner,filename) {
        if (debug) {
            console.log(filename+" || "+owner+" || "+message)
        }
    }

    //Sensors
    function startSensor() {
        var types = []
        types = QmlSensors.sensorTypes();
        console.log(types.join(", "));
        if (types.indexOf("QRotationSensor") >= 0) {
            rotSensor.start()
        } else {
            logMe("NO ROTATION SENSOR AVAILABLE","startSensor",fileName)
        }
    }

    function testGyro() {
        var types = []
        types = QmlSensors.sensorTypes();
        console.log(types.join(", "));
        if (types.indexOf("QRotationSensor") >= 0) {
            gyro = true
            useGyro = true
            logMe("testGyro: ROTATION SENSOR OK!","testGyro",fileName)
            return true
        } else {
            gyro = false
            useGyro = false
            stereo = false
            logMe("testGyro: NO ROTATION SENSOR AVAILABLE!","testGyro",fileName)
            return false
        }
    }

    RotationSensor {
        id: rotSensor
        onReadingChanged: {
            rotations.push([reading.x,reading.y,reading.z])
            if (rotations.length > 2) {
                rotations.shift()
                updateXY()
                updateCounter++
            }
        }
    }

    function updateXY() {
        var x = rotations[1][2] < 0 ? -rotations[1][2] : rotations[1][2]
        var vX = 6*(mainRoot.rotations[1][2] - mainRoot.rotations[0][2])
        var y = rotations[1][1] < 0 ? -rotations[1][1] : rotations[1][1]
        var vY = 6*(mainRoot.rotations[1][1] - mainRoot.rotations[0][1])
        var pY = (y-40)/70 < 0 ? 0 : (y-40)/70 > 1.0 ? 1.0 : (y-40)/70
        rotXY.x = vX
        rotXY.y = pY
    }

    function mainSensorLoop() {
        if ((menu.visible || sobre.visible) && !detail.visible) {
            if (useGyro) { menu.updateMenuPositionGyro() } else { menu.updateMenuPositionTouch() }
        }
    }

    Component.onCompleted: {
        if (!localeHelper.loaded) { localeHelper.loadLocaleData() }
        testGyro()
    }

    function startApp() {
        if (gyro && useGyro) { rotSensor.start() }
        splash.show()
    }

    Config {
        id: config
        continueCallback: function() { startApp() }
    }

    FakeSplash {
        id: splash
        timerEndCallback: function() { config.visible = false; introducao.show() }
    }

    Introducao {
        id: introducao
        fadeInEndCallback: function() { splash.hide() }
        panEndCallback: function() {  menu.show() }
    }

    property var accumTouch: { "x":0,"y":0 }
    property var accumTouchTemp: { "x":0,"y":0 }
    property var currentTouch: { "x":mainRoot.width*200,"y":mainRoot.height*200, "t": false}
    function hitwall() { touchArea.updateHits() }
    Menu {
        id: menu
        fadeInEndCallback: function() {
            introducao.hide();
        }
        fadeOutCallback: function() {
            splash.show()
        }

        MultiPointTouchArea {
            id: touchArea
            anchors.fill: parent
            visible: !useGyro
            enabled: visible
            property var origin: {"x":0,"y":0}
            touchPoints: [TouchPoint { id: point1 }]
            function updateHits() {
                var getImage = menu.getPosImage()
                accumTouch.x = getImage[0]
                accumTouch.y = getImage[1]
                origin.x = point1.x
                origin.y = point1.y
            }
            onPressed: {
                var getImage = menu.getPosImage()
                accumTouch.x = getImage[0]
                accumTouch.y = getImage[1]
                origin.x = point1.x
                origin.y = point1.y
                currentTouch.x = point1.x
                currentTouch.y = point1.y
                currentTouch.t = true
                updateCounter++
            }
            onUpdated: {
                var vY = point1.y - origin.y
                accumTouchTemp.x = point1.x - origin.x
                accumTouchTemp.y = vY
                currentTouch.x = point1.x
                currentTouch.y = point1.y
                currentTouch.t = point1.pressed
                updateCounter++
            }
            onReleased: {
                accumTouch.x += accumTouchTemp.x
                accumTouch.y += accumTouchTemp.y
                accumTouchTemp = {"x":0,"y":0}
                currentTouch.x = mainRoot.width*200
                currentTouch.y = mainRoot.height*200
                currentTouch.t = false
                updateCounter++
            }
        }
    }

    VideoTitle {
        id: videoTitle
        fadeInEndCallback: function() {
            logMe("videoTitle fadeInEndCallback -> show detail","videoTitle,fadeInEndCallback",fileName)
            detail.show()
        }
    }

    Detail {
        id: detail
        fadeInEndCallback: function() {
            videoTitle.hide()
            playVideo()
        }
    }

    Sobre {
        id: sobre
    }

    property string debugText: ""
    Text {
        text: debugText
        anchors.top: parent.top
        anchors.horizontalCenter: parent.horizontalCenter
        font.pixelSize: parent.height*0.04
        width: parent.width
        wrapMode: Text.WordWrap
        color: "white"
        visible: false
    }
}