~mzanetti/unity8/launcher-follow-unity-api

« back to all changes in this revision

Viewing changes to Bottombar/Bottombar.qml

  • Committer: Michael Zanetti
  • Date: 2013-06-26 09:26:51 UTC
  • mfrom: (22.1.24 unity)
  • Revision ID: michael.zanetti@canonical.com-20130626092651-ku85xmvlt2pjgypx
merge trunk

Show diffs side-by-side

added added

removed removed

Lines of Context:
18
18
import "../Components"
19
19
import "../Components/Math.js" as MathLocal
20
20
import Unity 0.1
 
21
import Ubuntu.Gestures 0.1
21
22
 
22
23
Item {
23
24
    id: bottombar
24
 
    width: shell.width
25
 
    height: shell.height
 
25
 
 
26
    // Whether there's an application on foreground (as opposed to have shell's Dash on foreground)
 
27
    property bool applicationIsOnForeground
26
28
 
27
29
    property variant theHud
28
30
    property bool enabled: false
29
31
    readonly property real bottomEdgeButtonCenterDistance: units.gu(34)
30
 
    readonly property real bottomEdgeShowButtonDistance: units.gu(2)
31
 
 
32
 
    property bool __applicationInFocus: false
33
 
 
34
 
    state: "hidden"
 
32
 
 
33
    state: dragArea.status === DirectionalDragArea.Recognized ? "shown" : "hidden"
35
34
 
36
35
    HudButton {
37
36
        id: hudButton
38
37
 
39
 
        x: MathLocal.clamp(hudButtonRevealer.pressedX - width / 2, 0, bottombar.width - width)
40
 
        y: bottombar.height - bottomEdgeButtonCenterDistance - height / 2 - bottomMargin
 
38
        x: MathLocal.clamp(dragArea.touchStartX - (width / 2), 0, bottombar.width - width)
 
39
        y: bottombar.height - bottomEdgeButtonCenterDistance - (height / 2) - bottomMargin
 
40
 
 
41
        mouseOver: {
 
42
            if (dragArea.status === DirectionalDragArea.Recognized) {
 
43
                var touchLocal = mapFromItem(dragArea, dragArea.touchX, dragArea.touchY)
 
44
                return touchLocal.x > 0 && touchLocal.x < width
 
45
                    && touchLocal.y > 0 && touchLocal.y < height
 
46
            } else {
 
47
                return false
 
48
            }
 
49
        }
 
50
 
 
51
        onClicked: theHud.show()
 
52
 
41
53
        Behavior on bottomMargin {
42
54
            NumberAnimation{duration: hudButton.opacity < 0.01 ? 200 : 70; easing.type: Easing.OutQuart}
43
55
        }
44
 
        mouse: {
45
 
            if (hudButtonRevealer.draggingArea.pressed) {
46
 
                var mapped = mapFromItem(hudButtonRevealer.draggingArea, hudButtonRevealer.draggingArea.mouseX, hudButtonRevealer.draggingArea.mouseY)
47
 
                return Qt.point(mapped.x, mapped.y)
48
 
            } else {
49
 
                return mouse
50
 
            }
51
 
        }
52
56
 
53
57
        Behavior on opacity {
54
58
            NumberAnimation{ duration: 200; easing.type: Easing.OutCubic}
60
64
        onShownChanged: bottomBarVisibilityCommunicatorShell.forceHidden = theHud.shown
61
65
    }
62
66
 
63
 
    function updateApplicationInFocus() {
64
 
        if (shell.applicationManager.mainStageFocusedApplication || shell.applicationManager.sideStageFocusedApplication) {
65
 
            __applicationInFocus = true
66
 
        } else {
67
 
            __applicationInFocus = false
68
 
        }
69
 
    }
70
 
 
71
 
    Connections {
72
 
        target: shell.applicationManager
73
 
        ignoreUnknownSignals: true
74
 
        onMainStageFocusedApplicationChanged: updateApplicationInFocus()
75
 
        onSideStageFocusedApplicationChanged: updateApplicationInFocus()
76
 
    }
77
 
 
78
 
    Showable {
79
 
        id: hudButtonShowable
80
 
 
81
 
        opacity: 1.0
 
67
    DirectionalDragArea {
 
68
        id: dragArea
82
69
        width: parent.width
83
 
        height: bottomEdgeShowButtonDistance
84
 
        shown: false
85
 
        showAnimation: StandardAnimation { property: "y"; duration: 350; to: hudButtonRevealer.openedValue; easing.type: Easing.OutCubic }
86
 
        hideAnimation: StandardAnimation { property: "y"; duration: 350; to: hudButtonRevealer.closedValue; easing.type: Easing.OutCubic }
87
 
        onYChanged: {
88
 
            if (y == hudButtonRevealer.openedValue)
89
 
                bottombar.state = "shown"
90
 
        }
91
 
 
92
 
        // eater
93
 
        MouseArea {
94
 
            anchors.fill: parent
95
 
        }
96
 
    }
97
 
 
98
 
    Revealer {
99
 
        id: hudButtonRevealer
100
 
 
101
 
        property double pressedX
102
 
 
103
 
        enabled: !theHud.shown && bottombar.enabled && __applicationInFocus
104
 
        direction: Qt.RightToLeft
105
 
        openedValue: bottombar.height - height
106
 
        closedValue: bottombar.height
107
 
        target: hudButtonShowable
108
 
        width: hudButtonShowable.width
109
 
        height: hudButtonShowable.height
110
 
        anchors.bottom: bottombar.bottom
111
 
        onOpenPressed: {
112
 
            pressedX = mouseX
113
 
        }
114
 
 
115
 
        onOpenReleased: {
116
 
            if (hudButton.opacity != 0 && hudButton.mouseOver) {
117
 
                hudButtonShowable.hide()
118
 
                theHud.show()
119
 
            } else {
120
 
                hudButtonShowable.hide()
121
 
            }
122
 
        }
123
 
    }
124
 
 
125
 
    Connections {
126
 
        target: hudButtonShowable.hideAnimation
127
 
        onRunningChanged: {
128
 
            if (hudButtonShowable.hideAnimation.running) {
129
 
                bottombar.state = "hidden"
130
 
            }
 
70
        height: distanceThreshold
 
71
        anchors.bottom: parent.bottom
 
72
 
 
73
        enabled: !theHud.shown && bottombar.enabled && applicationIsOnForeground
 
74
        direction: Direction.Upwards
 
75
 
 
76
        // values to be tweaked and later removed from here and set in stone as defaults
 
77
        // once we are confident it's all good.
 
78
        maxDeviation: units.gu(1)
 
79
        wideningAngle: 30
 
80
        distanceThreshold: units.gu(3)
 
81
        minSpeed: units.gu(5)
 
82
 
 
83
        property int previousStatus: -1
 
84
        property real touchStartX: -1
 
85
 
 
86
        onStatusChanged: {
 
87
            if (status === DirectionalDragArea.WaitingForTouch) {
 
88
                if (previousStatus == DirectionalDragArea.Recognized) {
 
89
                    if (hudButton.mouseOver) {
 
90
                        hudButton.clicked()
 
91
                    }
 
92
                }
 
93
            } else if (status === DirectionalDragArea.Undecided) {
 
94
                touchStartX = touchX
 
95
            }
 
96
            previousStatus = status
131
97
        }
132
98
    }
133
99