]> cloud.milkyroute.net Git - dolphin.git/blob - src/kitemviews/private/kitemlistheaderwidget.h
Build with QT_NO_KEYWORDS
[dolphin.git] / src / kitemviews / private / kitemlistheaderwidget.h
1 /*
2 * SPDX-FileCopyrightText: 2011 Peter Penz <peter.penz19@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7 #ifndef KITEMLISTHEADERWIDGET_H
8 #define KITEMLISTHEADERWIDGET_H
9
10 #include "dolphin_export.h"
11
12 #include <QGraphicsWidget>
13 #include <QHash>
14 #include <QList>
15
16 class KItemModelBase;
17
18 /**
19 * @brief Widget the implements the header for KItemListView showing the currently used roles.
20 *
21 * The widget is an internal API, the user of KItemListView may only access the
22 * class KItemListHeader.
23 */
24 class DOLPHIN_EXPORT KItemListHeaderWidget : public QGraphicsWidget
25 {
26 Q_OBJECT
27
28 public:
29 explicit KItemListHeaderWidget(QGraphicsWidget* parent = nullptr);
30 ~KItemListHeaderWidget() override;
31
32 void setModel(KItemModelBase* model);
33 KItemModelBase* model() const;
34
35 void setAutomaticColumnResizing(bool automatic);
36 bool automaticColumnResizing() const;
37
38 void setColumns(const QList<QByteArray>& roles);
39 QList<QByteArray> columns() const;
40
41 void setColumnWidth(const QByteArray& role, qreal width);
42 qreal columnWidth(const QByteArray& role) const;
43
44 /**
45 * Sets the column-width that is required to show the role unclipped.
46 */
47 void setPreferredColumnWidth(const QByteArray& role, qreal width);
48 qreal preferredColumnWidth(const QByteArray& role) const;
49
50 void setOffset(qreal offset);
51 qreal offset() const;
52
53 qreal minimumColumnWidth() const;
54
55 void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = nullptr) override;
56
57 Q_SIGNALS:
58 /**
59 * Is emitted if the width of a visible role has been adjusted by the user with the mouse
60 * (no signal is emitted if KItemListHeader::setVisibleRoleWidth() is invoked).
61 */
62 void columnWidthChanged(const QByteArray& role,
63 qreal currentWidth,
64 qreal previousWidth);
65
66 /**
67 * Is emitted if the user has released the mouse button after adjusting the
68 * width of a visible role.
69 */
70 void columnWidthChangeFinished(const QByteArray& role,
71 qreal currentWidth);
72
73 /**
74 * Is emitted if the position of the column has been changed.
75 */
76 void columnMoved(const QByteArray& role, int currentIndex, int previousIndex);
77
78 /**
79 * Is emitted if the user has changed the sort order by clicking on a
80 * header item. The sort order of the model has already been adjusted to
81 * the current sort order. Note that no signal will be emitted if the
82 * sort order of the model has been changed without user interaction.
83 */
84 void sortOrderChanged(Qt::SortOrder current, Qt::SortOrder previous);
85
86 /**
87 * Is emitted if the user has changed the sort role by clicking on a
88 * header item. The sort role of the model has already been adjusted to
89 * the current sort role. Note that no signal will be emitted if the
90 * sort role of the model has been changed without user interaction.
91 */
92 void sortRoleChanged(const QByteArray& current, const QByteArray& previous);
93
94 protected:
95 void mousePressEvent(QGraphicsSceneMouseEvent* event) override;
96 void mouseReleaseEvent(QGraphicsSceneMouseEvent* event) override;
97 void mouseMoveEvent(QGraphicsSceneMouseEvent* event) override;
98 void mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event) override;
99 void hoverEnterEvent(QGraphicsSceneHoverEvent* event) override;
100 void hoverLeaveEvent(QGraphicsSceneHoverEvent* event) override;
101 void hoverMoveEvent(QGraphicsSceneHoverEvent* event) override;
102
103 private Q_SLOTS:
104 void slotSortRoleChanged(const QByteArray& current, const QByteArray& previous);
105 void slotSortOrderChanged(Qt::SortOrder current, Qt::SortOrder previous);
106
107 private:
108 void paintRole(QPainter* painter,
109 const QByteArray& role,
110 const QRectF& rect,
111 int orderIndex,
112 QWidget* widget = nullptr) const;
113
114 void updatePressedRoleIndex(const QPointF& pos);
115 void updateHoveredRoleIndex(const QPointF& pos);
116 int roleIndexAt(const QPointF& pos) const;
117 bool isAboveRoleGrip(const QPointF& pos, int roleIndex) const;
118
119 /**
120 * Creates a pixmap of the role with the index \a roleIndex that is shown
121 * during moving a role.
122 */
123 QPixmap createRolePixmap(int roleIndex) const;
124
125 /**
126 * @return Target index of the currently moving visible role based on the current
127 * state of m_movingRole.
128 */
129 int targetOfMovingRole() const;
130
131 /**
132 * @return x-position of the left border of the role \a role.
133 */
134 qreal roleXPosition(const QByteArray& role) const;
135
136 private:
137 enum RoleOperation
138 {
139 NoRoleOperation,
140 ResizeRoleOperation,
141 MoveRoleOperation
142 };
143
144 bool m_automaticColumnResizing;
145 KItemModelBase* m_model;
146 qreal m_offset;
147 QList<QByteArray> m_columns;
148 QHash<QByteArray, qreal> m_columnWidths;
149 QHash<QByteArray, qreal> m_preferredColumnWidths;
150
151 int m_hoveredRoleIndex;
152 int m_pressedRoleIndex;
153 RoleOperation m_roleOperation;
154 QPointF m_pressedMousePos;
155
156 struct MovingRole
157 {
158 QPixmap pixmap;
159 int x;
160 int xDec;
161 int index;
162 } m_movingRole;
163 };
164
165 #endif
166
167