1 /****************************************************************************
2 **
3 ** Copyright (C) 2016 The Qt Company Ltd.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of the QtWidgets module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see https://www.qt.io/terms-conditions. For further
15 ** information use the contact form at https://www.qt.io/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 3 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL3 included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 3 requirements
23 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24 **
25 ** GNU General Public License Usage
26 ** Alternatively, this file may be used under the terms of the GNU
27 ** General Public License version 2.0 or (at your option) the GNU General
28 ** Public license version 3 or any later version approved by the KDE Free
29 ** Qt Foundation. The licenses are as published by the Free Software
30 ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31 ** included in the packaging of this file. Please review the following
32 ** information to ensure the GNU General Public License requirements will
33 ** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34 ** https://www.gnu.org/licenses/gpl-3.0.html.
35 **
36 ** $QT_END_LICENSE$
37 **
38 ****************************************************************************/
39 
40 #ifndef QABSTRACTSCROLLAREA_P_H
41 #define QABSTRACTSCROLLAREA_P_H
42 
43 //
44 //  W A R N I N G
45 //  -------------
46 //
47 // This file is not part of the Qt API.  It exists purely as an
48 // implementation detail.  This header file may change from version to
49 // version without notice, or even be removed.
50 //
51 // We mean it.
52 //
53 
54 #include <QtWidgets/private/qtwidgetsglobal_p.h>
55 #include "private/qframe_p.h"
56 #include "qabstractscrollarea.h"
57 
58 QT_BEGIN_NAMESPACE
59 
60 #if QT_CONFIG(scrollarea)
61 
62 class QScrollBar;
63 class QAbstractScrollAreaScrollBarContainer;
64 
65 // ### Qt 6: is the export still needed? If not, unexport QFramePrivate, too.
66 class Q_WIDGETS_EXPORT QAbstractScrollAreaPrivate: public QFramePrivate
67 {
68     Q_DECLARE_PUBLIC(QAbstractScrollArea)
69 
70 public:
71     QAbstractScrollAreaPrivate();
72     ~QAbstractScrollAreaPrivate();
73 
74     void replaceScrollBar(QScrollBar *scrollBar, Qt::Orientation orientation);
75 
76     QAbstractScrollAreaScrollBarContainer *scrollBarContainers[Qt::Vertical + 1];
77     QScrollBar *hbar, *vbar;
78     Qt::ScrollBarPolicy vbarpolicy, hbarpolicy;
79 
80     bool shownOnce;
81     bool inResize;
82     mutable QSize sizeHint;
83     QAbstractScrollArea::SizeAdjustPolicy sizeAdjustPolicy;
84 
85     QWidget *viewport;
86     QWidget *cornerWidget;
87     QRect cornerPaintingRect;
88 
89     int left, top, right, bottom; // viewport margin
90 
91     int xoffset, yoffset;
92     QPoint overshoot;
93 
94     void init();
95     void layoutChildren();
96     void layoutChildren_helper(bool *needHorizontalScrollbar, bool *needVerticalScrollbar);
97     // ### Fix for 4.4, talk to Bjoern E or Girish.
scrollBarPolicyChanged(Qt::Orientation,Qt::ScrollBarPolicy)98     virtual void scrollBarPolicyChanged(Qt::Orientation, Qt::ScrollBarPolicy) {}
99     bool canStartScrollingAt( const QPoint &startPos );
100 
101     void flashScrollBars();
102     void setScrollBarTransient(QScrollBar *scrollBar, bool transient);
103 
104     void _q_hslide(int);
105     void _q_vslide(int);
106     void _q_showOrHideScrollBars();
107 
108     virtual QPoint contentsOffset() const;
109 
viewportEvent(QEvent * event)110     inline bool viewportEvent(QEvent *event)
111     { return q_func()->viewportEvent(event); }
112     QScopedPointer<QObject> viewportFilter;
113 };
114 
115 class QAbstractScrollAreaFilter : public QObject
116 {
117     Q_OBJECT
118 public:
QAbstractScrollAreaFilter(QAbstractScrollAreaPrivate * p)119     QAbstractScrollAreaFilter(QAbstractScrollAreaPrivate *p) : d(p)
120     { setObjectName(QLatin1String("qt_abstractscrollarea_filter")); }
eventFilter(QObject * o,QEvent * e)121     bool eventFilter(QObject *o, QEvent *e) override
122     { return (o == d->viewport ? d->viewportEvent(e) : false); }
123 private:
124     QAbstractScrollAreaPrivate *d;
125 };
126 
127 class QBoxLayout;
128 class QAbstractScrollAreaScrollBarContainer : public QWidget
129 {
130 public:
131     enum LogicalPosition { LogicalLeft = 1, LogicalRight = 2 };
132 
133     QAbstractScrollAreaScrollBarContainer(Qt::Orientation orientation, QWidget *parent);
134     void addWidget(QWidget *widget, LogicalPosition position);
135     QWidgetList widgets(LogicalPosition position);
136     void removeWidget(QWidget *widget);
137 
138     QScrollBar *scrollBar;
139     QBoxLayout *layout;
140 private:
141     int scrollBarLayoutIndex() const;
142 
143     Qt::Orientation orientation;
144 };
145 
146 #endif // QT_CONFIG(scrollarea)
147 
148 QT_END_NAMESPACE
149 
150 #endif // QABSTRACTSCROLLAREA_P_H
151