18 import Ubuntu.Components 0.1
21 import Unity.Application 0.1
22 import
"../Components"
23 import "../Components/ListItems" as ListItems
28 property var scope: null
29 property SortFilterProxyModel categories: categoryFilter
30 property bool isCurrent:
false
31 property alias moving: categoryView.moving
32 property int tabBarHeight: 0
33 property PageHeader pageHeader: null
34 property Item previewListView: null
36 property bool enableHeightBehaviorOnNextCreation:
false
37 property var categoryView: categoryView
41 scope.activateApplication.connect(activateApp);
45 function activateApp(appId) {
46 shell.activateApplication(appId);
49 function positionAtBeginning() {
50 categoryView.positionAtBeginning()
53 function showHeader() {
54 categoryView.showHeader()
60 value: isCurrent && !previewListView.open
63 SortFilterProxyModel {
65 model: scope ? scope.categories : null
66 dynamicSortFilter:
true
67 filterRole: Categories.RoleCount
73 pageHeader.resetSearch();
74 previewListView.open =
false;
78 target: scopeView.scope
79 property:
"searchQuery"
80 value: pageHeader.searchQuery
86 property:
"searchQuery"
87 value: scopeView.scope ? scopeView.scope.searchQuery :
""
93 onSearchClicked:
if (isCurrent) {
94 pageHeader.triggerSearch()
95 categoryView.showHeader()
100 target: scopeView.scope
101 onShowDash: previewListView.open =
false;
102 onHideDash: previewListView.open =
false;
107 objectName:
"categoryListView"
109 model: scopeView.categories
110 forceNoClip: previewListView.open
112 property string expandedCategoryId:
""
114 onContentYChanged: pageHeader.positionRealHeader();
115 onOriginYChanged: pageHeader.positionRealHeader();
116 onContentHeightChanged: pageHeader.positionRealHeader();
118 delegate: ListItems.Base {
120 objectName:
"dashCategory" + category
121 highlightWhenPressed:
false
124 readonly
property bool expandable: rendererLoader.item ? rendererLoader.item.expandable :
false
125 readonly
property bool filtered: rendererLoader.item ? rendererLoader.item.filtered :
true
126 readonly
property string category: categoryId
127 readonly
property var item: rendererLoader.item
131 objectName:
"cardTool"
133 template: model.renderer
134 components: model.components
135 viewWidth: parent.width
144 topMargin: hasSectionHeader ? 0 : units.gu(2)
148 switch (cardTool.categoryLayout) {
149 case "carousel":
return "CardCarousel.qml";
150 case "vertical-journal":
return "CardVerticalJournal.qml";
151 case "running-apps":
return "Apps/RunningApplicationsGrid.qml";
153 default:
return "CardFilterGrid.qml";
158 if (item.enableHeightBehavior !== undefined && item.enableHeightBehaviorOnNextCreation !== undefined) {
159 item.enableHeightBehavior = scopeView.enableHeightBehaviorOnNextCreation;
160 scopeView.enableHeightBehaviorOnNextCreation =
false;
162 if (source.toString().indexOf(
"Apps/RunningApplicationsGrid.qml") != -1) {
165 item.model = Qt.binding(
function() {
return runningApps; })
166 item.canEnableTerminationMode = Qt.binding(
function() { return scopeView.isCurrent })
168 item.model = Qt.binding(
function() {
return results })
170 item.objectName = Qt.binding(
function() { return categoryId })
171 if (item.expandable) {
172 var shouldFilter = categoryId != categoryView.expandedCategoryId;
173 item.setFilter(shouldFilter,
false );
175 updateDelegateCreationRange();
176 item.cardTool = cardTool;
179 Component.onDestruction: {
180 if (item.enableHeightBehavior !== undefined && item.enableHeightBehaviorOnNextCreation !== undefined) {
181 scopeView.enableHeightBehaviorOnNextCreation = item.enableHeightBehaviorOnNextCreation;
186 target: rendererLoader.item
188 if (scopeView.scope.id ===
"scopes" || (scopeView.scope.id ==
"clickscope" && (categoryId ==
"local" || categoryId ==
"store"))) {
192 scopeView.scope.activate(result)
194 previewListView.model = target.model;
195 previewListView.currentIndex = -1
196 previewListView.currentIndex = index;
197 previewListView.open =
true
201 previewListView.model = target.model;
202 previewListView.currentIndex = -1
203 previewListView.currentIndex = index;
204 previewListView.open =
true
206 onExpandableChanged: {
209 if (rendererLoader.item.expandable) {
210 var shouldFilter = baseItem.category != categoryView.expandedCategoryId;
211 rendererLoader.item.setFilter(shouldFilter,
false );
217 onExpandedCategoryIdChanged: {
218 collapseAllButExpandedCategory();
220 function collapseAllButExpandedCategory() {
221 var item = rendererLoader.item;
222 if (item.expandable) {
223 var shouldFilter = categoryId != categoryView.expandedCategoryId;
224 if (shouldFilter != item.filter) {
226 var shrinkingVisible = shouldFilter && y + item.collapsedHeight < categoryView.height;
227 var growingVisible = !shouldFilter && y + height < categoryView.height;
228 if (!previewListView.open || !shouldFilter) {
229 var animate = shrinkingVisible || growingVisible;
230 item.setFilter(shouldFilter, animate)
231 if (!shouldFilter && !previewListView.open) {
232 categoryView.maximizeVisibleArea(index, item.uncollapsedHeight);
238 onOriginYChanged: rendererLoader.updateDelegateCreationRange();
239 onContentYChanged: rendererLoader.updateDelegateCreationRange();
240 onHeightChanged: rendererLoader.updateDelegateCreationRange();
241 onContentHeightChanged: rendererLoader.updateDelegateCreationRange();
244 function updateDelegateCreationRange() {
245 if (categoryView.moving) {
248 if (categoryView.contentY < categoryView.originY) {
250 }
else if (categoryView.contentHeight - categoryView.originY > categoryView.height &&
251 categoryView.contentY + categoryView.height > categoryView.contentHeight) {
256 if (item && item.hasOwnProperty(
"displayMarginBeginning")) {
259 if (baseItem.y + baseItem.height <= 0) {
261 item.displayMarginBeginning = -baseItem.height;
262 item.displayMarginEnd = 0;
263 }
else if (baseItem.y >= categoryView.height) {
265 item.displayMarginBeginning = 0;
266 item.displayMarginEnd = -baseItem.height;
268 item.displayMarginBeginning = -Math.max(-baseItem.y, 0);
269 item.displayMarginEnd = -Math.max(baseItem.height - categoryView.height + baseItem.y, 0)
281 fillMode: Image.Stretch
282 source:
"graphics/dash_divider_top_lightgrad.png"
288 visible: index != categoryView.model.count - 1
290 bottom: parent.bottom
294 fillMode: Image.Stretch
295 source:
"graphics/dash_divider_top_darkgrad.png"
300 onHeightChanged: rendererLoader.updateDelegateCreationRange();
301 onYChanged: rendererLoader.updateDelegateCreationRange();
304 sectionProperty:
"name"
305 sectionDelegate: ListItems.Header {
306 objectName:
"dashSectionHeader" + (delegate ? delegate.category :
"")
307 property var delegate: categoryView.item(delegateIndex)
308 width: categoryView.width
311 if (delegate && delegate.expandable)
312 return delegate.filtered ?
"graphics/header_handlearrow.png" :
"graphics/header_handlearrow2.png"
316 if (categoryView.expandedCategoryId != delegate.category)
317 categoryView.expandedCategoryId = delegate.category;
319 categoryView.expandedCategoryId =
"";
323 implicitHeight: scopeView.tabBarHeight
325 if (scopeView.pageHeader && scopeView.isCurrent) {
326 scopeView.pageHeader.height = height;
329 onYChanged: positionRealHeader();
331 function positionRealHeader() {
332 if (scopeView.pageHeader && scopeView.isCurrent) {
333 scopeView.pageHeader.y = y + parent.y;