1 | // Copyright (C) 2016 The Qt Company Ltd. |
2 | // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only |
3 | |
4 | #ifndef QABSTRACTSCROLLAREA_P_H |
5 | #define QABSTRACTSCROLLAREA_P_H |
6 | |
7 | // |
8 | // W A R N I N G |
9 | // ------------- |
10 | // |
11 | // This file is not part of the Qt API. It exists purely as an |
12 | // implementation detail. This header file may change from version to |
13 | // version without notice, or even be removed. |
14 | // |
15 | // We mean it. |
16 | // |
17 | |
18 | #include <QtWidgets/private/qtwidgetsglobal_p.h> |
19 | #include "private/qframe_p.h" |
20 | #include "qabstractscrollarea.h" |
21 | #include <QtGui/private/qgridlayoutengine_p.h> |
22 | |
23 | QT_BEGIN_NAMESPACE |
24 | |
25 | #if QT_CONFIG(scrollarea) |
26 | |
27 | class QScrollBar; |
28 | class QAbstractScrollAreaScrollBarContainer; |
29 | |
30 | class Q_AUTOTEST_EXPORT QAbstractScrollAreaPrivate: public QFramePrivate |
31 | { |
32 | Q_DECLARE_PUBLIC(QAbstractScrollArea) |
33 | |
34 | public: |
35 | QAbstractScrollAreaPrivate(); |
36 | ~QAbstractScrollAreaPrivate(); |
37 | |
38 | void replaceScrollBar(QScrollBar *scrollBar, Qt::Orientation orientation); |
39 | |
40 | QHVContainer<QAbstractScrollAreaScrollBarContainer *> scrollBarContainers; |
41 | QScrollBar *hbar, *vbar; |
42 | Qt::ScrollBarPolicy vbarpolicy, hbarpolicy; |
43 | |
44 | bool shownOnce; |
45 | bool inResize; |
46 | mutable QSize sizeHint; |
47 | QAbstractScrollArea::SizeAdjustPolicy sizeAdjustPolicy; |
48 | |
49 | QWidget *viewport; |
50 | QWidget *cornerWidget; |
51 | QRect cornerPaintingRect; |
52 | |
53 | int left, top, right, bottom; // viewport margin |
54 | |
55 | int xoffset, yoffset; |
56 | QPoint overshoot; |
57 | |
58 | void init(); |
59 | void layoutChildren(); |
60 | void layoutChildren_helper(bool *needHorizontalScrollbar, bool *needVerticalScrollbar); |
61 | virtual void scrollBarPolicyChanged(Qt::Orientation, Qt::ScrollBarPolicy) {} |
62 | virtual bool canStartScrollingAt( const QPoint &startPos ) const; |
63 | |
64 | void flashScrollBars(); |
65 | void setScrollBarTransient(QScrollBar *scrollBar, bool transient); |
66 | |
67 | void _q_hslide(int); |
68 | void _q_vslide(int); |
69 | void _q_showOrHideScrollBars(); |
70 | |
71 | virtual QPoint contentsOffset() const; |
72 | |
73 | inline bool viewportEvent(QEvent *event) |
74 | { return q_func()->viewportEvent(event); } |
75 | QScopedPointer<QObject> viewportFilter; |
76 | }; |
77 | |
78 | class QAbstractScrollAreaFilter : public QObject |
79 | { |
80 | Q_OBJECT |
81 | public: |
82 | QAbstractScrollAreaFilter(QAbstractScrollAreaPrivate *p) : d(p) |
83 | { setObjectName(QLatin1StringView("qt_abstractscrollarea_filter" )); } |
84 | bool eventFilter(QObject *o, QEvent *e) override |
85 | { return (o == d->viewport ? d->viewportEvent(event: e) : false); } |
86 | private: |
87 | QAbstractScrollAreaPrivate *d; |
88 | }; |
89 | |
90 | class QBoxLayout; |
91 | class QAbstractScrollAreaScrollBarContainer : public QWidget |
92 | { |
93 | public: |
94 | enum LogicalPosition { LogicalLeft = 1, LogicalRight = 2 }; |
95 | |
96 | QAbstractScrollAreaScrollBarContainer(Qt::Orientation orientation, QWidget *parent); |
97 | void addWidget(QWidget *widget, LogicalPosition position); |
98 | QWidgetList widgets(LogicalPosition position); |
99 | void removeWidget(QWidget *widget); |
100 | |
101 | QScrollBar *scrollBar; |
102 | QBoxLayout *layout; |
103 | private: |
104 | int scrollBarLayoutIndex() const; |
105 | |
106 | Qt::Orientation orientation; |
107 | }; |
108 | |
109 | #endif // QT_CONFIG(scrollarea) |
110 | |
111 | QT_END_NAMESPACE |
112 | |
113 | #endif // QABSTRACTSCROLLAREA_P_H |
114 | |