1/*
2 This file is part of the KDE Libraries
3 SPDX-FileCopyrightText: 2006 Tobias Koenig <tokoe@kde.org>
4 SPDX-FileCopyrightText: 2007 Rafael Fernández López <ereslibre@kde.org>
5
6 SPDX-License-Identifier: LGPL-2.0-or-later
7*/
8
9#ifndef KPAGEVIEW_P_H
10#define KPAGEVIEW_P_H
11
12#include "kpageview.h"
13
14#include <QAbstractItemDelegate>
15#include <QAbstractProxyModel>
16#include <QGridLayout>
17#include <QLineEdit>
18#include <QListView>
19#include <QPointer>
20#include <QStackedWidget>
21#include <QTimer>
22#include <QToolBar>
23#include <QTreeView>
24#include <ktitlewidget.h>
25
26class KPageStackedWidget : public QStackedWidget
27{
28 Q_OBJECT
29public:
30 explicit KPageStackedWidget(QWidget *parent = nullptr)
31 : QStackedWidget(parent)
32 {
33 }
34
35 void setMinimumSize(const QSize &size)
36 {
37 mMinimumSize = size;
38 }
39
40 QSize minimumSizeHint() const override
41 {
42 return mMinimumSize.expandedTo(otherSize: QStackedWidget::minimumSizeHint());
43 }
44
45private:
46 QSize mMinimumSize;
47};
48
49class KPageViewPrivate
50{
51 Q_DECLARE_PUBLIC(KPageView)
52
53public:
54 virtual ~KPageViewPrivate() = default;
55
56protected:
57 KPageViewPrivate(KPageView *);
58
59 KPageView *q_ptr;
60
61 // data
62 QAbstractItemModel *model;
63 KPageView::FaceType faceType;
64
65 // gui
66 QGridLayout *layout;
67 QToolBar *actionsToolBar;
68 KPageStackedWidget *stack;
69 KTitleWidget *titleWidget;
70 QWidget *defaultWidget;
71 QWidget *searchLineEditContainer;
72 QLineEdit *searchLineEdit;
73 QFrame *separatorLine;
74 QTimer searchTimer;
75
76 QAbstractItemView *view;
77
78 QPointer<QWidget> pageHeader;
79 QPointer<QWidget> pageFooter;
80
81 void updateTitleWidget(const QModelIndex &index);
82 void updateActionsLayout(const QModelIndex &index, const QModelIndex &previous);
83
84 void updateSelection();
85 void cleanupPages();
86 QList<QWidget *> collectPages(const QModelIndex &parent = QModelIndex());
87 KPageView::FaceType detectAutoFace() const;
88 KPageView::FaceType effectiveFaceType() const;
89
90 // private slots
91 void rebuildGui();
92 void modelChanged();
93 void dataChanged(const QModelIndex &, const QModelIndex &);
94 void pageSelected(const QItemSelection &, const QItemSelection &);
95 bool hasSearchableView() const;
96
97private:
98 void onSearchTextChanged();
99 void init();
100
101 QMetaObject::Connection m_dataChangedConnection;
102 QMetaObject::Connection m_layoutChangedConnection;
103 QMetaObject::Connection m_selectionChangedConnection;
104 QList<class SearchMatchOverlay *> m_searchMatchOverlays;
105 std::unique_ptr<QStyle> m_noPaddingStyle;
106};
107
108namespace KDEPrivate
109{
110class KPageListViewDelegate;
111class KPageListViewProxy;
112
113class KPagePlainView : public QAbstractItemView
114{
115 Q_OBJECT
116public:
117 explicit KPagePlainView(QWidget *parent = nullptr);
118
119 QModelIndex indexAt(const QPoint &point) const override;
120 void scrollTo(const QModelIndex &index, ScrollHint hint = EnsureVisible) override;
121 QRect visualRect(const QModelIndex &index) const override;
122
123protected:
124 QModelIndex moveCursor(QAbstractItemView::CursorAction, Qt::KeyboardModifiers) override;
125 int horizontalOffset() const override;
126 int verticalOffset() const override;
127 bool isIndexHidden(const QModelIndex &) const override;
128 void setSelection(const QRect &, QFlags<QItemSelectionModel::SelectionFlag>) override;
129 QRegion visualRegionForSelection(const QItemSelection &) const override;
130};
131
132class KPageListView : public QListView
133{
134 Q_OBJECT
135
136public:
137 explicit KPageListView(QWidget *parent = nullptr);
138 ~KPageListView() override;
139
140 void setModel(QAbstractItemModel *model) override;
141 void setFlexibleWidth(bool flexibleWidth);
142
143protected:
144 void changeEvent(QEvent *event) override;
145
146private Q_SLOTS:
147 void updateWidth();
148
149private:
150 bool m_flexibleWidth = false;
151};
152
153class KPageTreeView : public QTreeView
154{
155 Q_OBJECT
156
157public:
158 explicit KPageTreeView(QWidget *parent = nullptr);
159
160 void setModel(QAbstractItemModel *model) override;
161
162private Q_SLOTS:
163 void updateWidth();
164
165private:
166 void expandItems(const QModelIndex &index = QModelIndex());
167};
168
169class KPageTabbedView : public QAbstractItemView
170{
171 Q_OBJECT
172
173public:
174 explicit KPageTabbedView(QWidget *parent = nullptr);
175 ~KPageTabbedView() override;
176
177 void setModel(QAbstractItemModel *model) override;
178
179 QModelIndex indexAt(const QPoint &point) const override;
180 void scrollTo(const QModelIndex &index, ScrollHint hint = EnsureVisible) override;
181 QRect visualRect(const QModelIndex &index) const override;
182
183 QSize minimumSizeHint() const override;
184
185protected:
186 QModelIndex moveCursor(QAbstractItemView::CursorAction, Qt::KeyboardModifiers) override;
187 int horizontalOffset() const override;
188 int verticalOffset() const override;
189 bool isIndexHidden(const QModelIndex &) const override;
190 void setSelection(const QRect &, QFlags<QItemSelectionModel::SelectionFlag>) override;
191 QRegion visualRegionForSelection(const QItemSelection &) const override;
192
193private Q_SLOTS:
194 void currentPageChanged(int);
195 void layoutChanged();
196 void dataChanged(const QModelIndex &, const QModelIndex &, const QList<int> &roles) override;
197
198private:
199 QTabWidget *mTabWidget;
200};
201
202class KPageListViewDelegate : public QAbstractItemDelegate
203{
204 Q_OBJECT
205
206public:
207 explicit KPageListViewDelegate(QObject *parent = nullptr);
208
209 void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
210 QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override;
211
212private:
213 void drawFocus(QPainter *, const QStyleOptionViewItem &, const QRect &) const;
214};
215
216/*
217 * We need this proxy model to map the leaves of a tree-like model
218 * to a one-level list model.
219 */
220class KPageListViewProxy : public QAbstractProxyModel
221{
222 Q_OBJECT
223
224public:
225 explicit KPageListViewProxy(QObject *parent = nullptr);
226 ~KPageListViewProxy() override;
227
228 int rowCount(const QModelIndex &parent = QModelIndex()) const override;
229 int columnCount(const QModelIndex &parent = QModelIndex()) const override;
230 QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override;
231 QModelIndex parent(const QModelIndex &) const override;
232 QVariant data(const QModelIndex &index, int role) const override;
233 QModelIndex mapFromSource(const QModelIndex &index) const override;
234 QModelIndex mapToSource(const QModelIndex &index) const override;
235
236public Q_SLOTS:
237 void rebuildMap();
238
239private:
240 void addMapEntry(const QModelIndex &);
241
242 QList<QModelIndex> mList;
243};
244
245class SelectionModel : public QItemSelectionModel
246{
247 Q_OBJECT
248
249public:
250 SelectionModel(QAbstractItemModel *model, QObject *parent);
251
252public Q_SLOTS:
253 void clear() override;
254 void select(const QModelIndex &index, QItemSelectionModel::SelectionFlags command) override;
255 void select(const QItemSelection &selection, QItemSelectionModel::SelectionFlags command) override;
256};
257
258}
259
260#endif
261

source code of kwidgetsaddons/src/kpageview_p.h