2 * Copyright (C) 2014 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 1.3
20 import "../Components"
25 property alias scopesListFlickable: scopesListFlickable
27 // Properties set by parent
28 property var scope: null
30 // Properties used by parent
31 readonly property bool processing: scope ? (scope.searchInProgress || scope.activationInProgress) : false
36 signal requestFavorite(string scopeId, bool favorite)
37 signal requestFavoriteMoveTo(string scopeId, int index)
38 signal requestRestore(string scopeId)
43 property bool dragging: false
44 property var dragItem: new Object();
46 readonly property bool fuzzyAtYEnd: {
47 var contentHeight = root.scopesListFlickable.contentHeight
48 var contentY = root.scopesListFlickable.contentY
49 var dragItemHeight = dragItem ? autoscroller.dragItem.height : 0
50 var flickableHeight = root.scopesListFlickable.height
55 return contentY >= (contentHeight - flickableHeight) - dragItemHeight
59 readonly property real bottomBoundary: {
60 var contentHeight = root.scopesListFlickable.contentHeight
61 var contentY = root.scopesListFlickable.contentY
62 var dragItemHeight = dragItem ? autoscroller.dragItem.height : 0
63 var heightRatio = root.scopesListFlickable.visibleArea.heightRatio
68 return (heightRatio * contentHeight) -
69 (1.5 * dragItemHeight) + contentY
73 readonly property int delayMs: 32
74 readonly property real topBoundary: dragItem ? root.scopesListFlickable.contentY + (.5 * dragItem.height) : 0
77 readonly property real maxStep: units.dp(10)
78 function stepSize(scrollingUp) {
81 delta = dragItem.y - topBoundary;
82 delta /= (1.5 * dragItem.height);
84 delta = dragItem.y - bottomBoundary;
85 delta /= (1.5 * dragItem.height);
88 step = Math.abs(delta) * autoscroller.maxStep
89 return Math.ceil(step);
94 interval: autoscroller.delayMs
95 running: autoscroller.dragItem ? (autoscroller.dragging &&
96 autoscroller.dragItem.y < autoscroller.topBoundary &&
97 !root.scopesListFlickable.atYBeginning) : false
100 root.scopesListFlickable.contentY -= autoscroller.stepSize(true);
101 autoscroller.dragItem.y -= autoscroller.stepSize(true);
106 interval: autoscroller.delayMs
107 running: autoscroller.dragItem ? (autoscroller.dragging &&
108 autoscroller.dragItem.y >= autoscroller.bottomBoundary &&
109 !autoscroller.fuzzyAtYEnd) : false
112 root.scopesListFlickable.contentY += autoscroller.stepSize(false);
113 autoscroller.dragItem.y += autoscroller.stepSize(false);
118 function autoscroll(dragging, dragItem) {
120 autoscroller.dragItem = dragItem
121 autoscroller.dragging = true;
123 autoscroller.dragItem = null;
124 autoscroller.dragging = false
130 property var scopeStyle: ScopeStyle {}
133 if (state == "edit") {
134 // As per design entering edit mode clears the possible existing search
135 header.resetSearch(false /* false == unfocus */);
145 objectName: "pageHeader"
146 title: i18n.tr("Manage")
150 backIsClose: root.state == "edit"
151 storeEntryEnabled: root.state == "browse"
152 searchEntryEnabled: false
153 scopeStyle: root.scopeStyle
156 root.state = "browse"
161 onStoreClicked: root.storeClicked();
166 id: scopesListFlickable
167 objectName: "scopesListFlickable"
170 bottom: parent.bottom
175 model: scope ? scope.categories : null
179 active: results.count > 0
181 sourceComponent: ScopesListCategory {
182 objectName: "scopesListCategory" + categoryId
187 if (isFavoritesFeed) return i18n.tr("Home");
188 else if (isAlsoInstalled) return i18n.tr("Also installed");
192 editMode: root.state == "edit"
193 scopeStyle: root.scopeStyle
194 isFavoritesFeed: categoryId == "favorites"
195 isAlsoInstalled: categoryId == "other"
197 onItemDragging: autoscroll(dragging, dragItem);
198 onRequestFavorite: root.requestFavorite(scopeId, favorite);
199 onRequestEditMode: root.state = "edit";
200 onRequestScopeMoveTo: root.requestFavoriteMoveTo(scopeId, index);
201 onRequestActivate: root.scope.activate(result, categoryId);
202 onRequestRestore: root.requestRestore(scopeId);