on 406e614 help sign in
unity8/Components/FilterGrid.qml
112 lines 4.4 kB history raw
1/*
2 * Copyright (C) 2013 Canonical, Ltd.
3 *
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.
7 *
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.
12 *
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/>.
15 */
17import QtQuick 2.0
18import Ubuntu.Components 0.1
19import Utils 0.1
20import "../Components"
22/*
23 A ResponsiveGridView that can optionally have the number of rows being displayed
24 reduced to collapsedRowCount, in which case a button saying "View all (123)"
25 will be shown at the bottom. If clicked, FilterGrid will them expand vertically
26 to display all rows.
27 */
28Item {
29 id: root
31 /* If true, the number of elements displayed will be limited by collapsedRowCount.
32 If false, all elements will be displayed, effectively looking the same as a regular
33 ResponsiveGridView. */
34 property bool filter: true
36 /* Whether, when collapsed, a button should be displayed enabling the user to expand
37 the grid to its full size. */
38 readonly property bool expandable: model.count > collapsedRowCount * iconTileGrid.columns
40 property var model: null
42 /* Maximum number of rows to be show when filter=true. */
43 property int collapsedRowCount: 2
44 property int uncollapsedRowCount: Math.ceil(model.count / columns)
45 readonly property int collapsedHeight: {
46 return iconTileGrid.contentHeightForRows(Math.min(collapsedRowCount, Math.ceil(model.count / columns)))
47 }
48 readonly property int uncollapsedHeight: {
49 return iconTileGrid.contentHeightForRows(uncollapsedRowCount)
50 }
52 property alias minimumHorizontalSpacing: iconTileGrid.minimumHorizontalSpacing
53 property alias maximumNumberOfColumns: iconTileGrid.maximumNumberOfColumns
54 property alias columns: iconTileGrid.columns
55 property alias delegateWidth: iconTileGrid.delegateWidth
56 property alias delegateHeight: iconTileGrid.delegateHeight
57 property alias verticalSpacing: iconTileGrid.verticalSpacing
58 readonly property alias margins: iconTileGrid.margins
59 property alias delegate: iconTileGrid.delegate
60 property alias cellWidth: iconTileGrid.cellWidth
61 property alias cellHeight: iconTileGrid.cellHeight
62 property alias delegateCreationBegin: iconTileGrid.delegateCreationBegin
63 property alias delegateCreationEnd: iconTileGrid.delegateCreationEnd
64 readonly property alias flicking: iconTileGrid.flicking
65 readonly property alias moving: iconTileGrid.moving
66 readonly property alias pressDelay: iconTileGrid.pressDelay
67 property alias highlightIndex: iconTileGrid.highlightIndex
68 readonly property alias currentItem: iconTileGrid.currentItem
70 height: !filterAnimation.running ? childrenRect.height : height
71 clip: filterAnimation.running
73 NumberAnimation {
74 property bool filterEndValue
75 id: filterAnimation
76 target: root
77 property: "height"
78 to: filterEndValue ? root.collapsedHeight : root.uncollapsedHeight
79 // Duration and easing here match the ListViewWithPageHeader::m_contentYAnimation
80 // otherwise since both animations can run at the same time you'll get
81 // some visual weirdness.
82 duration: 200
83 easing.type: Easing.InOutQuad
84 onStopped: {
85 root.filter = filterEndValue;
86 }
87 }
89 function startFilterAnimation(filter) {
90 filterAnimation.filterEndValue = filter
91 filterAnimation.start();
92 }
94 ResponsiveGridView {
95 id: iconTileGrid
97 anchors { left: parent.left; right: parent.right }
98 height: totalContentHeight
99 interactive: false
101 minimumHorizontalSpacing: units.gu(0.5)
102 maximumNumberOfColumns: 6
103 delegateWidth: units.gu(11)
104 delegateHeight: units.gu(9.5)
105 verticalSpacing: units.gu(2)
107 model: LimitProxyModel {
108 model: root.model
109 limit: (filter && !filterAnimation.running) ? collapsedRowCount * iconTileGrid.columns : -1
110 }
111 }