Qt Reference Documentation

# BubbleLevel.qml Example File

demos/mobile/qtbubblelevel/qml/BubbleLevel.qml

     /****************************************************************************
     **
     ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
     ** All rights reserved.
     ** Contact: Nokia Corporation (qt-info@nokia.com)
     **
     ** This file is part of the QtDeclarative module of the Qt Toolkit.
     **
     ** $QT_BEGIN_LICENSE:BSD$
     ** You may use this file under the terms of the BSD license as follows:
     **
     ** "Redistribution and use in source and binary forms, with or without
     ** modification, are permitted provided that the following conditions are
     ** met:
     **   * Redistributions of source code must retain the above copyright
     **     notice, this list of conditions and the following disclaimer.
     **   * Redistributions in binary form must reproduce the above copyright
     **     notice, this list of conditions and the following disclaimer in
     **     the documentation and/or other materials provided with the
     **     distribution.
     **   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
     **     the names of its contributors may be used to endorse or promote
     **     products derived from this software without specific prior written
     **     permission.
     **
     ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
     ** $QT_END_LICENSE$
     **
     ****************************************************************************/

     import QtQuick 1.0

     Image {
         id: bubbleLevel

         // Signaled when task switcher button is pressed
         signal minimizeApplication()

         // Signaled when correction angle is saved
         signal saveCorrectionAngle(variant angle)

         // These functions are used as Qt slots
         function handleRotation(deg) {
             horTube.rawangle = deg
         }

         function setCorrectionAngle(deg) {
             horTube.angleconstant = deg
         }

         // Used to show the task switcher button in Maemo targets
         property alias taskSwitcherVisible: taskSwitcher.visible

         anchors.fill: parent
         source: "images/board.png"
         smooth: true

         MouseArea {
             anchors.fill: parent
             onClicked: sign.frontSide = true
         }

         Button {
             id: taskSwitcher

             anchors {
                 left: parent.left
                 right: horTube.left
                 verticalCenter: horTube.verticalCenter
                 margins: (parent.width - (horTube.x + horTube.width)) / 4
             }

             height: width
             source: "images/taskswitcher.png"
             mouseAreaScale: 2
             onClicked: bubbleLevel.minimizeApplication()
             visible: false
         }

         Button {
             id: exitButton

             anchors {
                 left: horTube.right
                 right: parent.right
                 verticalCenter: horTube.verticalCenter
                 margins: (parent.width - (horTube.x + horTube.width)) / 4
             }

             height: width
             source: "images/exit.png"
             mouseAreaScale: 2
             onClicked: Qt.quit()
         }

         Tube {
             id: horTube

             property real rawangle: 0
             property real angleconstant: 0

             anchors.horizontalCenter: parent.horizontalCenter
             width: parent.width * 0.775; height: parent.height * 0.15625
             deg: rawangle - angleconstant
         }

         Flipable {
             id: sign

             property bool frontSide: true

             x: parent.width * 0.185; y: parent.height * 0.669
             width: parent.width * 0.63; height: parent.height * 0.258

             MouseArea {
                 anchors.fill: parent
                 onClicked: sign.frontSide = !sign.frontSide
                 z: -1
             }

             transform: Rotation {

                 origin.x: sign.width / 2; origin.y: sign.height / 2
                 axis.x: 1; axis.y: 0; axis.z: 0
                 angle: sign.frontSide ? 0 : 180

                 Behavior on angle {
                     RotationAnimation {
                         direction: RotationAnimation.Clockwise
                         easing.type: Easing.InOutCubic; duration: 300
                     }
                 }
             }

             front: Image {
                 anchors.fill: parent
                 source: "images/signwithtext.png"
                 smooth: true
             }

             back: Image {
                 anchors.fill: parent
                 source: "images/signblank.png"
                 smooth: true

                 Text {
                     id: oldValue

                     anchors {
                         left: parent.left; leftMargin: parent.width * 0.10
                         right: saveButton.left; rightMargin: 10
                         verticalCenter: parent.verticalCenter
                     }

                     text: "Place the device on a level surface and tap Calibrate."
                     color: "#302020"
                     wrapMode: Text.WordWrap
                     font { bold: false; pixelSize: Math.min(parent.width, parent.height) * 0.19 }
                 }

                 Button {
                     id: saveButton

                     anchors {
                         right: parent.right; rightMargin: parent.width * 0.09
                         verticalCenter: parent.verticalCenter
                     }

                     width: parent.width * 0.25; height: parent.height * 0.65
                     border { width: 2; color: "#555555" }
                     radius: 10

                     onClicked: {
                         horTube.angleconstant = horTube.rawangle
                         saveCorrectionAngle(horTube.angleconstant)
                     }

                     gradient: Gradient {
                         GradientStop { position: 0.0; color: "#999999" }
                         GradientStop { position: 0.2; color: "#BBBBBB" }
                         GradientStop { position: 0.8; color: "#BBBBBB" }
                         GradientStop { position: 1.0; color: "#999999" }
                     }

                     Text {
                         anchors.centerIn: parent
                         color: "#302020"
                         text: "Calibrate"
                         font { bold: true; pixelSize: parent.width * 0.15 }
                         smooth: true
                     }
                 }
             }
         }

         Button {
             anchors {
                 left: sign.right
                 right: parent.right
                 verticalCenter: sign.verticalCenter
                 margins: (parent.width - (sign.x + sign.width)) / 4
             }

             height: width
             source: "images/calibbutton.png"
             mouseAreaScale: 2
             smooth: true

             onClicked: sign.frontSide = !sign.frontSide
         }
     }