1 /***************************************************************************
2 * Copyright (C) 2011 by Peter Penz <peter.penz19@gmail.com> *
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; either version 2 of the License, or *
7 * (at your option) any later version. *
9 * This program is distributed in the hope that it will be useful, *
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
12 * GNU General Public License for more details. *
14 * You should have received a copy of the GNU General Public License *
15 * along with this program; if not, write to the *
16 * Free Software Foundation, Inc., *
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
18 ***************************************************************************/
20 #ifndef KITEMLISTVIEWLAYOUTER_H
21 #define KITEMLISTVIEWLAYOUTER_H
23 #include <libdolphin_export.h>
31 class KItemListSizeHintResolver
;
34 * @brief Internal helper class for KItemListView to layout the items.
36 * The layouter is capable to align the items within a grid. If the
37 * scroll-direction is horizontal the column-width of the grid can be
38 * variable. If the scroll-direction is vertical the row-height of
39 * the grid can be variable.
41 * The layouter is implemented in a way that it postpones the expensive
42 * layout operation until a property is read the first time after
43 * marking the layouter as dirty (see markAsDirty()). This means that
44 * changing properties of the layouter is not expensive, only the
45 * first read of a property can get expensive.
47 class LIBDOLPHINPRIVATE_EXPORT KItemListViewLayouter
: public QObject
52 KItemListViewLayouter(QObject
* parent
= 0);
53 virtual ~KItemListViewLayouter();
55 void setScrollOrientation(Qt::Orientation orientation
);
56 Qt::Orientation
scrollOrientation() const;
58 void setSize(const QSizeF
& size
);
61 void setItemSize(const QSizeF
& size
);
62 QSizeF
itemSize() const;
65 * Margin between the rows and columns of items.
67 void setItemMargin(const QSizeF
& margin
);
68 QSizeF
itemMargin() const;
71 * Sets the height of the header that is always aligned
72 * at the top. A height of <= 0.0 means that no header is
75 void setHeaderHeight(qreal height
);
76 qreal
headerHeight() const;
79 * Sets the height of the group header that is used
80 * to indicate a new item group.
82 void setGroupHeaderHeight(qreal height
);
83 qreal
groupHeaderHeight() const;
86 * Sets the margin between the last items of the group n and
87 * the group header for the group n + 1.
89 void setGroupHeaderMargin(qreal margin
);
90 qreal
groupHeaderMargin() const;
92 void setScrollOffset(qreal scrollOffset
);
93 qreal
scrollOffset() const;
95 qreal
maximumScrollOffset() const;
97 void setItemOffset(qreal scrollOffset
);
98 qreal
itemOffset() const;
100 qreal
maximumItemOffset() const;
102 void setModel(const KItemModelBase
* model
);
103 const KItemModelBase
* model() const;
105 void setSizeHintResolver(const KItemListSizeHintResolver
* sizeHintResolver
);
106 const KItemListSizeHintResolver
* sizeHintResolver() const;
109 * @return The first (at least partly) visible index. -1 is returned
110 * if the item count is 0.
112 int firstVisibleIndex() const;
115 * @return The last (at least partly) visible index. -1 is returned
116 * if the item count is 0.
118 int lastVisibleIndex() const;
121 * @return Rectangle of the item with the index \a index.
122 * The top/left of the bounding rectangle is related to
123 * the top/left of the KItemListView. An empty rectangle
124 * is returned if an invalid index is given.
126 QRectF
itemRect(int index
) const;
129 * @return Rectangle of the group header for the item with the
130 * index \a index. Note that the layouter does not check
131 * whether the item really has a header: Usually only
132 * the first item of a group gets a header (see
133 * isFirstGroupItem()).
135 QRectF
groupHeaderRect(int index
) const;
138 * @return Column of the item with the index \a index.
139 * -1 is returned if an invalid index is given.
141 int itemColumn(int index
) const;
144 * @return Row of the item with the index \a index.
145 * -1 is returned if an invalid index is given.
147 int itemRow(int index
) const;
150 * @return Maximum number of (at least partly) visible items for
153 int maximumVisibleItems() const;
156 * @return True if the item with the index \p itemIndex
157 * is the first item within a group.
159 bool isFirstGroupItem(int itemIndex
) const;
162 * Marks the layouter as dirty. This means as soon as a property of
163 * the layouter gets read, an expensive relayout will be done.
167 inline int columnCount() const
169 return m_columnCount
;
174 * @return True if the layouter has been marked as dirty and hence has
175 * not called yet doLayout(). Is enabled only in the debugging
176 * mode, as it is not useful to check the dirty state otherwise.
183 void updateVisibleIndexes();
184 bool createGroupHeaders();
187 * @return Minimum width of group headers when grouping is enabled in the horizontal
188 * alignment mode. The header alignment is done like this:
189 * Header-1 Header-2 Header-3
190 * Item 1 Item 4 Item 7
191 * Item 2 Item 5 Item 8
192 * Item 3 Item 6 Item 9
194 qreal
minimumGroupHeaderWidth() const;
198 bool m_visibleIndexesDirty
;
200 Qt::Orientation m_scrollOrientation
;
205 qreal m_headerHeight
;
206 const KItemModelBase
* m_model
;
207 const KItemListSizeHintResolver
* m_sizeHintResolver
;
209 qreal m_scrollOffset
;
210 qreal m_maximumScrollOffset
;
213 qreal m_maximumItemOffset
;
215 int m_firstVisibleIndex
;
216 int m_lastVisibleIndex
;
222 // Stores all item indexes that are the first item of a group.
223 // Assures fast access for KItemListViewLayouter::isFirstGroupItem().
224 QSet
<int> m_groupItemIndexes
;
225 qreal m_groupHeaderHeight
;
226 qreal m_groupHeaderMargin
;
233 QList
<ItemInfo
> m_itemInfos
;
235 friend class KItemListControllerTest
;