1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
|
/***************************************************************************
* Copyright (C) 2011 by Peter Penz <[email protected]> *
* *
* Based on the Itemviews NG project from Trolltech Labs: *
* http://qt.gitorious.org/qt-labs/itemviews-ng *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
***************************************************************************/
#ifndef KITEMLISTWIDGET_H
#define KITEMLISTWIDGET_H
#include <libdolphin_export.h>
#include <kitemviews/kitemliststyleoption.h>
#include <QGraphicsWidget>
#include <QStyle>
class KItemListSelectionToggle;
class QPropertyAnimation;
/**
* @brief Widget that shows a visible item from the model.
*
* For showing an item from a custom model it is required to at least overwrite KItemListWidget::paint().
* All properties are set by KItemListView, for each property there is a corresponding
* virtual protected method that allows to react on property changes.
*/
class LIBDOLPHINPRIVATE_EXPORT KItemListWidget : public QGraphicsWidget
{
Q_OBJECT
public:
KItemListWidget(QGraphicsItem* parent);
virtual ~KItemListWidget();
void setIndex(int index);
int index() const;
void setData(const QHash<QByteArray, QVariant>& data, const QSet<QByteArray>& roles = QSet<QByteArray>());
QHash<QByteArray, QVariant> data() const;
/**
* Draws the hover-rectangle if the item is hovered. Overwrite this method
* to show the data of the custom model provided by KItemListWidget::data().
* @reimp
*/
virtual void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0);
void setVisibleRoles(const QList<QByteArray>& roles);
QList<QByteArray> visibleRoles() const;
void setVisibleRolesSizes(const QHash<QByteArray, QSizeF> rolesSizes);
QHash<QByteArray, QSizeF> visibleRolesSizes() const;
void setStyleOption(const KItemListStyleOption& option);
const KItemListStyleOption& styleOption() const;
// TODO: Hides QGraphicsItem::setSelected()/isSelected(). Replace
// this by using the default mechanism.
void setSelected(bool selected);
bool isSelected() const;
void setCurrent(bool current);
bool isCurrent() const;
void setHovered(bool hovered);
bool isHovered() const;
void setAlternatingBackgroundColors(bool enable);
bool alternatingBackgroundColors() const;
void setEnabledSelectionToggle(bool enabled);
bool enabledSelectionToggle() const;
/**
* @return True if \a point is inside KItemListWidget::hoverRect(),
* KItemListWidget::textRect(), KItemListWidget::selectionToggleRect()
* or KItemListWidget::expansionToggleRect().
* @reimp
*/
virtual bool contains(const QPointF& point) const;
/**
* @return Rectangle for the area that shows the icon.
*/
virtual QRectF iconRect() const = 0;
/**
* @return Rectangle for the area that contains the text-properties.
*/
virtual QRectF textRect() const = 0;
/**
* @return Rectangle for the selection-toggle that is used to select or deselect an item.
* Per default an empty rectangle is returned which means that no selection-toggle
* is available.
*/
virtual QRectF selectionToggleRect() const;
/**
* @return Rectangle for the expansion-toggle that is used to open a sub-tree of the model.
* Per default an empty rectangle is returned which means that no opening of sub-trees
* is supported.
*/
virtual QRectF expansionToggleRect() const;
protected:
virtual void dataChanged(const QHash<QByteArray, QVariant>& current, const QSet<QByteArray>& roles = QSet<QByteArray>());
virtual void visibleRolesChanged(const QList<QByteArray>& current, const QList<QByteArray>& previous);
virtual void visibleRolesSizesChanged(const QHash<QByteArray, QSizeF>& current, const QHash<QByteArray, QSizeF>& previous);
virtual void styleOptionChanged(const KItemListStyleOption& current, const KItemListStyleOption& previous);
virtual void currentChanged(bool current);
virtual void selectedChanged(bool selected);
virtual void hoveredChanged(bool hovered);
virtual void alternatingBackgroundColorsChanged(bool enabled);
virtual void resizeEvent(QGraphicsSceneResizeEvent* event);
/**
* @return The current opacity of the hover-animation. When implementing a custom painting-code for a hover-state
* this opacity value should be respected.
*/
qreal hoverOpacity() const;
private slots:
void slotHoverAnimationFinished();
private:
void initializeSelectionToggle();
void setHoverOpacity(qreal opacity);
void clearHoverCache();
void drawItemStyleOption(QPainter* painter, QWidget* widget, QStyle::State styleState);
private:
Q_PROPERTY(qreal hoverOpacity READ hoverOpacity WRITE setHoverOpacity)
int m_index;
bool m_selected;
bool m_current;
bool m_hovered;
bool m_alternatingBackgroundColors;
bool m_enabledSelectionToggle;
QHash<QByteArray, QVariant> m_data;
QList<QByteArray> m_visibleRoles;
QHash<QByteArray, QSizeF> m_visibleRolesSizes;
KItemListStyleOption m_styleOption;
qreal m_hoverOpacity;
mutable QPixmap* m_hoverCache;
QPropertyAnimation* m_hoverAnimation;
KItemListSelectionToggle* m_selectionToggle;
};
#endif
|