@@ -1,416 +0,0 @@
2− * Copyright (C) 2013 Canonical, Ltd.
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
18−import Ubuntu.Components 0.1
19−import Ubuntu.Gestures 0.1
20−import Unity.Indicators 0.1 as Indicators
22−import "../Components"
23−import "../Components/ListItems"
29− property real openedHeight: units.gu(71)
30− property int panelHeight: units.gu(3)
31− property alias overFlowWidth: indicatorRow.overFlowWidth
32− property alias showAll: indicatorRow.showAll
33− // TODO: This should be sourced by device type (eg "desktop", "tablet", "phone"...)
34− property string profile: indicatorProfile
36− readonly property real hintValue: panelHeight + menuContent.headerHeight
37− readonly property int lockThreshold: openedHeight / 2
38− property bool fullyOpened: height == openedHeight
39− property bool partiallyOpened: height > panelHeight && !fullyOpened
40− property bool fullyClosed: height <= panelHeight
41− property bool contentEnabled: true
42− property bool initalizeItem: true
43− readonly property alias content: menuContent
44− property real unitProgress: (height - panelHeight) / (openedHeight - panelHeight)
45− property bool enableHint: true
46− property real showHintBottomMargin: 0
48− signal showTapped(point position)
50− // TODO: Perhaps we need a animation standard for showing/hiding? Each showable seems to
51− // use its own values. Need to ask design about this.
52− showAnimation: StandardAnimation {
57− hideAnimation: StandardAnimation {
61− easing.type: Easing.OutCubic
64− onOpenedHeightChanged: {
65− if (showAnimation.running) {
66− showAnimation.restart();
67− } else if (indicators.shown) {
68− height = openedHeight;
73− onHeightChanged: updateRevealProgressState(indicators.height - panelHeight - showHintBottomMargin, true)
75− function updateRevealProgressState(revealProgress, enableRelease) {
76− if (!showAnimation.running && !hideAnimation.running) {
77− if (revealProgress === 0) {
78− indicators.state = "initial";
79− } else if (enableHint && revealProgress > 0 && revealProgress <= hintValue) {
80− indicators.state = "hint";
81− } else if ((!enableHint || revealProgress > hintValue) && revealProgress < lockThreshold) {
82− indicators.state = "reveal";
83− } else if (revealProgress >= lockThreshold && lockThreshold > 0) {
84− indicators.state = "locked";
89− function calculateCurrentItem(xValue, useBuffer) {
93− var distanceFromRightEdge;
94− var bufferExceeded = false;
96− if (indicators.state == "commit" || indicators.state == "locked" || showAnimation.running || hideAnimation.running) return;
99− If user drags the indicator handle bar down a distance hintValue or less, this is 0.
100− If bar is dragged down a distance greater than or equal to lockThreshold, this is 1.
101− Otherwise it contains the bar's location as a fraction of the distance between hintValue (is 0) and lockThreshold (is 1).
103− var verticalProgress =
104− MathUtils.clamp((indicators.height - handle.height - hintValue) /
105− (lockThreshold - hintValue), 0, 1);
108− Vertical velocity check. Don't change the indicator if we're moving too quickly.
110− var verticalSpeed = Math.abs(yVelocityCalculator.calculate());
111− if (verticalSpeed >= 0.05 && !initalizeItem) {
116− Percentage of an indicator icon's width the user's press can stray horizontally from the
117− focused icon before we change focus to another icon. E.g. a value of 0.5 means you must
118− go right a distance of half an icon's width before focus moves to the icon on the right
120− var maxBufferThreshold = 0.5;
123− To help users find the indicator of their choice while opening the indicators, we add logic to add a
124− left/right buffer to each icon so it is harder for the focus to be moved accidentally to another icon,
125− as the user moves their finger down, but yet allows them to switch indicator if they want.
126− This buffer is wider the further the user's finger is from the top of the screen.
128− var effectiveBufferThreshold = maxBufferThreshold * verticalProgress;
130− rowCoordinates = indicatorRow.mapToItem(indicatorRow.row, xValue, 0);
131− // get the current delegate
132− currentItem = indicatorRow.row.itemAt(rowCoordinates.x, 0);
134− itemCoordinates = indicatorRow.row.mapToItem(currentItem, rowCoordinates.x, 0);
135− distanceFromRightEdge = (currentItem.width - itemCoordinates.x) / (currentItem.width);
136− console.log(distanceFromRightEdge);
137− if (currentItem != indicatorRow.currentItem) {
138− if (Math.abs(currentItem.ownIndex - indicatorRow.currentItemIndex) > 1) {
139− bufferExceeded = true;
141− if (indicatorRow.currentItemIndex < currentItem.ownIndex && distanceFromRightEdge < (1 - effectiveBufferThreshold)) {
142− bufferExceeded = true;
143− } else if (indicatorRow.currentItemIndex > currentItem.ownIndex && distanceFromRightEdge > effectiveBufferThreshold) {
144− bufferExceeded = true;
147− if ((!useBuffer || (useBuffer && bufferExceeded)) || indicatorRow.currentItemIndex < 0 || indicatorRow.currentItem == null) {
148− indicatorRow.setCurrentItem(currentItem);
151− // need to re-init the distanceFromRightEdge for offset calculation
152− itemCoordinates = indicatorRow.row.mapToItem(indicatorRow.currentItem, rowCoordinates.x, 0);
153− distanceFromRightEdge = (indicatorRow.currentItem.width - itemCoordinates.x) / (indicatorRow.currentItem.width);
155− indicatorRow.currentItemOffset = 1 - (distanceFromRightEdge * 2);
156− } else if (initalizeItem) {
157− indicatorRow.setDefaultItem();
158− indicatorRow.currentItemOffset = 0;
160− initalizeItem = indicatorRow.currentItem == null;
167− bottom: handle.bottom
174− id: visibleIndicators
179− objectName: "menuContent"
184− top: indicatorRow.bottom
187− indicatorsModel: visibleIndicators.model
188− visible: indicators.partiallyOpened || indicators.fullyOpened
189− clip: indicators.partiallyOpened
190− enabled: contentEnabled
192− //small shadow gradient at bottom of menu
197− bottom: parent.bottom
199− height: units.gu(0.5)
200− gradient: Gradient {
201− GradientStop { position: 0.0; color: "transparent" }
202− GradientStop { position: 1.0; color: "black" }
211− color: menuContent.color
216− bottom: parent.bottom
218− height: Math.max(Math.min(handleImage.height, indicators.height - handleImage.height), 0)
219− clip: height < handleImage.height
220− visible: menuContent.visible
224− source: "graphics/handle.sci"
229− bottom: parent.bottom
232− MouseArea { //prevent clicks passing through
233− anchors.fill: parent
239− objectName: "indicatorRow"
244− height: indicators.panelHeight
245− indicatorsModel: visibleIndicators.model
246− state: indicators.state
247− unitProgress: indicators.unitProgress
251− anchors.fill: indicatorRow
252− direction: Direction.Downwards
253− maxSilenceTime: 2000
254− distanceThreshold: 0
256− enabled: fullyOpened
257− onDraggingChanged: {
259− initalizeItem = true;
260− updateRevealProgressState(Math.max(touchSceneY - panelHeight, hintValue), false);
261− indicators.calculateCurrentItem(touchX, false);
263− indicators.state = "commit";
264− indicatorRow.currentItemOffset = 0;
269− indicators.calculateCurrentItem(touchX, true);
271− onTouchSceneYChanged: {
272− updateRevealProgressState(Math.max(touchSceneY - panelHeight, hintValue), false);
273− yVelocityCalculator.trackedPosition = touchSceneY;
279− target: showAnimation
281− if (showAnimation.running) {
282− indicators.state = "commit";
283− indicatorRow.currentItemOffset = 0;
289− target: hideAnimation
291− if (hideAnimation.running) {
292− indicators.state = "initial";
293− initalizeItem = true;
294− indicatorRow.currentItemOffset = 0;
301− property bool enableIndexChangeSignal: true
302− property var activeDragHandle: showDragHandle.dragging ? showDragHandle : hideDragHandle.dragging ? hideDragHandle : null
307− onCurrentMenuIndexChanged: {
308− var oldActive = d.enableIndexChangeSignal;
309− if (!oldActive) return;
310− d.enableIndexChangeSignal = false;
312− indicatorRow.setCurrentItemIndex(menuContent.currentMenuIndex);
314− d.enableIndexChangeSignal = oldActive;
319− target: indicatorRow
320− onCurrentItemIndexChanged: {
321− var oldActive = d.enableIndexChangeSignal;
322− if (!oldActive) return;
323− d.enableIndexChangeSignal = false;
325− menuContent.setCurrentMenuIndex(indicatorRow.currentItemIndex, fullyOpened || partiallyOpened);
327− d.enableIndexChangeSignal = oldActive;
330− // connections to the active drag handle
332− target: d.activeDragHandle
334− indicators.calculateCurrentItem(d.activeDragHandle.touchX, true);
336− onTouchSceneYChanged: {
337− yVelocityCalculator.trackedPosition = d.activeDragHandle.touchSceneY;
343− anchors.bottom: parent.bottom
344− // go beyond parent so that it stays reachable, at the top of the screen.
345− anchors.bottomMargin: showHintBottomMargin
346− anchors.left: parent.left
347− anchors.right: parent.right
349− direction: Direction.Downwards
350− enabled: !indicators.shown && indicators.available
351− hintDisplacement: enableHint ? indicators.hintValue : 0
352− autoCompleteDragThreshold: maxTotalDragDistance / 2
354− maxTotalDragDistance: openedHeight - panelHeight
355− distanceThreshold: panelHeight
357− onTapped: showTapped(Qt.point(touchSceneX, touchSceneY));
362− anchors.fill: handle
363− direction: Direction.Upwards
364− enabled: indicators.shown && indicators.available
365− hintDisplacement: indicators.hintValue
366− autoCompleteDragThreshold: maxTotalDragDistance / 6
368− maxTotalDragDistance: openedHeight - panelHeight
369− distanceThreshold: 0
372− AxisVelocityCalculator {
373− id: yVelocityCalculator
384− if (d.activeDragHandle) {
385− calculateCurrentItem(d.activeDragHandle.touchX, false);
407− NumberAnimation {targets: [indicatorRow, menuContent]; property: "y"; duration: 300; easing.type: Easing.OutCubic}
411− Component.onCompleted: initialise();
412− function initialise() {
413− visibleIndicators.load(profile);
414− indicatorRow.setDefaultItem();