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