File indexing completed on 2024-04-28 03:59:10
0001 /* 0002 This file is part of the KDE Libraries 0003 SPDX-FileCopyrightText: 2006 Tobias Koenig <tokoe@kde.org> 0004 SPDX-FileCopyrightText: 2007 Rafael Fernández López <ereslibre@kde.org> 0005 0006 SPDX-License-Identifier: LGPL-2.0-or-later 0007 */ 0008 0009 #ifndef KPAGEVIEW_P_H 0010 #define KPAGEVIEW_P_H 0011 0012 #include "kpageview.h" 0013 0014 #include <QAbstractItemDelegate> 0015 #include <QAbstractProxyModel> 0016 #include <QGridLayout> 0017 #include <QLineEdit> 0018 #include <QListView> 0019 #include <QPointer> 0020 #include <QStackedWidget> 0021 #include <QTimer> 0022 #include <QTreeView> 0023 #include <ktitlewidget.h> 0024 0025 class KPageStackedWidget : public QStackedWidget 0026 { 0027 Q_OBJECT 0028 public: 0029 explicit KPageStackedWidget(QWidget *parent = nullptr) 0030 : QStackedWidget(parent) 0031 { 0032 } 0033 0034 void setMinimumSize(const QSize &size) 0035 { 0036 mMinimumSize = size; 0037 } 0038 0039 QSize minimumSizeHint() const override 0040 { 0041 return mMinimumSize.expandedTo(QStackedWidget::minimumSizeHint()); 0042 } 0043 0044 private: 0045 QSize mMinimumSize; 0046 }; 0047 0048 class KPageViewPrivate 0049 { 0050 Q_DECLARE_PUBLIC(KPageView) 0051 0052 public: 0053 virtual ~KPageViewPrivate() = default; 0054 0055 protected: 0056 KPageViewPrivate(KPageView *); 0057 0058 KPageView *q_ptr; 0059 0060 // data 0061 QAbstractItemModel *model; 0062 KPageView::FaceType faceType; 0063 0064 // gui 0065 QGridLayout *layout; 0066 KPageStackedWidget *stack; 0067 KTitleWidget *titleWidget; 0068 QWidget *defaultWidget; 0069 QWidget *searchLineEditContainer; 0070 QLineEdit *searchLineEdit; 0071 QFrame *separatorLine; 0072 QTimer searchTimer; 0073 0074 QAbstractItemView *view; 0075 0076 QPointer<QWidget> pageHeader; 0077 QPointer<QWidget> pageFooter; 0078 0079 void updateTitleWidget(const QModelIndex &index); 0080 0081 void updateSelection(); 0082 void cleanupPages(); 0083 QList<QWidget *> collectPages(const QModelIndex &parent = QModelIndex()); 0084 KPageView::FaceType detectAutoFace() const; 0085 KPageView::FaceType effectiveFaceType() const; 0086 0087 // private slots 0088 void rebuildGui(); 0089 void modelChanged(); 0090 void dataChanged(const QModelIndex &, const QModelIndex &); 0091 void pageSelected(const QItemSelection &, const QItemSelection &); 0092 bool hasSearchableView() const; 0093 0094 private: 0095 void onSearchTextChanged(); 0096 void init(); 0097 0098 QMetaObject::Connection m_dataChangedConnection; 0099 QMetaObject::Connection m_layoutChangedConnection; 0100 QMetaObject::Connection m_selectionChangedConnection; 0101 QList<class SearchMatchOverlay *> m_searchMatchOverlays; 0102 }; 0103 0104 namespace KDEPrivate 0105 { 0106 class KPageListViewDelegate; 0107 class KPageListViewProxy; 0108 0109 class KPagePlainView : public QAbstractItemView 0110 { 0111 Q_OBJECT 0112 public: 0113 explicit KPagePlainView(QWidget *parent = nullptr); 0114 0115 QModelIndex indexAt(const QPoint &point) const override; 0116 void scrollTo(const QModelIndex &index, ScrollHint hint = EnsureVisible) override; 0117 QRect visualRect(const QModelIndex &index) const override; 0118 0119 protected: 0120 QModelIndex moveCursor(QAbstractItemView::CursorAction, Qt::KeyboardModifiers) override; 0121 int horizontalOffset() const override; 0122 int verticalOffset() const override; 0123 bool isIndexHidden(const QModelIndex &) const override; 0124 void setSelection(const QRect &, QFlags<QItemSelectionModel::SelectionFlag>) override; 0125 QRegion visualRegionForSelection(const QItemSelection &) const override; 0126 }; 0127 0128 class KPageListView : public QListView 0129 { 0130 Q_OBJECT 0131 0132 public: 0133 explicit KPageListView(QWidget *parent = nullptr); 0134 ~KPageListView() override; 0135 0136 void setModel(QAbstractItemModel *model) override; 0137 void setFlexibleWidth(bool flexibleWidth); 0138 0139 protected: 0140 void changeEvent(QEvent *event) override; 0141 0142 private Q_SLOTS: 0143 void updateWidth(); 0144 0145 private: 0146 bool m_flexibleWidth = false; 0147 }; 0148 0149 class KPageTreeView : public QTreeView 0150 { 0151 Q_OBJECT 0152 0153 public: 0154 explicit KPageTreeView(QWidget *parent = nullptr); 0155 0156 void setModel(QAbstractItemModel *model) override; 0157 0158 private Q_SLOTS: 0159 void updateWidth(); 0160 0161 private: 0162 void expandItems(const QModelIndex &index = QModelIndex()); 0163 }; 0164 0165 class KPageTabbedView : public QAbstractItemView 0166 { 0167 Q_OBJECT 0168 0169 public: 0170 explicit KPageTabbedView(QWidget *parent = nullptr); 0171 ~KPageTabbedView() override; 0172 0173 void setModel(QAbstractItemModel *model) override; 0174 0175 QModelIndex indexAt(const QPoint &point) const override; 0176 void scrollTo(const QModelIndex &index, ScrollHint hint = EnsureVisible) override; 0177 QRect visualRect(const QModelIndex &index) const override; 0178 0179 QSize minimumSizeHint() const override; 0180 0181 protected: 0182 QModelIndex moveCursor(QAbstractItemView::CursorAction, Qt::KeyboardModifiers) override; 0183 int horizontalOffset() const override; 0184 int verticalOffset() const override; 0185 bool isIndexHidden(const QModelIndex &) const override; 0186 void setSelection(const QRect &, QFlags<QItemSelectionModel::SelectionFlag>) override; 0187 QRegion visualRegionForSelection(const QItemSelection &) const override; 0188 0189 private Q_SLOTS: 0190 void currentPageChanged(int); 0191 void layoutChanged(); 0192 void dataChanged(const QModelIndex &, const QModelIndex &, const QList<int> &roles) override; 0193 0194 private: 0195 QTabWidget *mTabWidget; 0196 }; 0197 0198 class KPageListViewDelegate : public QAbstractItemDelegate 0199 { 0200 Q_OBJECT 0201 0202 public: 0203 explicit KPageListViewDelegate(QObject *parent = nullptr); 0204 0205 void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override; 0206 QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override; 0207 0208 private: 0209 void drawFocus(QPainter *, const QStyleOptionViewItem &, const QRect &) const; 0210 }; 0211 0212 /** 0213 * We need this proxy model to map the leaves of a tree-like model 0214 * to a one-level list model. 0215 */ 0216 class KPageListViewProxy : public QAbstractProxyModel 0217 { 0218 Q_OBJECT 0219 0220 public: 0221 explicit KPageListViewProxy(QObject *parent = nullptr); 0222 ~KPageListViewProxy() override; 0223 0224 int rowCount(const QModelIndex &parent = QModelIndex()) const override; 0225 int columnCount(const QModelIndex &parent = QModelIndex()) const override; 0226 QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override; 0227 QModelIndex parent(const QModelIndex &) const override; 0228 QVariant data(const QModelIndex &index, int role) const override; 0229 QModelIndex mapFromSource(const QModelIndex &index) const override; 0230 QModelIndex mapToSource(const QModelIndex &index) const override; 0231 0232 public Q_SLOTS: 0233 void rebuildMap(); 0234 0235 private: 0236 void addMapEntry(const QModelIndex &); 0237 0238 QList<QModelIndex> mList; 0239 }; 0240 0241 class SelectionModel : public QItemSelectionModel 0242 { 0243 Q_OBJECT 0244 0245 public: 0246 SelectionModel(QAbstractItemModel *model, QObject *parent); 0247 0248 public Q_SLOTS: 0249 void clear() override; 0250 void select(const QModelIndex &index, QItemSelectionModel::SelectionFlags command) override; 0251 void select(const QItemSelection &selection, QItemSelectionModel::SelectionFlags command) override; 0252 }; 0253 0254 } 0255 0256 #endif