]> cloud.milkyroute.net Git - dolphin.git/blob - src/kitemviews/kstandarditemlistwidget.h
Fix typo: PascalCase in docs
[dolphin.git] / src / kitemviews / kstandarditemlistwidget.h
1 /*
2 * SPDX-FileCopyrightText: 2012 Peter Penz <peter.penz19@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7 #ifndef KSTANDARDITEMLISTWIDGET_H
8 #define KSTANDARDITEMLISTWIDGET_H
9
10 #include "dolphin_export.h"
11 #include "kitemviews/kitemlistwidget.h"
12
13 #include <QPixmap>
14 #include <QPointF>
15 #include <QStaticText>
16
17 class KItemListRoleEditor;
18 class KItemListStyleOption;
19 class KItemListView;
20
21 class DOLPHIN_EXPORT KStandardItemListWidgetInformant : public KItemListWidgetInformant
22 {
23 public:
24 KStandardItemListWidgetInformant();
25 ~KStandardItemListWidgetInformant() override;
26
27 void calculateItemSizeHints(QVector<qreal>& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const override;
28
29 qreal preferredRoleColumnWidth(const QByteArray& role,
30 int index,
31 const KItemListView* view) const override;
32 protected:
33 /**
34 * @return The value of the "text" role. The default implementation returns
35 * view->model()->data(index)["text"]. If a derived class can
36 * prevent the (possibly expensive) construction of the
37 * QHash<QByteArray, QVariant> returned by KItemModelBase::data(int),
38 * it can reimplement this function.
39 */
40 virtual QString itemText(int index, const KItemListView* view) const;
41
42 /**
43 * @return The value of the "isLink" role. The default implementation returns false.
44 * The derived class should reimplement this function, when information about
45 * links is available and in usage.
46 */
47 virtual bool itemIsLink(int index, const KItemListView* view) const;
48
49 /**
50 * @return String representation of the role \a role. The representation of
51 * a role might depend on other roles, so the values of all roles
52 * are passed as parameter.
53 */
54 virtual QString roleText(const QByteArray& role,
55 const QHash<QByteArray, QVariant>& values) const;
56
57 /**
58 * @return A font based on baseFont which is customized for symlinks.
59 */
60 virtual QFont customizedFontForLinks(const QFont& baseFont) const;
61
62 void calculateIconsLayoutItemSizeHints(QVector<qreal>& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const;
63 void calculateCompactLayoutItemSizeHints(QVector<qreal>& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const;
64 void calculateDetailsLayoutItemSizeHints(QVector<qreal>& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const;
65
66 friend class KStandardItemListWidget; // Accesses roleText()
67 };
68
69 /**
70 * @brief ItemList widget implementation for KStandardItemListView and KStandardItemModel.
71 */
72 class DOLPHIN_EXPORT KStandardItemListWidget : public KItemListWidget
73 {
74 Q_OBJECT
75
76 public:
77 enum Layout
78 {
79 IconsLayout,
80 CompactLayout,
81 DetailsLayout
82 };
83
84 KStandardItemListWidget(KItemListWidgetInformant* informant, QGraphicsItem* parent);
85 ~KStandardItemListWidget() override;
86
87 void setLayout(Layout layout);
88 Layout layout() const;
89
90 void setSupportsItemExpanding(bool supportsItemExpanding);
91 bool supportsItemExpanding() const;
92
93 void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = nullptr) override;
94
95 QRectF iconRect() const override;
96 QRectF textRect() const override;
97 QRectF textFocusRect() const override;
98 QRectF selectionRect() const override;
99 QRectF expansionToggleRect() const override;
100 QRectF selectionToggleRect() const override;
101 QPixmap createDragPixmap(const QStyleOptionGraphicsItem* option, QWidget* widget = nullptr) override;
102
103 static KItemListWidgetInformant* createInformant();
104
105 protected:
106 /**
107 * Invalidates the cache which results in calling KStandardItemListWidget::refreshCache() as
108 * soon as the item need to gets repainted.
109 */
110 void invalidateCache();
111
112 /**
113 * Invalidates the icon cache which results in calling KStandardItemListWidget::refreshCache() as
114 * soon as the item needs to get repainted.
115 */
116 void invalidateIconCache();
117
118 /**
119 * Is called if the cache got invalidated by KStandardItemListWidget::invalidateCache().
120 * The default implementation is empty.
121 */
122 virtual void refreshCache();
123
124 /**
125 * @return True if the give role should be right aligned when showing it inside a column.
126 * Per default false is returned.
127 */
128 virtual bool isRoleRightAligned(const QByteArray& role) const;
129
130 /**
131 * @return True if the item should be visually marked as hidden item. Per default
132 * false is returned.
133 */
134 virtual bool isHidden() const;
135
136 /**
137 * @return A font based on baseFont which is customized according to the data shown in the widget.
138 */
139 virtual QFont customizedFont(const QFont& baseFont) const;
140
141 virtual QPalette::ColorRole normalTextColorRole() const;
142
143 void setTextColor(const QColor& color);
144 QColor textColor() const;
145
146 void setOverlay(const QPixmap& overlay);
147 QPixmap overlay() const;
148
149 /**
150 * @see KStandardItemListWidgetInformant::roleText().
151 */
152 QString roleText(const QByteArray& role, const QHash<QByteArray, QVariant>& values) const;
153
154 /**
155 * Fixes:
156 * Select the text without MIME-type extension
157 * This is file-item-specific and should be moved
158 * into KFileItemListWidget.
159 *
160 * Inherited classes can define, if the MIME-type extension
161 * should be selected or not.
162 *
163 * @return Selection length (with or without MIME-type extension)
164 */
165 virtual int selectionLength(const QString& text) const;
166
167 void dataChanged(const QHash<QByteArray, QVariant>& current, const QSet<QByteArray>& roles = QSet<QByteArray>()) override;
168 void visibleRolesChanged(const QList<QByteArray>& current, const QList<QByteArray>& previous) override;
169 void columnWidthChanged(const QByteArray& role, qreal current, qreal previous) override;
170 void styleOptionChanged(const KItemListStyleOption& current, const KItemListStyleOption& previous) override;
171 void hoveredChanged(bool hovered) override;
172 void selectedChanged(bool selected) override;
173 void siblingsInformationChanged(const QBitArray& current, const QBitArray& previous) override;
174 void editedRoleChanged(const QByteArray& current, const QByteArray& previous) override;
175 void resizeEvent(QGraphicsSceneResizeEvent* event) override;
176 void showEvent(QShowEvent* event) override;
177 void hideEvent(QHideEvent* event) override;
178 bool event(QEvent *event) override;
179
180 struct TextInfo
181 {
182 QPointF pos;
183 QStaticText staticText;
184 };
185
186 public Q_SLOTS:
187 void finishRoleEditing();
188
189 private Q_SLOTS:
190 void slotCutItemsChanged();
191 void slotRoleEditingCanceled(const QByteArray& role, const QVariant& value);
192 void slotRoleEditingFinished(const QByteArray& role, const QVariant& value);
193
194 private:
195 void triggerCacheRefreshing();
196 void updateExpansionArea();
197 void updatePixmapCache();
198
199 void updateTextsCache();
200 void updateIconsLayoutTextCache();
201 void updateCompactLayoutTextCache();
202 void updateDetailsLayoutTextCache();
203
204 void updateAdditionalInfoTextColor();
205
206 void drawPixmap(QPainter* painter, const QPixmap& pixmap);
207 void drawSiblingsInformation(QPainter* painter);
208
209 QRectF roleEditingRect(const QByteArray &role) const;
210
211 QString elideRightKeepExtension(const QString &text, int elidingWidth) const;
212
213 /**
214 * Closes the role editor and returns the focus back
215 * to the KItemListContainer.
216 */
217 void closeRoleEditor();
218
219 static QPixmap pixmapForIcon(const QString& name, const QStringList& overlays, int size, QIcon::Mode mode);
220
221 /**
222 * @return Preferred size of the rating-image based on the given
223 * style-option. The height of the font is taken as
224 * reference.
225 */
226 static QSizeF preferredRatingSize(const KItemListStyleOption& option);
227
228 /**
229 * @return Horizontal padding in pixels that is added to the required width of
230 * a column to display the content.
231 */
232 static qreal columnPadding(const KItemListStyleOption& option);
233
234 protected:
235 QHash<QByteArray, TextInfo*> m_textInfo; // PlacesItemListWidget needs to access this
236
237 private:
238 bool m_isCut;
239 bool m_isHidden;
240 QFont m_customizedFont;
241 QFontMetrics m_customizedFontMetrics;
242 bool m_isExpandable;
243 bool m_supportsItemExpanding;
244
245 bool m_dirtyLayout;
246 bool m_dirtyContent;
247 QSet<QByteArray> m_dirtyContentRoles;
248
249 Layout m_layout;
250 QPointF m_pixmapPos;
251 QPixmap m_pixmap;
252 QSize m_scaledPixmapSize; //Size of the pixmap in device independent pixels
253
254 QRectF m_iconRect; // Cache for KItemListWidget::iconRect()
255 QPixmap m_hoverPixmap; // Cache for modified m_pixmap when hovering the item
256
257 QRectF m_textRect;
258
259 QList<QByteArray> m_sortedVisibleRoles;
260
261 QRectF m_expansionArea;
262
263 QColor m_customTextColor;
264 QColor m_additionalInfoTextColor;
265
266 QPixmap m_overlay;
267 QPixmap m_rating;
268
269 KItemListRoleEditor* m_roleEditor;
270 KItemListRoleEditor* m_oldRoleEditor;
271
272 friend class KStandardItemListWidgetInformant; // Accesses private static methods to be able to
273 // share a common layout calculation
274 };
275
276 #endif