13class DockResizeHandlePrivate
18 DockResizeHandlePrivate();
20 bool isHorizontal()
const;
21 int pick(
const QPoint &pos)
const;
22 void setRubberBand(
int Pos);
23 void doResizing(QMouseEvent *e,
bool forceResize =
false);
25 QWidget *m_target =
nullptr;
26 QPointer<QRubberBand> m_rubberBand;
27 Qt::Edge m_handlePosition = Qt::LeftEdge;
30 int m_mouseOffset = 0;
31 int m_handleWidth = 4;
32 bool m_opaqueResize =
false;
33 bool m_pressed =
false;
36DockResizeHandlePrivate::DockResizeHandlePrivate()
40bool DockResizeHandlePrivate::isHorizontal()
const
42 Q_Q(
const DockResizeHandle);
43 return q->orientation() == Qt::Horizontal;
46int DockResizeHandlePrivate::pick(
const QPoint &pos)
const
48 Q_Q(
const DockResizeHandle);
49 return q->orientation() == Qt::Horizontal ? pos.x() : pos.y();
52void DockResizeHandlePrivate::setRubberBand(
int Pos)
54 Q_Q(DockResizeHandle);
56 m_rubberBand =
new QRubberBand(QRubberBand::Line, m_target->parentWidget());
59 auto geometry = q->geometry();
60 auto topLeft = m_target->mapTo(m_target->parentWidget(), geometry.topLeft());
61 switch (m_handlePosition) {
72 geometry.moveTopLeft(topLeft);
73 m_rubberBand->setGeometry(geometry);
77void DockResizeHandlePrivate::doResizing(QMouseEvent *e,
bool forceResize)
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) {
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());
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);
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());
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);
115 if (q->opaqueResize() || forceResize) {
116 m_target->setGeometry(newGeometry);
122DockResizeHandle::DockResizeHandle(Qt::Edge handlePosition, QWidget *parent)
127 d->m_target = parent;
143 switch (d->m_handlePosition) {
146 return Qt::Horizontal;
153 return Qt::Horizontal;
160 switch (d->m_handlePosition) {
163 result = QSize(d->m_handleWidth, d->m_target->height());
168 result = QSize(d->m_target->width(), d->m_handleWidth);
189 d->m_minSize = minSize;
200 d->m_maxSize = maxSize;
206 return d->m_handlePosition;
212 d->m_handlePosition = handlePosition;
213 switch (d->m_handlePosition) {
216 setCursor(Qt::SizeHorCursor);
221 setCursor(Qt::SizeVerCursor);
225 setMaxResizeSize(d->isHorizontal() ? parentWidget()->width() : parentWidget()->height());
226 if (d->isHorizontal()) {
228 setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding);
230 setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
241 return d->m_opaqueResize;
247 d->m_opaqueResize = opaque;
253 if (!(e->buttons() & Qt::LeftButton)) {
263 if (e->button() == Qt::LeftButton) {
264 d->m_mouseOffset = d->pick(e->pos());
274 if (d->m_rubberBand) {
275 d->m_rubberBand->deleteLater();
277 d->doResizing(e,
true);
279 if (e->button() == Qt::LeftButton) {
280 d->m_pressed =
false;
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...
virtual ~DockResizeHandle()
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)
Qt::Edge handlePostion() const
#define QX_INIT_PRIVATE(Class)
#define QX_DECLARE_PUBLIC(Class)
#define QX_FINI_PRIVATE()
#define QX_DOCK_END_NAMESPACE
#define QX_DOCK_BEGIN_NAMESPACE