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