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
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
|
/*
* SPDX-FileCopyrightText: 2011 Peter Penz <[email protected]>
*
* Based on the Itemviews NG project from Trolltech Labs
*
* SPDX-License-Identifier: GPL-2.0-or-later
*/
#ifndef KITEMLISTWIDGET_H
#define KITEMLISTWIDGET_H
#include "dolphin_export.h"
#include "kitemviews/kitemliststyleoption.h"
#include <QBitArray>
#include <QGraphicsWidget>
#include <QStyle>
class KItemListSelectionToggle;
class KItemListView;
class QPropertyAnimation;
/**
* @brief Provides information for creating an instance of KItemListWidget.
*
* KItemListView only creates KItemListWidget instances for the visible
* area. For calculating the required size of all items the expected
* size for the invisible items must be accessible. KItemListWidgetInformant
* provides this information.
*/
class DOLPHIN_EXPORT KItemListWidgetInformant
{
public:
KItemListWidgetInformant();
virtual ~KItemListWidgetInformant();
virtual void calculateItemSizeHints(QVector<qreal>& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const = 0;
virtual qreal preferredRoleColumnWidth(const QByteArray& role,
int index,
const KItemListView* view) const = 0;
};
/**
* @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 DOLPHIN_EXPORT KItemListWidget : public QGraphicsWidget
{
Q_OBJECT
public:
KItemListWidget(KItemListWidgetInformant* informant, QGraphicsItem* parent);
~KItemListWidget() override;
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
*/
void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = nullptr) override;
void setVisibleRoles(const QList<QByteArray>& roles);
QList<QByteArray> visibleRoles() const;
/**
* Sets the width of a role that should be used if the alignment of the content
* should be done in columns.
*/
void setColumnWidth(const QByteArray& role, qreal width);
qreal columnWidth(const QByteArray& role) 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 setHoverPosition(const QPointF& pos);
void setAlternateBackground(bool enable);
bool alternateBackground() const;
void setEnabledSelectionToggle(bool enabled);
bool enabledSelectionToggle() const;
/**
* Sets the sibling information for the item and all of its parents.
* The sibling information of the upper most parent is represented by
* the first bit, the sibling information of the item by the last bit.
* The sibling information is useful for drawing the branches in
* tree views.
*/
void setSiblingsInformation(const QBitArray& siblings);
QBitArray siblingsInformation() const;
/**
* Allows the user to edit the role \a role. The signals
* roleEditingCanceled() or roleEditingFinished() will be
* emitted after editing. An ongoing editing gets canceled if
* the role is empty. Derived classes must implement
* editedRoleChanged().
*/
void setEditedRole(const QByteArray& role);
QByteArray editedRole() const;
/**
* @return True if \a point is inside KItemListWidget::hoverRect(),
* KItemListWidget::textRect(), KItemListWidget::selectionToggleRect()
* or KItemListWidget::expansionToggleRect().
* @reimp
*/
bool contains(const QPointF& point) const override;
/**
* @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 Focus rectangle for indicating the current item. Per default
* textRect() will be returned. Overwrite this method if textRect()
* provides a larger rectangle than the actual text (e.g. to
* be aligned with the iconRect()). The textFocusRect() may not be
* outside the boundaries of textRect().
*/
virtual QRectF textFocusRect() const;
/**
* @return Rectangle around which a selection box should be drawn if the item is selected.
*/
virtual QRectF selectionRect() 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;
/**
* @return Pixmap that is used when dragging an item. Per default the current state of the
* widget is returned as pixmap.
*/
virtual QPixmap createDragPixmap(const QStyleOptionGraphicsItem* option, QWidget* widget = nullptr);
signals:
void roleEditingCanceled(int index, const QByteArray& role, const QVariant& value);
void roleEditingFinished(int index, const QByteArray& role, const QVariant& value);
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 columnWidthChanged(const QByteArray& role, qreal current, qreal 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 alternateBackgroundChanged(bool enabled);
virtual void siblingsInformationChanged(const QBitArray& current, const QBitArray& previous);
virtual void editedRoleChanged(const QByteArray& current, const QByteArray& previous);
void resizeEvent(QGraphicsSceneResizeEvent* event) override;
/**
* @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;
const KItemListWidgetInformant* informant() 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)
KItemListWidgetInformant* m_informant;
int m_index;
bool m_selected;
bool m_current;
bool m_hovered;
bool m_alternateBackground;
bool m_enabledSelectionToggle;
QHash<QByteArray, QVariant> m_data;
QList<QByteArray> m_visibleRoles;
QHash<QByteArray, qreal> m_columnWidths;
KItemListStyleOption m_styleOption;
QBitArray m_siblingsInfo;
qreal m_hoverOpacity;
mutable QPixmap* m_hoverCache;
QPropertyAnimation* m_hoverAnimation;
KItemListSelectionToggle* m_selectionToggle;
QByteArray m_editedRole;
};
inline const KItemListWidgetInformant* KItemListWidget::informant() const
{
return m_informant;
}
#endif
|