QtCanpool 3.3.0
载入中...
搜索中...
未找到
dockresizehandle.cpp
浏览该文件的文档.
1
5#include "dockresizehandle.h"
6
7#include <QMouseEvent>
8#include <QRubberBand>
9#include <QPointer>
10
12
13class DockResizeHandlePrivate
14{
15public:
16 QX_DECLARE_PUBLIC(DockResizeHandle)
17public:
18 DockResizeHandlePrivate();
19
20 bool isHorizontal() const;
21 int pick(const QPoint &pos) const;
22 void setRubberBand(int Pos);
23 void doResizing(QMouseEvent *e, bool forceResize = false);
24public:
25 QWidget *m_target = nullptr;
26 QPointer<QRubberBand> m_rubberBand;
27 Qt::Edge m_handlePosition = Qt::LeftEdge;
28 int m_minSize = 0;
29 int m_maxSize = 1;
30 int m_mouseOffset = 0;
31 int m_handleWidth = 4;
32 bool m_opaqueResize = false;
33 bool m_pressed = false;
34};
35
36DockResizeHandlePrivate::DockResizeHandlePrivate()
37{
38}
39
40bool DockResizeHandlePrivate::isHorizontal() const
41{
42 Q_Q(const DockResizeHandle);
43 return q->orientation() == Qt::Horizontal;
44}
45
46int DockResizeHandlePrivate::pick(const QPoint &pos) const
47{
48 Q_Q(const DockResizeHandle);
49 return q->orientation() == Qt::Horizontal ? pos.x() : pos.y();
50}
51
52void DockResizeHandlePrivate::setRubberBand(int Pos)
53{
54 Q_Q(DockResizeHandle);
55 if (!m_rubberBand) {
56 m_rubberBand = new QRubberBand(QRubberBand::Line, m_target->parentWidget());
57 }
58
59 auto geometry = q->geometry();
60 auto topLeft = m_target->mapTo(m_target->parentWidget(), geometry.topLeft());
61 switch (m_handlePosition) {
62 case Qt::LeftEdge:
63 case Qt::RightEdge:
64 topLeft.rx() += Pos;
65 break;
66 case Qt::TopEdge:
67 case Qt::BottomEdge:
68 topLeft.ry() += Pos;
69 break;
70 }
71
72 geometry.moveTopLeft(topLeft);
73 m_rubberBand->setGeometry(geometry);
74 m_rubberBand->show();
75}
76
77void DockResizeHandlePrivate::doResizing(QMouseEvent *e, bool forceResize)
78{
79 Q_Q(DockResizeHandle);
80 int pos = pick(e->pos()) - m_mouseOffset;
81 auto oldGeometry = m_target->geometry();
82 auto newGeometry = oldGeometry;
83 switch (m_handlePosition) {
84 case Qt::LeftEdge: {
85 newGeometry.adjust(pos, 0, 0, 0);
86 int Size = qBound(m_minSize, newGeometry.width(), m_maxSize);
87 pos += (newGeometry.width() - Size);
88 newGeometry.setWidth(Size);
89 newGeometry.moveTopRight(oldGeometry.topRight());
90 } break;
91
92 case Qt::RightEdge: {
93 newGeometry.adjust(0, 0, pos, 0);
94 int Size = qBound(m_minSize, newGeometry.width(), m_maxSize);
95 pos -= (newGeometry.width() - Size);
96 newGeometry.setWidth(Size);
97 } break;
98
99 case Qt::TopEdge: {
100 newGeometry.adjust(0, pos, 0, 0);
101 int Size = qBound(m_minSize, newGeometry.height(), m_maxSize);
102 pos += (newGeometry.height() - Size);
103 newGeometry.setHeight(Size);
104 newGeometry.moveBottomLeft(oldGeometry.bottomLeft());
105 } break;
106
107 case Qt::BottomEdge: {
108 newGeometry.adjust(0, 0, 0, pos);
109 int Size = qBound(m_minSize, newGeometry.height(), m_maxSize);
110 pos -= (newGeometry.height() - Size);
111 newGeometry.setHeight(Size);
112 } break;
113 }
114
115 if (q->opaqueResize() || forceResize) {
116 m_target->setGeometry(newGeometry);
117 } else {
118 setRubberBand(pos);
119 }
120}
121
122DockResizeHandle::DockResizeHandle(Qt::Edge handlePosition, QWidget *parent)
123 : Super(parent)
124{
126 Q_D(DockResizeHandle);
127 d->m_target = parent;
129 setHandlePosition(handlePosition);
130}
131
136
140Qt::Orientation DockResizeHandle::orientation() const
141{
142 Q_D(const DockResizeHandle);
143 switch (d->m_handlePosition) {
144 case Qt::LeftEdge: // fall through
145 case Qt::RightEdge:
146 return Qt::Horizontal;
147
148 case Qt::TopEdge: // fall through
149 case Qt::BottomEdge:
150 return Qt::Vertical;
151 }
152
153 return Qt::Horizontal;
154}
155
157{
158 Q_D(const DockResizeHandle);
159 QSize result;
160 switch (d->m_handlePosition) {
161 case Qt::LeftEdge: // fall through
162 case Qt::RightEdge:
163 result = QSize(d->m_handleWidth, d->m_target->height());
164 break;
165
166 case Qt::TopEdge: // fall through
167 case Qt::BottomEdge:
168 result = QSize(d->m_target->width(), d->m_handleWidth);
169 break;
170 }
171
172 return result;
173}
174
176{
177 Q_D(const DockResizeHandle);
178 return d->m_pressed;
179}
180
187{
188 Q_D(DockResizeHandle);
189 d->m_minSize = minSize;
190}
191
198{
199 Q_D(DockResizeHandle);
200 d->m_maxSize = maxSize;
201}
202
204{
205 Q_D(const DockResizeHandle);
206 return d->m_handlePosition;
207}
208
209void DockResizeHandle::setHandlePosition(Qt::Edge handlePosition)
210{
211 Q_D(DockResizeHandle);
212 d->m_handlePosition = handlePosition;
213 switch (d->m_handlePosition) {
214 case Qt::LeftEdge: // fall through
215 case Qt::RightEdge:
216 setCursor(Qt::SizeHorCursor);
217 break;
218
219 case Qt::TopEdge: // fall through
220 case Qt::BottomEdge:
221 setCursor(Qt::SizeVerCursor);
222 break;
223 }
224 // FIXME: should be parentWidget() or m_target->parentWidget() here ??
225 setMaxResizeSize(d->isHorizontal() ? parentWidget()->width() : parentWidget()->height());
226 if (d->isHorizontal()) {
227 // horizontal resizing, the ResizeHandle with is fixed (vertical sliver)
228 setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding);
229 } else {
230 setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
231 }
232}
233
239{
240 Q_D(const DockResizeHandle);
241 return d->m_opaqueResize;
242}
243
245{
246 Q_D(DockResizeHandle);
247 d->m_opaqueResize = opaque;
248}
249
251{
252 Q_D(DockResizeHandle);
253 if (!(e->buttons() & Qt::LeftButton)) {
254 return;
255 }
256
257 d->doResizing(e);
258}
259
261{
262 Q_D(DockResizeHandle);
263 if (e->button() == Qt::LeftButton) {
264 d->m_mouseOffset = d->pick(e->pos());
265 d->m_pressed = true;
266 update();
267 }
268}
269
271{
272 Q_D(DockResizeHandle);
273 if (!opaqueResize() && e->button() == Qt::LeftButton) {
274 if (d->m_rubberBand) {
275 d->m_rubberBand->deleteLater();
276 }
277 d->doResizing(e, true);
278 }
279 if (e->button() == Qt::LeftButton) {
280 d->m_pressed = false;
281 update();
282 }
283}
284
Resize handle for resizing its parent widget (such as DockAutoHideContainer)
QSize sizeHint() const override
void setOpaqueResize(bool opaque=true)
void mouseReleaseEvent(QMouseEvent *e) override
void setMaxResizeSize(int maxSize)
Sets the maximum size for the widget that is going to be resized The resize handle will not resize th...
void mouseMoveEvent(QMouseEvent *e) override
bool opaqueResize() const
Returns true if widgets are resized dynamically (opaquely) while interactively moving the resize hand...
Qt::Orientation orientation() const
Returns the orientation of resizing
void mousePressEvent(QMouseEvent *e) override
void setMinResizeSize(int minSize)
Sets the minimum size for the widget that is going to be resized.
void setHandlePosition(Qt::Edge handlePosition)
#define QX_INIT_PRIVATE(Class)
#define QX_DECLARE_PUBLIC(Class)
#define QX_FINI_PRIVATE()
#define QX_DOCK_END_NAMESPACE
#define QX_DOCK_BEGIN_NAMESPACE