File indexing completed on 2024-04-28 15:32:09

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