qdockwidget.cpp

Absolute File Name:/home/qt/qt5_coco/qt5/qtbase/src/widgets/widgets/qdockwidget.cpp
Source codeSwitch to Preprocessed file
LineSourceCount
1/****************************************************************************-
2**-
3** Copyright (C) 2015 The Qt Company Ltd.-
4** Contact: http://www.qt.io/licensing/-
5**-
6** This file is part of the QtWidgets module of the Qt Toolkit.-
7**-
8** $QT_BEGIN_LICENSE:LGPL21$-
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 http://www.qt.io/terms-conditions. For further-
15** information use the contact form at http://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 2.1 or version 3 as published by the Free-
20** Software Foundation and appearing in the file LICENSE.LGPLv21 and-
21** LICENSE.LGPLv3 included in the packaging of this file. Please review the-
22** following information to ensure the GNU Lesser General Public License-
23** requirements will be met: https://www.gnu.org/licenses/lgpl.html and-
24** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.-
25**-
26** As a special exception, The Qt Company gives you certain additional-
27** rights. These rights are described in The Qt Company LGPL Exception-
28** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.-
29**-
30** $QT_END_LICENSE$-
31**-
32****************************************************************************/-
33-
34#include "qdockwidget.h"-
35-
36#ifndef QT_NO_DOCKWIDGET-
37#include <qaction.h>-
38#include <qapplication.h>-
39#include <qdesktopwidget.h>-
40#include <qdrawutil.h>-
41#include <qevent.h>-
42#include <qfontmetrics.h>-
43#include <qwindow.h>-
44#include <qscreen.h>-
45#include <qmainwindow.h>-
46#include <qrubberband.h>-
47#include <qstylepainter.h>-
48#include <qtoolbutton.h>-
49#include <qdebug.h>-
50-
51#include <private/qwidgetresizehandler_p.h>-
52-
53#include "qdockwidget_p.h"-
54#include "qmainwindowlayout_p.h"-
55#ifdef Q_DEAD_CODE_FROM_QT4_MAC-
56#include <private/qapplication_p.h>-
57#include <private/qt_mac_p.h>-
58#include <private/qmacstyle_mac_p.h>-
59#endif-
60-
61QT_BEGIN_NAMESPACE-
62-
63extern QString qt_setWindowTitle_helperHelper(const QString&, const QWidget*); // qwidget.cpp-
64-
65// qmainwindow.cpp-
66extern QMainWindowLayout *qt_mainwindow_layout(const QMainWindow *window);-
67-
68static inline QMainWindowLayout *qt_mainwindow_layout_from_dock(const QDockWidget *dock)-
69{-
70 const QWidget *p = dock->parentWidget();-
71 while (p) {
pDescription
TRUEnever evaluated
FALSEnever evaluated
0
72 const QMainWindow *window = qobject_cast<const QMainWindow*>(p);-
73 if (window)
windowDescription
TRUEnever evaluated
FALSEnever evaluated
0
74 return qt_mainwindow_layout(window);
never executed: return qt_mainwindow_layout(window);
0
75 p = p->parentWidget();-
76 }
never executed: end of block
0
77 return Q_NULLPTR;
never executed: return nullptr;
0
78}-
79-
80static inline bool hasFeature(const QDockWidgetPrivate *priv, QDockWidget::DockWidgetFeature feature)-
81{
never executed: return (priv->features & feature) == feature;
return (priv->features & feature) == feature; }
never executed: return (priv->features & feature) == feature;
0
82-
83static inline bool hasFeature(const QDockWidget *dockwidget, QDockWidget::DockWidgetFeature feature)-
84{
never executed: return (dockwidget->features() & feature) == feature;
return (dockwidget->features() & feature) == feature; }
never executed: return (dockwidget->features() & feature) == feature;
0
85-
86-
87/*-
88 A Dock Window:-
89-
90 [+] is the float button-
91 [X] is the close button-
92-
93 +-------------------------------+-
94 | Dock Window Title [+][X]|-
95 +-------------------------------+-
96 | |-
97 | place to put the single |-
98 | QDockWidget child (this space |-
99 | does not yet have a name) |-
100 | |-
101 | |-
102 | |-
103 | |-
104 | |-
105 | |-
106 | |-
107 | |-
108 | |-
109 +-------------------------------+-
110-
111*/-
112-
113/******************************************************************************-
114** QDockWidgetTitleButton-
115*/-
116-
117class QDockWidgetTitleButton : public QAbstractButton-
118{-
119 Q_OBJECT-
120-
121public:-
122 QDockWidgetTitleButton(QDockWidget *dockWidget);-
123-
124 QSize sizeHint() const Q_DECL_OVERRIDE;-
125 QSize minimumSizeHint() const Q_DECL_OVERRIDE-
126 { return sizeHint(); }
never executed: return sizeHint();
0
127-
128 void enterEvent(QEvent *event) Q_DECL_OVERRIDE;-
129 void leaveEvent(QEvent *event) Q_DECL_OVERRIDE;-
130 void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE;-
131};-
132-
133-
134QDockWidgetTitleButton::QDockWidgetTitleButton(QDockWidget *dockWidget)-
135 : QAbstractButton(dockWidget)-
136{-
137 setFocusPolicy(Qt::NoFocus);-
138}
never executed: end of block
0
139-
140QSize QDockWidgetTitleButton::sizeHint() const-
141{-
142 ensurePolished();-
143-
144 int size = 2*style()->pixelMetric(QStyle::PM_DockWidgetTitleBarButtonMargin, 0, this);-
145 if (!icon().isNull()) {
!icon().isNull()Description
TRUEnever evaluated
FALSEnever evaluated
0
146 int iconSize = style()->pixelMetric(QStyle::PM_SmallIconSize, 0, this);-
147 QSize sz = icon().actualSize(QSize(iconSize, iconSize));-
148 size += qMax(sz.width(), sz.height());-
149 }
never executed: end of block
0
150-
151 return QSize(size, size);
never executed: return QSize(size, size);
0
152}-
153-
154void QDockWidgetTitleButton::enterEvent(QEvent *event)-
155{-
156 if (isEnabled()) update();
never executed: update();
isEnabled()Description
TRUEnever evaluated
FALSEnever evaluated
0
157 QAbstractButton::enterEvent(event);-
158}
never executed: end of block
0
159-
160void QDockWidgetTitleButton::leaveEvent(QEvent *event)-
161{-
162 if (isEnabled()) update();
never executed: update();
isEnabled()Description
TRUEnever evaluated
FALSEnever evaluated
0
163 QAbstractButton::leaveEvent(event);-
164}
never executed: end of block
0
165-
166void QDockWidgetTitleButton::paintEvent(QPaintEvent *)-
167{-
168 QPainter p(this);-
169-
170 QStyleOptionToolButton opt;-
171 opt.init(this);-
172 opt.state |= QStyle::State_AutoRaise;-
173-
174 if (style()->styleHint(QStyle::SH_DockWidget_ButtonsHaveFrame, 0, this))
style()->style...rame, 0, this)Description
TRUEnever evaluated
FALSEnever evaluated
0
175 {-
176 if (isEnabled() && underMouse() && !isChecked() && !isDown())
isEnabled()Description
TRUEnever evaluated
FALSEnever evaluated
underMouse()Description
TRUEnever evaluated
FALSEnever evaluated
!isChecked()Description
TRUEnever evaluated
FALSEnever evaluated
!isDown()Description
TRUEnever evaluated
FALSEnever evaluated
0
177 opt.state |= QStyle::State_Raised;
never executed: opt.state |= QStyle::State_Raised;
0
178 if (isChecked())
isChecked()Description
TRUEnever evaluated
FALSEnever evaluated
0
179 opt.state |= QStyle::State_On;
never executed: opt.state |= QStyle::State_On;
0
180 if (isDown())
isDown()Description
TRUEnever evaluated
FALSEnever evaluated
0
181 opt.state |= QStyle::State_Sunken;
never executed: opt.state |= QStyle::State_Sunken;
0
182 style()->drawPrimitive(QStyle::PE_PanelButtonTool, &opt, &p, this);-
183 }
never executed: end of block
0
184-
185 opt.icon = icon();-
186 opt.subControls = 0;-
187 opt.activeSubControls = 0;-
188 opt.features = QStyleOptionToolButton::None;-
189 opt.arrowType = Qt::NoArrow;-
190 int size = style()->pixelMetric(QStyle::PM_SmallIconSize, 0, this);-
191 opt.iconSize = QSize(size, size);-
192 style()->drawComplexControl(QStyle::CC_ToolButton, &opt, &p, this);-
193}
never executed: end of block
0
194-
195/******************************************************************************-
196** QDockWidgetLayout-
197*/-
198-
199QDockWidgetLayout::QDockWidgetLayout(QWidget *parent)-
200 : QLayout(parent), verticalTitleBar(false), item_list(RoleCount, 0)-
201{-
202}
never executed: end of block
0
203-
204QDockWidgetLayout::~QDockWidgetLayout()-
205{-
206 qDeleteAll(item_list);-
207}
never executed: end of block
0
208-
209/*! \internal-
210 Returns true if the dock widget managed by this layout should have a native-
211 window decoration or if Qt needs to draw it.-
212 */-
213bool QDockWidgetLayout::nativeWindowDeco() const-
214{-
215 bool floating = parentWidget()->isWindow();-
216 if (!floating && qobject_cast<QDockWidgetGroupWindow*>(parentWidget()->parentWidget()))
!floatingDescription
TRUEnever evaluated
FALSEnever evaluated
qobject_cast<Q...arentWidget())Description
TRUEnever evaluated
FALSEnever evaluated
0
217 return wmSupportsNativeWindowDeco();
never executed: return wmSupportsNativeWindowDeco();
0
218 return nativeWindowDeco(floating);
never executed: return nativeWindowDeco(floating);
0
219}-
220-
221/*! \internal-
222 Returns true if the window manager can draw natively the windows decoration-
223 of a dock widget-
224 */-
225bool QDockWidgetLayout::wmSupportsNativeWindowDeco()-
226{-
227#if defined(Q_OS_WINCE) || defined(Q_OS_ANDROID)-
228 return false;-
229#else-
230 static const bool xcb = !QGuiApplication::platformName().compare(QLatin1String("xcb"), Qt::CaseInsensitive);-
231 return !xcb;
never executed: return !xcb;
0
232#endif-
233}-
234-
235/*! \internal-
236 Returns true if the dock widget managed by this layout should have a native-
237 window decoration or if Qt needs to draw it. The \a floating parameter-
238 overrides the floating current state of the dock widget.-
239 */-
240bool QDockWidgetLayout::nativeWindowDeco(bool floating) const-
241{-
242 return wmSupportsNativeWindowDeco() && floating && item_list.at(QDockWidgetLayout::TitleBar) == 0;
never executed: return wmSupportsNativeWindowDeco() && floating && item_list.at(QDockWidgetLayout::TitleBar) == 0;
wmSupportsNativeWindowDeco()Description
TRUEnever evaluated
FALSEnever evaluated
floatingDescription
TRUEnever evaluated
FALSEnever evaluated
item_list.at(Q...TitleBar) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
243}-
244-
245-
246void QDockWidgetLayout::addItem(QLayoutItem*)-
247{-
248 qWarning("QDockWidgetLayout::addItem(): please use QDockWidgetLayout::setWidget()");-
249 return;
never executed: return;
0
250}-
251-
252QLayoutItem *QDockWidgetLayout::itemAt(int index) const-
253{-
254 int cnt = 0;-
255 for (int i = 0; i < item_list.count(); ++i) {
i < item_list.count()Description
TRUEnever evaluated
FALSEnever evaluated
0
256 QLayoutItem *item = item_list.at(i);-
257 if (item == 0)
item == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
258 continue;
never executed: continue;
0
259 if (index == cnt++)
index == cnt++Description
TRUEnever evaluated
FALSEnever evaluated
0
260 return item;
never executed: return item;
0
261 }
never executed: end of block
0
262 return 0;
never executed: return 0;
0
263}-
264-
265QLayoutItem *QDockWidgetLayout::takeAt(int index)-
266{-
267 int j = 0;-
268 for (int i = 0; i < item_list.count(); ++i) {
i < item_list.count()Description
TRUEnever evaluated
FALSEnever evaluated
0
269 QLayoutItem *item = item_list.at(i);-
270 if (item == 0)
item == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
271 continue;
never executed: continue;
0
272 if (index == j) {
index == jDescription
TRUEnever evaluated
FALSEnever evaluated
0
273 item_list[i] = 0;-
274 invalidate();-
275 return item;
never executed: return item;
0
276 }-
277 ++j;-
278 }
never executed: end of block
0
279 return 0;
never executed: return 0;
0
280}-
281-
282int QDockWidgetLayout::count() const-
283{-
284 int result = 0;-
285 for (int i = 0; i < item_list.count(); ++i) {
i < item_list.count()Description
TRUEnever evaluated
FALSEnever evaluated
0
286 if (item_list.at(i))
item_list.at(i)Description
TRUEnever evaluated
FALSEnever evaluated
0
287 ++result;
never executed: ++result;
0
288 }
never executed: end of block
0
289 return result;
never executed: return result;
0
290}-
291-
292QSize QDockWidgetLayout::sizeFromContent(const QSize &content, bool floating) const-
293{-
294 QSize result = content;-
295-
296 if (verticalTitleBar) {
verticalTitleBarDescription
TRUEnever evaluated
FALSEnever evaluated
0
297 result.setHeight(qMax(result.height(), minimumTitleWidth()));-
298 result.setWidth(qMax(content.width(), 0));-
299 } else {
never executed: end of block
0
300 result.setHeight(qMax(result.height(), 0));-
301 result.setWidth(qMax(content.width(), minimumTitleWidth()));-
302 }
never executed: end of block
0
303-
304 QDockWidget *w = qobject_cast<QDockWidget*>(parentWidget());-
305 const bool nativeDeco = nativeWindowDeco(floating);-
306-
307 int fw = floating && !nativeDeco
floatingDescription
TRUEnever evaluated
FALSEnever evaluated
!nativeDecoDescription
TRUEnever evaluated
FALSEnever evaluated
0
308 ? w->style()->pixelMetric(QStyle::PM_DockWidgetFrameWidth, 0, w)-
309 : 0;-
310-
311 const int th = titleHeight();-
312 if (!nativeDeco) {
!nativeDecoDescription
TRUEnever evaluated
FALSEnever evaluated
0
313 if (verticalTitleBar)
verticalTitleBarDescription
TRUEnever evaluated
FALSEnever evaluated
0
314 result += QSize(th + 2*fw, 2*fw);
never executed: result += QSize(th + 2*fw, 2*fw);
0
315 else-
316 result += QSize(2*fw, th + 2*fw);
never executed: result += QSize(2*fw, th + 2*fw);
0
317 }-
318-
319 result.setHeight(qMin(result.height(), (int) QWIDGETSIZE_MAX));-
320 result.setWidth(qMin(result.width(), (int) QWIDGETSIZE_MAX));-
321-
322 if (content.width() < 0)
content.width() < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
323 result.setWidth(-1);
never executed: result.setWidth(-1);
0
324 if (content.height() < 0)
content.height() < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
325 result.setHeight(-1);
never executed: result.setHeight(-1);
0
326-
327 int left, top, right, bottom;-
328 w->getContentsMargins(&left, &top, &right, &bottom);-
329 //we need to subtract the contents margin (it will be added by the caller)-
330 QSize min = w->minimumSize() - QSize(left + right, top + bottom);-
331 QSize max = w->maximumSize() - QSize(left + right, top + bottom);-
332-
333 /* A floating dockwidget will automatically get its minimumSize set to the layout's-
334 minimum size + deco. We're *not* interested in this, we only take minimumSize()-
335 into account if the user set it herself. Otherwise we end up expanding the result-
336 of a calculation for a non-floating dock widget to a floating dock widget's-
337 minimum size + window decorations. */-
338-
339 uint explicitMin = 0;-
340 uint explicitMax = 0;-
341 if (w->d_func()->extra != 0) {
w->d_func()->extra != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
342 explicitMin = w->d_func()->extra->explicitMinSize;-
343 explicitMax = w->d_func()->extra->explicitMaxSize;-
344 }
never executed: end of block
0
345-
346 if (!(explicitMin & Qt::Horizontal) || min.width() == 0)
!(explicitMin ...t::Horizontal)Description
TRUEnever evaluated
FALSEnever evaluated
min.width() == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
347 min.setWidth(-1);
never executed: min.setWidth(-1);
0
348 if (!(explicitMin & Qt::Vertical) || min.height() == 0)
!(explicitMin & Qt::Vertical)Description
TRUEnever evaluated
FALSEnever evaluated
min.height() == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
349 min.setHeight(-1);
never executed: min.setHeight(-1);
0
350-
351 if (!(explicitMax & Qt::Horizontal))
!(explicitMax ...t::Horizontal)Description
TRUEnever evaluated
FALSEnever evaluated
0
352 max.setWidth(QWIDGETSIZE_MAX);
never executed: max.setWidth(((1<<24)-1));
0
353 if (!(explicitMax & Qt::Vertical))
!(explicitMax & Qt::Vertical)Description
TRUEnever evaluated
FALSEnever evaluated
0
354 max.setHeight(QWIDGETSIZE_MAX);
never executed: max.setHeight(((1<<24)-1));
0
355-
356 return result.boundedTo(max).expandedTo(min);
never executed: return result.boundedTo(max).expandedTo(min);
0
357}-
358-
359QSize QDockWidgetLayout::sizeHint() const-
360{-
361 QDockWidget *w = qobject_cast<QDockWidget*>(parentWidget());-
362-
363 QSize content(-1, -1);-
364 if (item_list[Content] != 0)
item_list[Content] != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
365 content = item_list[Content]->sizeHint();
never executed: content = item_list[Content]->sizeHint();
0
366-
367 return sizeFromContent(content, w->isFloating());
never executed: return sizeFromContent(content, w->isFloating());
0
368}-
369-
370QSize QDockWidgetLayout::maximumSize() const-
371{-
372 if (item_list[Content] != 0) {
item_list[Content] != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
373 const QSize content = item_list[Content]->maximumSize();-
374 return sizeFromContent(content, parentWidget()->isWindow());
never executed: return sizeFromContent(content, parentWidget()->isWindow());
0
375 } else {-
376 return parentWidget()->maximumSize();
never executed: return parentWidget()->maximumSize();
0
377 }-
378-
379}-
380-
381QSize QDockWidgetLayout::minimumSize() const-
382{-
383 QDockWidget *w = qobject_cast<QDockWidget*>(parentWidget());-
384-
385 QSize content(0, 0);-
386 if (item_list[Content] != 0)
item_list[Content] != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
387 content = item_list[Content]->minimumSize();
never executed: content = item_list[Content]->minimumSize();
0
388-
389 return sizeFromContent(content, w->isFloating());
never executed: return sizeFromContent(content, w->isFloating());
0
390}-
391-
392QWidget *QDockWidgetLayout::widgetForRole(Role r) const-
393{-
394 QLayoutItem *item = item_list.at(r);-
395 return item == 0 ? 0 : item->widget();
never executed: return item == 0 ? 0 : item->widget();
item == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
396}-
397-
398QLayoutItem *QDockWidgetLayout::itemForRole(Role r) const-
399{-
400 return item_list.at(r);
never executed: return item_list.at(r);
0
401}-
402-
403void QDockWidgetLayout::setWidgetForRole(Role r, QWidget *w)-
404{-
405 QWidget *old = widgetForRole(r);-
406 if (old != 0) {
old != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
407 old->hide();-
408 removeWidget(old);-
409 }
never executed: end of block
0
410-
411 if (w != 0) {
w != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
412 addChildWidget(w);-
413 item_list[r] = new QWidgetItemV2(w);-
414 w->show();-
415 } else {
never executed: end of block
0
416 item_list[r] = 0;-
417 }
never executed: end of block
0
418-
419 invalidate();-
420}
never executed: end of block
0
421-
422static inline int pick(bool vertical, const QSize &size)-
423{-
424 return vertical ? size.height() : size.width();
never executed: return vertical ? size.height() : size.width();
verticalDescription
TRUEnever evaluated
FALSEnever evaluated
0
425}-
426-
427static inline int perp(bool vertical, const QSize &size)-
428{-
429 return vertical ? size.width() : size.height();
never executed: return vertical ? size.width() : size.height();
verticalDescription
TRUEnever evaluated
FALSEnever evaluated
0
430}-
431-
432int QDockWidgetLayout::minimumTitleWidth() const-
433{-
434 QDockWidget *q = qobject_cast<QDockWidget*>(parentWidget());-
435-
436 if (QWidget *title = widgetForRole(TitleBar))
QWidget *title...Role(TitleBar)Description
TRUEnever evaluated
FALSEnever evaluated
0
437 return pick(verticalTitleBar, title->minimumSizeHint());
never executed: return pick(verticalTitleBar, title->minimumSizeHint());
0
438-
439 QSize closeSize(0, 0);-
440 QSize floatSize(0, 0);-
441 if (hasFeature(q, QDockWidget::DockWidgetClosable)) {
hasFeature(q, ...idgetClosable)Description
TRUEnever evaluated
FALSEnever evaluated
0
442 if (QLayoutItem *item = item_list[CloseButton])
QLayoutItem *i...t[CloseButton]Description
TRUEnever evaluated
FALSEnever evaluated
0
443 closeSize = item->widget()->sizeHint();
never executed: closeSize = item->widget()->sizeHint();
0
444 }
never executed: end of block
0
445 if (hasFeature(q, QDockWidget::DockWidgetFloatable)) {
hasFeature(q, ...dgetFloatable)Description
TRUEnever evaluated
FALSEnever evaluated
0
446 if (QLayoutItem *item = item_list[FloatButton])
QLayoutItem *i...t[FloatButton]Description
TRUEnever evaluated
FALSEnever evaluated
0
447 floatSize = item->widget()->sizeHint();
never executed: floatSize = item->widget()->sizeHint();
0
448 }
never executed: end of block
0
449-
450 int titleHeight = this->titleHeight();-
451-
452 int mw = q->style()->pixelMetric(QStyle::PM_DockWidgetTitleMargin, 0, q);-
453 int fw = q->style()->pixelMetric(QStyle::PM_DockWidgetFrameWidth, 0, q);-
454-
455 return pick(verticalTitleBar, closeSize)
never executed: return pick(verticalTitleBar, closeSize) + pick(verticalTitleBar, floatSize) + titleHeight + 2*fw + 3*mw;
0
456 + pick(verticalTitleBar, floatSize)
never executed: return pick(verticalTitleBar, closeSize) + pick(verticalTitleBar, floatSize) + titleHeight + 2*fw + 3*mw;
0
457 + titleHeight + 2*fw + 3*mw;
never executed: return pick(verticalTitleBar, closeSize) + pick(verticalTitleBar, floatSize) + titleHeight + 2*fw + 3*mw;
0
458}-
459-
460int QDockWidgetLayout::titleHeight() const-
461{-
462 QDockWidget *q = qobject_cast<QDockWidget*>(parentWidget());-
463-
464 if (QWidget *title = widgetForRole(TitleBar))
QWidget *title...Role(TitleBar)Description
TRUEnever evaluated
FALSEnever evaluated
0
465 return perp(verticalTitleBar, title->sizeHint());
never executed: return perp(verticalTitleBar, title->sizeHint());
0
466-
467 QSize closeSize(0, 0);-
468 QSize floatSize(0, 0);-
469 if (QLayoutItem *item = item_list[CloseButton])
QLayoutItem *i...t[CloseButton]Description
TRUEnever evaluated
FALSEnever evaluated
0
470 closeSize = item->widget()->sizeHint();
never executed: closeSize = item->widget()->sizeHint();
0
471 if (QLayoutItem *item = item_list[FloatButton])
QLayoutItem *i...t[FloatButton]Description
TRUEnever evaluated
FALSEnever evaluated
0
472 floatSize = item->widget()->sizeHint();
never executed: floatSize = item->widget()->sizeHint();
0
473-
474 int buttonHeight = qMax(perp(verticalTitleBar, closeSize),-
475 perp(verticalTitleBar, floatSize));-
476-
477 QFontMetrics titleFontMetrics = q->fontMetrics();-
478 int mw = q->style()->pixelMetric(QStyle::PM_DockWidgetTitleMargin, 0, q);-
479-
480 return qMax(buttonHeight + 2, titleFontMetrics.height() + 2*mw);
never executed: return qMax(buttonHeight + 2, titleFontMetrics.height() + 2*mw);
0
481}-
482-
483void QDockWidgetLayout::setGeometry(const QRect &geometry)-
484{-
485 QDockWidget *q = qobject_cast<QDockWidget*>(parentWidget());-
486-
487 bool nativeDeco = nativeWindowDeco();-
488-
489 int fw = q->isFloating() && !nativeDeco
q->isFloating()Description
TRUEnever evaluated
FALSEnever evaluated
!nativeDecoDescription
TRUEnever evaluated
FALSEnever evaluated
0
490 ? q->style()->pixelMetric(QStyle::PM_DockWidgetFrameWidth, 0, q)-
491 : 0;-
492-
493 if (nativeDeco) {
nativeDecoDescription
TRUEnever evaluated
FALSEnever evaluated
0
494 if (QLayoutItem *item = item_list[Content])
QLayoutItem *i..._list[Content]Description
TRUEnever evaluated
FALSEnever evaluated
0
495 item->setGeometry(geometry);
never executed: item->setGeometry(geometry);
0
496 } else {
never executed: end of block
0
497 int titleHeight = this->titleHeight();-
498-
499 if (verticalTitleBar) {
verticalTitleBarDescription
TRUEnever evaluated
FALSEnever evaluated
0
500 _titleArea = QRect(QPoint(fw, fw),-
501 QSize(titleHeight, geometry.height() - (fw * 2)));-
502 } else {
never executed: end of block
0
503 _titleArea = QRect(QPoint(fw, fw),-
504 QSize(geometry.width() - (fw * 2), titleHeight));-
505 }
never executed: end of block
0
506-
507 if (QLayoutItem *item = item_list[TitleBar]) {
QLayoutItem *i...list[TitleBar]Description
TRUEnever evaluated
FALSEnever evaluated
0
508 item->setGeometry(_titleArea);-
509 } else {
never executed: end of block
0
510 QStyleOptionDockWidget opt;-
511 q->initStyleOption(&opt);-
512-
513 if (QLayoutItem *item = item_list[CloseButton]) {
QLayoutItem *i...t[CloseButton]Description
TRUEnever evaluated
FALSEnever evaluated
0
514 if (!item->isEmpty()) {
!item->isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
0
515 QRect r = q->style()-
516 ->subElementRect(QStyle::SE_DockWidgetCloseButton,-
517 &opt, q);-
518 if (!r.isNull())
!r.isNull()Description
TRUEnever evaluated
FALSEnever evaluated
0
519 item->setGeometry(r);
never executed: item->setGeometry(r);
0
520 }
never executed: end of block
0
521 }
never executed: end of block
0
522-
523 if (QLayoutItem *item = item_list[FloatButton]) {
QLayoutItem *i...t[FloatButton]Description
TRUEnever evaluated
FALSEnever evaluated
0
524 if (!item->isEmpty()) {
!item->isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
0
525 QRect r = q->style()-
526 ->subElementRect(QStyle::SE_DockWidgetFloatButton,-
527 &opt, q);-
528 if (!r.isNull())
!r.isNull()Description
TRUEnever evaluated
FALSEnever evaluated
0
529 item->setGeometry(r);
never executed: item->setGeometry(r);
0
530 }
never executed: end of block
0
531 }
never executed: end of block
0
532 }
never executed: end of block
0
533-
534 if (QLayoutItem *item = item_list[Content]) {
QLayoutItem *i..._list[Content]Description
TRUEnever evaluated
FALSEnever evaluated
0
535 QRect r = geometry;-
536 if (verticalTitleBar) {
verticalTitleBarDescription
TRUEnever evaluated
FALSEnever evaluated
0
537 r.setLeft(_titleArea.right() + 1);-
538 r.adjust(0, fw, -fw, -fw);-
539 } else {
never executed: end of block
0
540 r.setTop(_titleArea.bottom() + 1);-
541 r.adjust(fw, 0, -fw, -fw);-
542 }
never executed: end of block
0
543 item->setGeometry(r);-
544 }
never executed: end of block
0
545 }
never executed: end of block
0
546}-
547-
548void QDockWidgetLayout::setVerticalTitleBar(bool b)-
549{-
550 if (b == verticalTitleBar)
b == verticalTitleBarDescription
TRUEnever evaluated
FALSEnever evaluated
0
551 return;
never executed: return;
0
552 verticalTitleBar = b;-
553 invalidate();-
554 parentWidget()->update();-
555}
never executed: end of block
0
556-
557/******************************************************************************-
558** QDockWidgetItem-
559*/-
560-
561QDockWidgetItem::QDockWidgetItem(QDockWidget *dockWidget)-
562 : QWidgetItem(dockWidget)-
563{-
564}
never executed: end of block
0
565-
566QSize QDockWidgetItem::minimumSize() const-
567{-
568 QSize widgetMin(0, 0);-
569 if (QLayoutItem *item = dockWidgetChildItem())
QLayoutItem *i...getChildItem()Description
TRUEnever evaluated
FALSEnever evaluated
0
570 widgetMin = item->minimumSize();
never executed: widgetMin = item->minimumSize();
0
571 return dockWidgetLayout()->sizeFromContent(widgetMin, false);
never executed: return dockWidgetLayout()->sizeFromContent(widgetMin, false);
0
572}-
573-
574QSize QDockWidgetItem::maximumSize() const-
575{-
576 if (QLayoutItem *item = dockWidgetChildItem()) {
QLayoutItem *i...getChildItem()Description
TRUEnever evaluated
FALSEnever evaluated
0
577 return dockWidgetLayout()->sizeFromContent(item->maximumSize(), false);
never executed: return dockWidgetLayout()->sizeFromContent(item->maximumSize(), false);
0
578 } else {-
579 return QSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX);
never executed: return QSize(((1<<24)-1), ((1<<24)-1));
0
580 }-
581}-
582-
583-
584QSize QDockWidgetItem::sizeHint() const-
585{-
586 if (QLayoutItem *item = dockWidgetChildItem()) {
QLayoutItem *i...getChildItem()Description
TRUEnever evaluated
FALSEnever evaluated
0
587 return dockWidgetLayout()->sizeFromContent(item->sizeHint(), false);
never executed: return dockWidgetLayout()->sizeFromContent(item->sizeHint(), false);
0
588 } else {-
589 return QWidgetItem::sizeHint();
never executed: return QWidgetItem::sizeHint();
0
590 }-
591}-
592-
593/******************************************************************************-
594** QDockWidgetPrivate-
595*/-
596-
597void QDockWidgetPrivate::init()-
598{-
599 Q_Q(QDockWidget);-
600-
601 QDockWidgetLayout *layout = new QDockWidgetLayout(q);-
602 layout->setSizeConstraint(QLayout::SetMinAndMaxSize);-
603-
604 QAbstractButton *button = new QDockWidgetTitleButton(q);-
605 button->setObjectName(QLatin1String("qt_dockwidget_floatbutton"));-
606 QObject::connect(button, SIGNAL(clicked()), q, SLOT(_q_toggleTopLevel()));-
607 layout->setWidgetForRole(QDockWidgetLayout::FloatButton, button);-
608-
609 button = new QDockWidgetTitleButton(q);-
610 button->setObjectName(QLatin1String("qt_dockwidget_closebutton"));-
611 QObject::connect(button, SIGNAL(clicked()), q, SLOT(close()));-
612 layout->setWidgetForRole(QDockWidgetLayout::CloseButton, button);-
613-
614#ifndef QT_NO_ACTION-
615 toggleViewAction = new QAction(q);-
616 toggleViewAction->setCheckable(true);-
617 toggleViewAction->setMenuRole(QAction::NoRole);-
618 fixedWindowTitle = qt_setWindowTitle_helperHelper(q->windowTitle(), q);-
619 toggleViewAction->setText(fixedWindowTitle);-
620 QObject::connect(toggleViewAction, SIGNAL(triggered(bool)),-
621 q, SLOT(_q_toggleView(bool)));-
622#endif-
623-
624 updateButtons();-
625}
never executed: end of block
0
626-
627/*!-
628 Initialize \a option with the values from this QDockWidget. This method-
629 is useful for subclasses when they need a QStyleOptionDockWidget, but don't want-
630 to fill in all the information themselves.-
631-
632 \sa QStyleOption::initFrom()-
633*/-
634void QDockWidget::initStyleOption(QStyleOptionDockWidget *option) const-
635{-
636 Q_D(const QDockWidget);-
637-
638 if (!option)
!optionDescription
TRUEnever evaluated
FALSEnever evaluated
0
639 return;
never executed: return;
0
640 QDockWidgetLayout *dwlayout = qobject_cast<QDockWidgetLayout*>(layout());-
641-
642 QDockWidgetGroupWindow *floatingTab = qobject_cast<QDockWidgetGroupWindow*>(parent());-
643 // If we are in a floating tab, init from the parent because the attributes and the geometry-
644 // of the title bar should be taken from the floating window.-
645 option->initFrom(floatingTab && !isFloating() ? parentWidget() : this);-
646 option->rect = dwlayout->titleArea();-
647 option->title = d->fixedWindowTitle;-
648 option->closable = hasFeature(this, QDockWidget::DockWidgetClosable);-
649 option->movable = hasFeature(this, QDockWidget::DockWidgetMovable);-
650 option->floatable = hasFeature(this, QDockWidget::DockWidgetFloatable);-
651-
652 QDockWidgetLayout *l = qobject_cast<QDockWidgetLayout*>(layout());-
653 option->verticalTitleBar = l->verticalTitleBar;-
654}
never executed: end of block
0
655-
656void QDockWidgetPrivate::_q_toggleView(bool b)-
657{-
658 Q_Q(QDockWidget);-
659 if (b == q->isHidden()) {
b == q->isHidden()Description
TRUEnever evaluated
FALSEnever evaluated
0
660 if (b)
bDescription
TRUEnever evaluated
FALSEnever evaluated
0
661 q->show();
never executed: q->show();
0
662 else-
663 q->close();
never executed: q->close();
0
664 }-
665}
never executed: end of block
0
666-
667void QDockWidgetPrivate::updateButtons()-
668{-
669 Q_Q(QDockWidget);-
670 QDockWidgetLayout *dwLayout = qobject_cast<QDockWidgetLayout*>(layout);-
671-
672 QStyleOptionDockWidget opt;-
673 q->initStyleOption(&opt);-
674-
675 bool customTitleBar = dwLayout->widgetForRole(QDockWidgetLayout::TitleBar) != 0;-
676 bool nativeDeco = dwLayout->nativeWindowDeco();-
677 bool hideButtons = nativeDeco || customTitleBar;
nativeDecoDescription
TRUEnever evaluated
FALSEnever evaluated
customTitleBarDescription
TRUEnever evaluated
FALSEnever evaluated
0
678-
679 bool canClose = hasFeature(this, QDockWidget::DockWidgetClosable);-
680 bool canFloat = hasFeature(this, QDockWidget::DockWidgetFloatable);-
681-
682 QAbstractButton *button-
683 = qobject_cast<QAbstractButton*>(dwLayout->widgetForRole(QDockWidgetLayout::FloatButton));-
684 button->setIcon(q->style()->standardIcon(QStyle::SP_TitleBarNormalButton, &opt, q));-
685 button->setVisible(canFloat && !hideButtons);-
686#ifndef QT_NO_ACCESSIBILITY-
687 //: Accessible name for button undocking a dock widget (floating state)-
688 button->setAccessibleName(QDockWidget::tr("Float"));-
689 button->setAccessibleDescription(QDockWidget::tr("Undocks and re-attaches the dock widget"));-
690#endif-
691 button-
692 = qobject_cast <QAbstractButton*>(dwLayout->widgetForRole(QDockWidgetLayout::CloseButton));-
693 button->setIcon(q->style()->standardIcon(QStyle::SP_TitleBarCloseButton, &opt, q));-
694 button->setVisible(canClose && !hideButtons);-
695#ifndef QT_NO_ACCESSIBILITY-
696 //: Accessible name for button closing a dock widget-
697 button->setAccessibleName(QDockWidget::tr("Close"));-
698 button->setAccessibleDescription(QDockWidget::tr("Closes the dock widget"));-
699#endif-
700 q->setAttribute(Qt::WA_ContentsPropagated,-
701 (canFloat || canClose) && !hideButtons);-
702-
703 layout->invalidate();-
704}
never executed: end of block
0
705-
706void QDockWidgetPrivate::_q_toggleTopLevel()-
707{-
708 Q_Q(QDockWidget);-
709 q->setFloating(!q->isFloating());-
710}
never executed: end of block
0
711-
712/*! \internal-
713 Initialize the drag state structure and remember the position of the click.-
714 This is called when the mouse is pressed, but the dock is not yet dragged out.-
715-
716 \a nca specify that the event comes from NonClientAreaMouseButtonPress-
717 */-
718void QDockWidgetPrivate::initDrag(const QPoint &pos, bool nca)-
719{-
720 Q_Q(QDockWidget);-
721-
722 if (state != 0)
state != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
723 return;
never executed: return;
0
724-
725 QMainWindowLayout *layout = qt_mainwindow_layout_from_dock(q);-
726 Q_ASSERT(layout != 0);-
727 if (layout->pluggingWidget != 0) // the main window is animating a docking operation
layout->pluggingWidget != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
728 return;
never executed: return;
0
729-
730 state = new QDockWidgetPrivate::DragState;-
731 state->pressPos = pos;-
732 state->dragging = false;-
733 state->widgetItem = 0;-
734 state->ownWidgetItem = false;-
735 state->nca = nca;-
736 state->ctrlDrag = false;-
737}
never executed: end of block
0
738-
739/*! \internal-
740 Actually start the drag and detach the dockwidget.-
741 The \a group parameter is true when we should potentially drag a group of-
742 tabbed widgets, and false if the dock widget should always be dragged-
743 alone.-
744 */-
745void QDockWidgetPrivate::startDrag(bool group)-
746{-
747 Q_Q(QDockWidget);-
748-
749 if (state == 0 || state->dragging)
state == 0Description
TRUEnever evaluated
FALSEnever evaluated
state->draggingDescription
TRUEnever evaluated
FALSEnever evaluated
0
750 return;
never executed: return;
0
751-
752 QMainWindowLayout *layout = qt_mainwindow_layout_from_dock(q);-
753 Q_ASSERT(layout != 0);-
754-
755 state->widgetItem = layout->unplug(q, group);-
756 if (state->widgetItem == 0) {
state->widgetItem == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
757 /* I have a QMainWindow parent, but I was never inserted with-
758 QMainWindow::addDockWidget, so the QMainWindowLayout has no-
759 widget item for me. :( I have to create it myself, and then-
760 delete it if I don't get dropped into a dock area. */-
761 QDockWidgetGroupWindow *floatingTab = qobject_cast<QDockWidgetGroupWindow*>(parent);-
762 if (floatingTab && !q->isFloating())
floatingTabDescription
TRUEnever evaluated
FALSEnever evaluated
!q->isFloating()Description
TRUEnever evaluated
FALSEnever evaluated
0
763 state->widgetItem = new QDockWidgetGroupWindowItem(floatingTab);
never executed: state->widgetItem = new QDockWidgetGroupWindowItem(floatingTab);
0
764 else-
765 state->widgetItem = new QDockWidgetItem(q);
never executed: state->widgetItem = new QDockWidgetItem(q);
0
766 state->ownWidgetItem = true;-
767 }
never executed: end of block
0
768-
769 if (state->ctrlDrag)
state->ctrlDragDescription
TRUEnever evaluated
FALSEnever evaluated
0
770 layout->restore();
never executed: layout->restore();
0
771-
772 state->dragging = true;-
773}
never executed: end of block
0
774-
775/*! \internal-
776 Ends the drag end drop operation of the QDockWidget.-
777 The \a abort parameter specifies that it ends because of programmatic state-
778 reset rather than mouse release event.-
779 */-
780void QDockWidgetPrivate::endDrag(bool abort)-
781{-
782 Q_Q(QDockWidget);-
783 Q_ASSERT(state != 0);-
784-
785 q->releaseMouse();-
786-
787 if (state->dragging) {
state->draggingDescription
TRUEnever evaluated
FALSEnever evaluated
0
788 QMainWindowLayout *mwLayout = qt_mainwindow_layout_from_dock(q);-
789 Q_ASSERT(mwLayout != 0);-
790-
791 if (abort || !mwLayout->plug(state->widgetItem)) {
abortDescription
TRUEnever evaluated
FALSEnever evaluated
!mwLayout->plu...e->widgetItem)Description
TRUEnever evaluated
FALSEnever evaluated
0
792 if (hasFeature(this, QDockWidget::DockWidgetFloatable)) {
hasFeature(thi...dgetFloatable)Description
TRUEnever evaluated
FALSEnever evaluated
0
793 // This QDockWidget will now stay in the floating state.-
794 if (state->ownWidgetItem) {
state->ownWidgetItemDescription
TRUEnever evaluated
FALSEnever evaluated
0
795 delete state->widgetItem;-
796 state->widgetItem = Q_NULLPTR;-
797 }
never executed: end of block
0
798 mwLayout->restore();-
799 QDockWidgetLayout *dwLayout = qobject_cast<QDockWidgetLayout*>(layout);-
800 if (!dwLayout->nativeWindowDeco()) {
!dwLayout->nativeWindowDeco()Description
TRUEnever evaluated
FALSEnever evaluated
0
801 // get rid of the X11BypassWindowManager window flag and activate the resizer-
802 Qt::WindowFlags flags = q->windowFlags();-
803 flags &= ~Qt::X11BypassWindowManagerHint;-
804 q->setWindowFlags(flags);-
805 setResizerActive(q->isFloating());-
806 q->show();-
807 } else {
never executed: end of block
0
808 setResizerActive(false);-
809 }
never executed: end of block
0
810 if (q->isFloating()) // Might not be floating when dragging a QDockWidgetGroupWindow
q->isFloating()Description
TRUEnever evaluated
FALSEnever evaluated
0
811 undockedGeometry = q->geometry();
never executed: undockedGeometry = q->geometry();
0
812 q->activateWindow();-
813 } else {
never executed: end of block
0
814 // The tab was not plugged back in the QMainWindow but the QDockWidget cannot-
815 // stay floating, revert to the previous state.-
816 mwLayout->revert(state->widgetItem);-
817 }
never executed: end of block
0
818 }-
819 }
never executed: end of block
0
820 delete state;-
821 state = 0;-
822}
never executed: end of block
0
823-
824void QDockWidgetPrivate::setResizerActive(bool active)-
825{-
826 Q_Q(QDockWidget);-
827 if (active && !resizer) {
activeDescription
TRUEnever evaluated
FALSEnever evaluated
!resizerDescription
TRUEnever evaluated
FALSEnever evaluated
0
828 resizer = new QWidgetResizeHandler(q);-
829 resizer->setMovingEnabled(false);-
830 }
never executed: end of block
0
831 if (resizer)
resizerDescription
TRUEnever evaluated
FALSEnever evaluated
0
832 resizer->setActive(QWidgetResizeHandler::Resize, active);
never executed: resizer->setActive(QWidgetResizeHandler::Resize, active);
0
833}
never executed: end of block
0
834-
835bool QDockWidgetPrivate::isAnimating() const-
836{-
837 Q_Q(const QDockWidget);-
838-
839 QMainWindowLayout *mainWinLayout = qt_mainwindow_layout_from_dock(q);-
840 if (mainWinLayout == 0)
mainWinLayout == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
841 return false;
never executed: return false;
0
842-
843 return (const void*)mainWinLayout->pluggingWidget == (const void*)q;
never executed: return (const void*)mainWinLayout->pluggingWidget == (const void*)q;
0
844}-
845-
846bool QDockWidgetPrivate::mousePressEvent(QMouseEvent *event)-
847{-
848#if !defined(QT_NO_MAINWINDOW)-
849 Q_Q(QDockWidget);-
850-
851 QDockWidgetLayout *dwLayout-
852 = qobject_cast<QDockWidgetLayout*>(layout);-
853-
854 if (!dwLayout->nativeWindowDeco()) {
!dwLayout->nativeWindowDeco()Description
TRUEnever evaluated
FALSEnever evaluated
0
855 QRect titleArea = dwLayout->titleArea();-
856-
857 QDockWidgetGroupWindow *floatingTab = qobject_cast<QDockWidgetGroupWindow*>(parent);-
858-
859 if (event->button() != Qt::LeftButton ||
event->button(...Qt::LeftButtonDescription
TRUEnever evaluated
FALSEnever evaluated
0
860 !titleArea.contains(event->pos()) ||
!titleArea.con...(event->pos())Description
TRUEnever evaluated
FALSEnever evaluated
0
861 // check if the tool window is movable... do nothing if it-
862 // is not (but allow moving if the window is floating)-
863 (!hasFeature(this, QDockWidget::DockWidgetMovable) && !q->isFloating()) ||
!hasFeature(th...WidgetMovable)Description
TRUEnever evaluated
FALSEnever evaluated
!q->isFloating()Description
TRUEnever evaluated
FALSEnever evaluated
0
864 (qobject_cast<QMainWindow*>(parent) == 0 && !floatingTab) ||
qobject_cast<Q...>(parent) == 0Description
TRUEnever evaluated
FALSEnever evaluated
!floatingTabDescription
TRUEnever evaluated
FALSEnever evaluated
0
865 isAnimating() || state != 0) {
isAnimating()Description
TRUEnever evaluated
FALSEnever evaluated
state != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
866 return false;
never executed: return false;
0
867 }-
868-
869 initDrag(event->pos(), false);-
870-
871 if (state)
stateDescription
TRUEnever evaluated
FALSEnever evaluated
0
872 state->ctrlDrag = hasFeature(this, QDockWidget::DockWidgetFloatable) && event->modifiers() & Qt::ControlModifier;
never executed: state->ctrlDrag = hasFeature(this, QDockWidget::DockWidgetFloatable) && event->modifiers() & Qt::ControlModifier;
hasFeature(thi...dgetFloatable)Description
TRUEnever evaluated
FALSEnever evaluated
event->modifie...ontrolModifierDescription
TRUEnever evaluated
FALSEnever evaluated
0
873-
874 return true;
never executed: return true;
0
875 }-
876-
877#endif // !defined(QT_NO_MAINWINDOW)-
878 return false;
never executed: return false;
0
879}-
880-
881bool QDockWidgetPrivate::mouseDoubleClickEvent(QMouseEvent *event)-
882{-
883 QDockWidgetLayout *dwLayout = qobject_cast<QDockWidgetLayout*>(layout);-
884-
885 if (!dwLayout->nativeWindowDeco()) {
!dwLayout->nativeWindowDeco()Description
TRUEnever evaluated
FALSEnever evaluated
0
886 QRect titleArea = dwLayout->titleArea();-
887-
888 if (event->button() == Qt::LeftButton && titleArea.contains(event->pos()) &&
event->button(...Qt::LeftButtonDescription
TRUEnever evaluated
FALSEnever evaluated
titleArea.cont...(event->pos())Description
TRUEnever evaluated
FALSEnever evaluated
0
889 hasFeature(this, QDockWidget::DockWidgetFloatable)) {
hasFeature(thi...dgetFloatable)Description
TRUEnever evaluated
FALSEnever evaluated
0
890 _q_toggleTopLevel();-
891 return true;
never executed: return true;
0
892 }-
893 }
never executed: end of block
0
894 return false;
never executed: return false;
0
895}-
896-
897bool QDockWidgetPrivate::mouseMoveEvent(QMouseEvent *event)-
898{-
899 bool ret = false;-
900#if !defined(QT_NO_MAINWINDOW)-
901 Q_Q(QDockWidget);-
902-
903 if (!state)
!stateDescription
TRUEnever evaluated
FALSEnever evaluated
0
904 return ret;
never executed: return ret;
0
905-
906 QDockWidgetLayout *dwlayout-
907 = qobject_cast<QDockWidgetLayout *>(layout);-
908 QMainWindowLayout *mwlayout = qt_mainwindow_layout_from_dock(q);-
909 if (!dwlayout->nativeWindowDeco()) {
!dwlayout->nativeWindowDeco()Description
TRUEnever evaluated
FALSEnever evaluated
0
910 if (!state->dragging
!state->draggingDescription
TRUEnever evaluated
FALSEnever evaluated
0
911 && mwlayout->pluggingWidget == 0
mwlayout->pluggingWidget == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
912 && (event->pos() - state->pressPos).manhattanLength()
(event->pos() ...DragDistance()Description
TRUEnever evaluated
FALSEnever evaluated
0
913 > QApplication::startDragDistance()) {
(event->pos() ...DragDistance()Description
TRUEnever evaluated
FALSEnever evaluated
0
914 startDrag();-
915#ifdef Q_DEAD_CODE_FROM_QT4_WIN-
916 grabMouseWhileInWindow();-
917#else-
918 q->grabMouse();-
919#endif-
920 ret = true;-
921 }
never executed: end of block
0
922 }
never executed: end of block
0
923-
924 if (state->dragging && !state->nca) {
state->draggingDescription
TRUEnever evaluated
FALSEnever evaluated
!state->ncaDescription
TRUEnever evaluated
FALSEnever evaluated
0
925 QPoint pos = event->globalPos() - state->pressPos;-
926-
927 QDockWidgetGroupWindow *floatingTab = qobject_cast<QDockWidgetGroupWindow*>(parent);-
928 if (floatingTab && !q->isFloating())
floatingTabDescription
TRUEnever evaluated
FALSEnever evaluated
!q->isFloating()Description
TRUEnever evaluated
FALSEnever evaluated
0
929 floatingTab->move(pos);
never executed: floatingTab->move(pos);
0
930 else-
931 q->move(pos);
never executed: q->move(pos);
0
932-
933 if (state && !state->ctrlDrag)
stateDescription
TRUEnever evaluated
FALSEnever evaluated
!state->ctrlDragDescription
TRUEnever evaluated
FALSEnever evaluated
0
934 mwlayout->hover(state->widgetItem, event->globalPos());
never executed: mwlayout->hover(state->widgetItem, event->globalPos());
0
935-
936 ret = true;-
937 }
never executed: end of block
0
938-
939#endif // !defined(QT_NO_MAINWINDOW)-
940 return ret;
never executed: return ret;
0
941}-
942-
943bool QDockWidgetPrivate::mouseReleaseEvent(QMouseEvent *event)-
944{-
945#if !defined(QT_NO_MAINWINDOW)-
946-
947 if (event->button() == Qt::LeftButton && state && !state->nca) {
event->button(...Qt::LeftButtonDescription
TRUEnever evaluated
FALSEnever evaluated
stateDescription
TRUEnever evaluated
FALSEnever evaluated
!state->ncaDescription
TRUEnever evaluated
FALSEnever evaluated
0
948 endDrag();-
949 return true; //filter out the event
never executed: return true;
0
950 }-
951-
952#endif // !defined(QT_NO_MAINWINDOW)-
953 return false;
never executed: return false;
0
954}-
955-
956void QDockWidgetPrivate::nonClientAreaMouseEvent(QMouseEvent *event)-
957{-
958 Q_Q(QDockWidget);-
959-
960 int fw = q->style()->pixelMetric(QStyle::PM_DockWidgetFrameWidth, 0, q);-
961-
962 QWidget *tl = q->topLevelWidget();-
963 QRect geo = tl->geometry();-
964 QRect titleRect = tl->frameGeometry();-
965#ifdef Q_DEAD_CODE_FROM_QT4_MAC-
966 if ((features & QDockWidget::DockWidgetVerticalTitleBar)) {-
967 titleRect.setTop(geo.top());-
968 titleRect.setBottom(geo.bottom());-
969 titleRect.setRight(geo.left() - 1);-
970 } else-
971#endif-
972 {-
973 titleRect.setLeft(geo.left());-
974 titleRect.setRight(geo.right());-
975 titleRect.setBottom(geo.top() - 1);-
976 titleRect.adjust(0, fw, 0, 0);-
977 }-
978-
979 switch (event->type()) {-
980 case QEvent::NonClientAreaMouseButtonPress:
never executed: case QEvent::NonClientAreaMouseButtonPress:
0
981 if (!titleRect.contains(event->globalPos()))
!titleRect.con...->globalPos())Description
TRUEnever evaluated
FALSEnever evaluated
0
982 break;
never executed: break;
0
983 if (state != 0)
state != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
984 break;
never executed: break;
0
985 if (qobject_cast<QMainWindow*>(parent) == 0 && qobject_cast<QDockWidgetGroupWindow*>(parent) == 0)
qobject_cast<Q...>(parent) == 0Description
TRUEnever evaluated
FALSEnever evaluated
qobject_cast<Q...>(parent) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
986 break;
never executed: break;
0
987 if (isAnimating())
isAnimating()Description
TRUEnever evaluated
FALSEnever evaluated
0
988 break;
never executed: break;
0
989 initDrag(event->pos(), true);-
990 if (state == 0)
state == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
991 break;
never executed: break;
0
992 state->ctrlDrag = event->modifiers() & Qt::ControlModifier;-
993 startDrag();-
994 break;
never executed: break;
0
995 case QEvent::NonClientAreaMouseMove:
never executed: case QEvent::NonClientAreaMouseMove:
0
996 if (state == 0 || !state->dragging)
state == 0Description
TRUEnever evaluated
FALSEnever evaluated
!state->draggingDescription
TRUEnever evaluated
FALSEnever evaluated
0
997 break;
never executed: break;
0
998-
999#ifndef Q_OS_MAC-
1000 if (state->nca) {
state->ncaDescription
TRUEnever evaluated
FALSEnever evaluated
0
1001 endDrag();-
1002 }
never executed: end of block
0
1003#endif-
1004 break;
never executed: break;
0
1005 case QEvent::NonClientAreaMouseButtonRelease:
never executed: case QEvent::NonClientAreaMouseButtonRelease:
0
1006#ifdef Q_OS_MAC-
1007 if (state)-
1008 endDrag();-
1009#endif-
1010 break;
never executed: break;
0
1011 case QEvent::NonClientAreaMouseButtonDblClick:
never executed: case QEvent::NonClientAreaMouseButtonDblClick:
0
1012 _q_toggleTopLevel();-
1013 break;
never executed: break;
0
1014 default:
never executed: default:
0
1015 break;
never executed: break;
0
1016 }-
1017}-
1018-
1019/*! \internal-
1020 Called when the QDockWidget or the QDockWidgetGroupWindow is moved-
1021 */-
1022void QDockWidgetPrivate::moveEvent(QMoveEvent *event)-
1023{-
1024 Q_Q(QDockWidget);-
1025-
1026 if (state == 0 || !state->dragging || !state->nca)
state == 0Description
TRUEnever evaluated
FALSEnever evaluated
!state->draggingDescription
TRUEnever evaluated
FALSEnever evaluated
!state->ncaDescription
TRUEnever evaluated
FALSEnever evaluated
0
1027 return;
never executed: return;
0
1028-
1029 if (!q->isWindow() && qobject_cast<QDockWidgetGroupWindow*>(parent) == 0)
!q->isWindow()Description
TRUEnever evaluated
FALSEnever evaluated
qobject_cast<Q...>(parent) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1030 return;
never executed: return;
0
1031-
1032 // When the native window frame is being dragged, all we get is these mouse-
1033 // move events.-
1034-
1035 if (state->ctrlDrag)
state->ctrlDragDescription
TRUEnever evaluated
FALSEnever evaluated
0
1036 return;
never executed: return;
0
1037-
1038 QMainWindowLayout *layout = qt_mainwindow_layout_from_dock(q);-
1039 Q_ASSERT(layout != 0);-
1040-
1041 QPoint globalMousePos = event->pos() + state->pressPos;-
1042 layout->hover(state->widgetItem, globalMousePos);-
1043}
never executed: end of block
0
1044-
1045void QDockWidgetPrivate::unplug(const QRect &rect)-
1046{-
1047 Q_Q(QDockWidget);-
1048 QRect r = rect;-
1049 r.moveTopLeft(q->mapToGlobal(QPoint(0, 0)));-
1050 QDockWidgetLayout *dwLayout = qobject_cast<QDockWidgetLayout*>(layout);-
1051 if (dwLayout->nativeWindowDeco(true))
dwLayout->nati...ndowDeco(true)Description
TRUEnever evaluated
FALSEnever evaluated
0
1052 r.adjust(0, dwLayout->titleHeight(), 0, 0);
never executed: r.adjust(0, dwLayout->titleHeight(), 0, 0);
0
1053 setWindowState(true, true, r);-
1054}
never executed: end of block
0
1055-
1056void QDockWidgetPrivate::plug(const QRect &rect)-
1057{-
1058 setWindowState(false, false, rect);-
1059}
never executed: end of block
0
1060-
1061void QDockWidgetPrivate::setWindowState(bool floating, bool unplug, const QRect &rect)-
1062{-
1063 Q_Q(QDockWidget);-
1064-
1065 if (!floating && parent) {
!floatingDescription
TRUEnever evaluated
FALSEnever evaluated
parentDescription
TRUEnever evaluated
FALSEnever evaluated
0
1066 QMainWindowLayout *mwlayout = qt_mainwindow_layout_from_dock(q);-
1067 if (mwlayout && mwlayout->dockWidgetArea(q) == Qt::NoDockWidgetArea
mwlayoutDescription
TRUEnever evaluated
FALSEnever evaluated
mwlayout->dock...DockWidgetAreaDescription
TRUEnever evaluated
FALSEnever evaluated
0
1068 && !qobject_cast<QDockWidgetGroupWindow *>(parent))
!qobject_cast<...dow *>(parent)Description
TRUEnever evaluated
FALSEnever evaluated
0
1069 return; // this dockwidget can't be redocked
never executed: return;
0
1070 }
never executed: end of block
0
1071-
1072 bool wasFloating = q->isFloating();-
1073 if (wasFloating) // Prevent repetitive unplugging from nested invocations (QTBUG-42818)
wasFloatingDescription
TRUEnever evaluated
FALSEnever evaluated
0
1074 unplug = false;
never executed: unplug = false;
0
1075 bool hidden = q->isHidden();-
1076-
1077 if (q->isVisible())
q->isVisible()Description
TRUEnever evaluated
FALSEnever evaluated
0
1078 q->hide();
never executed: q->hide();
0
1079-
1080 Qt::WindowFlags flags = floating ? Qt::Tool : Qt::Widget;
floatingDescription
TRUEnever evaluated
FALSEnever evaluated
0
1081-
1082 QDockWidgetLayout *dwLayout = qobject_cast<QDockWidgetLayout*>(layout);-
1083 const bool nativeDeco = dwLayout->nativeWindowDeco(floating);-
1084-
1085 if (nativeDeco) {
nativeDecoDescription
TRUEnever evaluated
FALSEnever evaluated
0
1086 flags |= Qt::CustomizeWindowHint | Qt::WindowTitleHint;-
1087 if (hasFeature(this, QDockWidget::DockWidgetClosable))
hasFeature(thi...idgetClosable)Description
TRUEnever evaluated
FALSEnever evaluated
0
1088 flags |= Qt::WindowCloseButtonHint;
never executed: flags |= Qt::WindowCloseButtonHint;
0
1089 } else {
never executed: end of block
0
1090 flags |= Qt::FramelessWindowHint;-
1091 }
never executed: end of block
0
1092-
1093 if (unplug)
unplugDescription
TRUEnever evaluated
FALSEnever evaluated
0
1094 flags |= Qt::X11BypassWindowManagerHint;
never executed: flags |= Qt::X11BypassWindowManagerHint;
0
1095-
1096 q->setWindowFlags(flags);-
1097-
1098-
1099 if (!rect.isNull())
!rect.isNull()Description
TRUEnever evaluated
FALSEnever evaluated
0
1100 q->setGeometry(rect);
never executed: q->setGeometry(rect);
0
1101-
1102 updateButtons();-
1103-
1104 if (!hidden)
!hiddenDescription
TRUEnever evaluated
FALSEnever evaluated
0
1105 q->show();
never executed: q->show();
0
1106-
1107 if (floating != wasFloating) {
floating != wasFloatingDescription
TRUEnever evaluated
FALSEnever evaluated
0
1108 emit q->topLevelChanged(floating);-
1109 if (!floating && parent) {
!floatingDescription
TRUEnever evaluated
FALSEnever evaluated
parentDescription
TRUEnever evaluated
FALSEnever evaluated
0
1110 QMainWindowLayout *mwlayout = qt_mainwindow_layout_from_dock(q);-
1111 if (mwlayout)
mwlayoutDescription
TRUEnever evaluated
FALSEnever evaluated
0
1112 emit q->dockLocationChanged(mwlayout->dockWidgetArea(q));
never executed: q->dockLocationChanged(mwlayout->dockWidgetArea(q));
0
1113 }
never executed: end of block
0
1114 }
never executed: end of block
0
1115-
1116 setResizerActive(!unplug && floating && !nativeDeco);-
1117}
never executed: end of block
0
1118-
1119/*!-
1120 \class QDockWidget-
1121-
1122 \brief The QDockWidget class provides a widget that can be docked-
1123 inside a QMainWindow or floated as a top-level window on the-
1124 desktop.-
1125-
1126 \ingroup mainwindow-classes-
1127 \inmodule QtWidgets-
1128-
1129 QDockWidget provides the concept of dock widgets, also know as-
1130 tool palettes or utility windows. Dock windows are secondary-
1131 windows placed in the \e {dock widget area} around the-
1132 \l{QMainWindow::centralWidget()}{central widget} in a-
1133 QMainWindow.-
1134-
1135 \image mainwindow-docks.png-
1136-
1137 Dock windows can be moved inside their current area, moved into-
1138 new areas and floated (e.g., undocked) by the end-user. The-
1139 QDockWidget API allows the programmer to restrict the dock widgets-
1140 ability to move, float and close, as well as the areas in which-
1141 they can be placed.-
1142-
1143 \section1 Appearance-
1144-
1145 A QDockWidget consists of a title bar and the content area. The-
1146 title bar displays the dock widgets-
1147 \l{QWidget::windowTitle()}{window title},-
1148 a \e float button and a \e close button.-
1149 Depending on the state of the QDockWidget, the \e float and \e-
1150 close buttons may be either disabled or not shown at all.-
1151-
1152 The visual appearance of the title bar and buttons is dependent-
1153 on the \l{QStyle}{style} in use.-
1154-
1155 A QDockWidget acts as a wrapper for its child widget, set with setWidget().-
1156 Custom size hints, minimum and maximum sizes and size policies should be-
1157 implemented in the child widget. QDockWidget will respect them, adjusting-
1158 its own constraints to include the frame and title. Size constraints-
1159 should not be set on the QDockWidget itself, because they change depending-
1160 on whether it is docked; a docked QDockWidget has no frame and a smaller title-
1161 bar.-
1162-
1163 \sa QMainWindow, {Dock Widgets Example}-
1164*/-
1165-
1166/*!-
1167 \enum QDockWidget::DockWidgetFeature-
1168-
1169 \value DockWidgetClosable The dock widget can be closed. On some systems the dock-
1170 widget always has a close button when it's floating-
1171 (for example on MacOS 10.5).-
1172 \value DockWidgetMovable The dock widget can be moved between docks-
1173 by the user.-
1174 \value DockWidgetFloatable The dock widget can be detached from the-
1175 main window, and floated as an independent-
1176 window.-
1177 \value DockWidgetVerticalTitleBar The dock widget displays a vertical title-
1178 bar on its left side. This can be used to-
1179 increase the amount of vertical space in-
1180 a QMainWindow.-
1181 \value AllDockWidgetFeatures (Deprecated) The dock widget can be closed, moved,-
1182 and floated. Since new features might be added in future-
1183 releases, the look and behavior of dock widgets might-
1184 change if you use this flag. Please specify individual-
1185 flags instead.-
1186 \value NoDockWidgetFeatures The dock widget cannot be closed, moved,-
1187 or floated.-
1188-
1189 \omitvalue DockWidgetFeatureMask-
1190 \omitvalue Reserved-
1191*/-
1192-
1193/*!-
1194 \property QDockWidget::windowTitle-
1195 \brief the dock widget title (caption)-
1196-
1197 By default, this property contains an empty string.-
1198*/-
1199-
1200/*!-
1201 Constructs a QDockWidget with parent \a parent and window flags \a-
1202 flags. The dock widget will be placed in the left dock widget-
1203 area.-
1204*/-
1205QDockWidget::QDockWidget(QWidget *parent, Qt::WindowFlags flags)-
1206 : QWidget(*new QDockWidgetPrivate, parent, flags)-
1207{-
1208 Q_D(QDockWidget);-
1209 d->init();-
1210}
never executed: end of block
0
1211-
1212/*!-
1213 Constructs a QDockWidget with parent \a parent and window flags \a-
1214 flags. The dock widget will be placed in the left dock widget-
1215 area.-
1216-
1217 The window title is set to \a title. This title is used when the-
1218 QDockWidget is docked and undocked. It is also used in the context-
1219 menu provided by QMainWindow.-
1220-
1221 \sa setWindowTitle()-
1222*/-
1223QDockWidget::QDockWidget(const QString &title, QWidget *parent, Qt::WindowFlags flags)-
1224 : QWidget(*new QDockWidgetPrivate, parent, flags)-
1225{-
1226 Q_D(QDockWidget);-
1227 d->init();-
1228 setWindowTitle(title);-
1229}
never executed: end of block
0
1230-
1231/*!-
1232 Destroys the dock widget.-
1233*/-
1234QDockWidget::~QDockWidget()-
1235{ }-
1236-
1237/*!-
1238 Returns the widget for the dock widget. This function returns zero-
1239 if the widget has not been set.-
1240-
1241 \sa setWidget()-
1242*/-
1243QWidget *QDockWidget::widget() const-
1244{-
1245 QDockWidgetLayout *layout = qobject_cast<QDockWidgetLayout*>(this->layout());-
1246 return layout->widgetForRole(QDockWidgetLayout::Content);
never executed: return layout->widgetForRole(QDockWidgetLayout::Content);
0
1247}-
1248-
1249/*!-
1250 Sets the widget for the dock widget to \a widget.-
1251-
1252 If the dock widget is visible when \a widget is added, you must-
1253 \l{QWidget::}{show()} it explicitly.-
1254-
1255 Note that you must add the layout of the \a widget before you call-
1256 this function; if not, the \a widget will not be visible.-
1257-
1258 \sa widget()-
1259*/-
1260void QDockWidget::setWidget(QWidget *widget)-
1261{-
1262 QDockWidgetLayout *layout = qobject_cast<QDockWidgetLayout*>(this->layout());-
1263 layout->setWidgetForRole(QDockWidgetLayout::Content, widget);-
1264}
never executed: end of block
0
1265-
1266/*!-
1267 \property QDockWidget::features-
1268 \brief whether the dock widget is movable, closable, and floatable-
1269-
1270 By default, this property is set to a combination of DockWidgetClosable,-
1271 DockWidgetMovable and DockWidgetFloatable.-
1272-
1273 \sa DockWidgetFeature-
1274*/-
1275-
1276void QDockWidget::setFeatures(QDockWidget::DockWidgetFeatures features)-
1277{-
1278 Q_D(QDockWidget);-
1279 features &= DockWidgetFeatureMask;-
1280 if (d->features == features)
d->features == featuresDescription
TRUEnever evaluated
FALSEnever evaluated
0
1281 return;
never executed: return;
0
1282 const bool closableChanged = (d->features ^ features) & DockWidgetClosable;-
1283 d->features = features;-
1284 QDockWidgetLayout *layout-
1285 = qobject_cast<QDockWidgetLayout*>(this->layout());-
1286 layout->setVerticalTitleBar(features & DockWidgetVerticalTitleBar);-
1287 d->updateButtons();-
1288 d->toggleViewAction->setEnabled((d->features & DockWidgetClosable) == DockWidgetClosable);-
1289 emit featuresChanged(d->features);-
1290 update();-
1291 if (closableChanged && layout->nativeWindowDeco()) {
closableChangedDescription
TRUEnever evaluated
FALSEnever evaluated
layout->nativeWindowDeco()Description
TRUEnever evaluated
FALSEnever evaluated
0
1292 QDockWidgetGroupWindow *floatingTab = qobject_cast<QDockWidgetGroupWindow *>(parent());-
1293 if (floatingTab && !isFloating())
floatingTabDescription
TRUEnever evaluated
FALSEnever evaluated
!isFloating()Description
TRUEnever evaluated
FALSEnever evaluated
0
1294 floatingTab->adjustFlags();
never executed: floatingTab->adjustFlags();
0
1295 else-
1296 d->setWindowState(true /*floating*/, true /*unplug*/); //this ensures the native decoration is drawn
never executed: d->setWindowState(true , true );
0
1297 }-
1298}
never executed: end of block
0
1299-
1300QDockWidget::DockWidgetFeatures QDockWidget::features() const-
1301{-
1302 Q_D(const QDockWidget);-
1303 return d->features;
never executed: return d->features;
0
1304}-
1305-
1306/*!-
1307 \property QDockWidget::floating-
1308 \brief whether the dock widget is floating-
1309-
1310 A floating dock widget is presented to the user as an independent-
1311 window "on top" of its parent QMainWindow, instead of being-
1312 docked in the QMainWindow.-
1313-
1314 By default, this property is \c true.-
1315-
1316 When this property changes, the \c {topLevelChanged()} signal is emitted.-
1317-
1318 \sa isWindow(), topLevelChanged()-
1319*/-
1320void QDockWidget::setFloating(bool floating)-
1321{-
1322 Q_D(QDockWidget);-
1323-
1324 // the initial click of a double-click may have started a drag...-
1325 if (d->state != 0)
d->state != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1326 d->endDrag(true);
never executed: d->endDrag(true);
0
1327-
1328 QRect r = d->undockedGeometry;-
1329 // Keep position when undocking for the first time.-
1330 if (floating && isVisible() && !r.isValid())
floatingDescription
TRUEnever evaluated
FALSEnever evaluated
isVisible()Description
TRUEnever evaluated
FALSEnever evaluated
!r.isValid()Description
TRUEnever evaluated
FALSEnever evaluated
0
1331 r = QRect(mapToGlobal(QPoint(0, 0)), size());
never executed: r = QRect(mapToGlobal(QPoint(0, 0)), size());
0
1332-
1333 d->setWindowState(floating, false, floating ? r : QRect());-
1334-
1335 if (floating && r.isNull()) {
floatingDescription
TRUEnever evaluated
FALSEnever evaluated
r.isNull()Description
TRUEnever evaluated
FALSEnever evaluated
0
1336 if (x() < 0 || y() < 0) //may happen if we have been hidden
x() < 0Description
TRUEnever evaluated
FALSEnever evaluated
y() < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1337 move(QPoint());
never executed: move(QPoint());
0
1338 setAttribute(Qt::WA_Moved, false); //we want it at the default position-
1339 }
never executed: end of block
0
1340}
never executed: end of block
0
1341-
1342/*!-
1343 \property QDockWidget::allowedAreas-
1344 \brief areas where the dock widget may be placed-
1345-
1346 The default is Qt::AllDockWidgetAreas.-
1347-
1348 \sa Qt::DockWidgetArea-
1349*/-
1350-
1351void QDockWidget::setAllowedAreas(Qt::DockWidgetAreas areas)-
1352{-
1353 Q_D(QDockWidget);-
1354 areas &= Qt::DockWidgetArea_Mask;-
1355 if (areas == d->allowedAreas)
areas == d->allowedAreasDescription
TRUEnever evaluated
FALSEnever evaluated
0
1356 return;
never executed: return;
0
1357 d->allowedAreas = areas;-
1358 emit allowedAreasChanged(d->allowedAreas);-
1359}
never executed: end of block
0
1360-
1361Qt::DockWidgetAreas QDockWidget::allowedAreas() const-
1362{-
1363 Q_D(const QDockWidget);-
1364 return d->allowedAreas;
never executed: return d->allowedAreas;
0
1365}-
1366-
1367/*!-
1368 \fn bool QDockWidget::isAreaAllowed(Qt::DockWidgetArea area) const-
1369-
1370 Returns \c true if this dock widget can be placed in the given \a area;-
1371 otherwise returns \c false.-
1372*/-
1373-
1374/*! \reimp */-
1375void QDockWidget::changeEvent(QEvent *event)-
1376{-
1377 Q_D(QDockWidget);-
1378 QDockWidgetLayout *layout = qobject_cast<QDockWidgetLayout*>(this->layout());-
1379-
1380 switch (event->type()) {-
1381 case QEvent::ModifiedChange:
never executed: case QEvent::ModifiedChange:
0
1382 case QEvent::WindowTitleChange:
never executed: case QEvent::WindowTitleChange:
0
1383 update(layout->titleArea());-
1384#ifndef QT_NO_ACTION-
1385 d->fixedWindowTitle = qt_setWindowTitle_helperHelper(windowTitle(), this);-
1386 d->toggleViewAction->setText(d->fixedWindowTitle);-
1387#endif-
1388#ifndef QT_NO_TABBAR-
1389 {-
1390 if (QMainWindowLayout *winLayout = qt_mainwindow_layout_from_dock(this)) {
QMainWindowLay...rom_dock(this)Description
TRUEnever evaluated
FALSEnever evaluated
0
1391 if (QDockAreaLayoutInfo *info = winLayout->layoutState.dockAreaLayout.info(this))
QDockAreaLayou...out.info(this)Description
TRUEnever evaluated
FALSEnever evaluated
0
1392 info->updateTabBar();
never executed: info->updateTabBar();
0
1393 }
never executed: end of block
0
1394 }-
1395#endif // QT_NO_TABBAR-
1396 break;
never executed: break;
0
1397 default:
never executed: default:
0
1398 break;
never executed: break;
0
1399 }-
1400 QWidget::changeEvent(event);-
1401}
never executed: end of block
0
1402-
1403/*! \reimp */-
1404void QDockWidget::closeEvent(QCloseEvent *event)-
1405{-
1406 Q_D(QDockWidget);-
1407 if (d->state)
d->stateDescription
TRUEnever evaluated
FALSEnever evaluated
0
1408 d->endDrag(true);
never executed: d->endDrag(true);
0
1409 QWidget::closeEvent(event);-
1410}
never executed: end of block
0
1411-
1412/*! \reimp */-
1413void QDockWidget::paintEvent(QPaintEvent *event)-
1414{-
1415 Q_UNUSED(event)-
1416-
1417 QDockWidgetLayout *layout-
1418 = qobject_cast<QDockWidgetLayout*>(this->layout());-
1419 bool customTitleBar = layout->widgetForRole(QDockWidgetLayout::TitleBar) != 0;-
1420 bool nativeDeco = layout->nativeWindowDeco();-
1421-
1422 if (!nativeDeco && !customTitleBar) {
!nativeDecoDescription
TRUEnever evaluated
FALSEnever evaluated
!customTitleBarDescription
TRUEnever evaluated
FALSEnever evaluated
0
1423 QStylePainter p(this);-
1424 // ### Add PixelMetric to change spacers, so style may show border-
1425 // when not floating.-
1426 if (isFloating()) {
isFloating()Description
TRUEnever evaluated
FALSEnever evaluated
0
1427 QStyleOptionFrame framOpt;-
1428 framOpt.init(this);-
1429 p.drawPrimitive(QStyle::PE_FrameDockWidget, framOpt);-
1430 }
never executed: end of block
0
1431-
1432 // Title must be painted after the frame, since the areas overlap, and-
1433 // the title may wish to extend out to all sides (eg. XP style)-
1434 QStyleOptionDockWidget titleOpt;-
1435 initStyleOption(&titleOpt);-
1436 p.drawControl(QStyle::CE_DockWidgetTitle, titleOpt);-
1437 }
never executed: end of block
0
1438}
never executed: end of block
0
1439-
1440/*! \reimp */-
1441bool QDockWidget::event(QEvent *event)-
1442{-
1443 Q_D(QDockWidget);-
1444-
1445 QMainWindow *win = qobject_cast<QMainWindow*>(parentWidget());-
1446 QMainWindowLayout *layout = qt_mainwindow_layout_from_dock(this);-
1447-
1448 switch (event->type()) {-
1449#ifndef QT_NO_ACTION-
1450 case QEvent::Hide:
never executed: case QEvent::Hide:
0
1451 if (layout != 0)
layout != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1452 layout->keepSize(this);
never executed: layout->keepSize(this);
0
1453 d->toggleViewAction->setChecked(false);-
1454 emit visibilityChanged(false);-
1455 break;
never executed: break;
0
1456 case QEvent::Show: {
never executed: case QEvent::Show:
0
1457 d->toggleViewAction->setChecked(true);-
1458 QPoint parentTopLeft(0, 0);-
1459 if (isWindow()) {
isWindow()Description
TRUEnever evaluated
FALSEnever evaluated
0
1460 if (const QWindow *window = windowHandle())
const QWindow ...windowHandle()Description
TRUEnever evaluated
FALSEnever evaluated
0
1461 parentTopLeft = window->screen()->availableVirtualGeometry().topLeft();
never executed: parentTopLeft = window->screen()->availableVirtualGeometry().topLeft();
0
1462 else-
1463 parentTopLeft = QGuiApplication::primaryScreen()->availableVirtualGeometry().topLeft();
never executed: parentTopLeft = QGuiApplication::primaryScreen()->availableVirtualGeometry().topLeft();
0
1464 }-
1465 emit visibilityChanged(geometry().right() >= parentTopLeft.x() && geometry().bottom() >= parentTopLeft.y());-
1466}-
1467 break;
never executed: break;
0
1468#endif-
1469 case QEvent::ApplicationLayoutDirectionChange:
never executed: case QEvent::ApplicationLayoutDirectionChange:
0
1470 case QEvent::LayoutDirectionChange:
never executed: case QEvent::LayoutDirectionChange:
0
1471 case QEvent::StyleChange:
never executed: case QEvent::StyleChange:
0
1472 case QEvent::ParentChange:
never executed: case QEvent::ParentChange:
0
1473 d->updateButtons();-
1474 break;
never executed: break;
0
1475 case QEvent::ZOrderChange: {
never executed: case QEvent::ZOrderChange:
0
1476 bool onTop = false;-
1477 if (win != 0) {
win != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1478 const QObjectList &siblings = win->children();-
1479 onTop = siblings.count() > 0 && siblings.last() == (QObject*)this;
siblings.count() > 0Description
TRUEnever evaluated
FALSEnever evaluated
siblings.last(...(QObject*)thisDescription
TRUEnever evaluated
FALSEnever evaluated
0
1480 }
never executed: end of block
0
1481 if (!isFloating() && layout != 0 && onTop)
!isFloating()Description
TRUEnever evaluated
FALSEnever evaluated
layout != 0Description
TRUEnever evaluated
FALSEnever evaluated
onTopDescription
TRUEnever evaluated
FALSEnever evaluated
0
1482 layout->raise(this);
never executed: layout->raise(this);
0
1483 break;
never executed: break;
0
1484 }-
1485 case QEvent::WindowActivate:
never executed: case QEvent::WindowActivate:
0
1486 case QEvent::WindowDeactivate:
never executed: case QEvent::WindowDeactivate:
0
1487 update(qobject_cast<QDockWidgetLayout *>(this->layout())->titleArea());-
1488 break;
never executed: break;
0
1489 case QEvent::ContextMenu:
never executed: case QEvent::ContextMenu:
0
1490 if (d->state) {
d->stateDescription
TRUEnever evaluated
FALSEnever evaluated
0
1491 event->accept();-
1492 return true;
never executed: return true;
0
1493 }-
1494 break;
never executed: break;
0
1495 // return true after calling the handler since we don't want-
1496 // them to be passed onto the default handlers-
1497 case QEvent::MouseButtonPress:
never executed: case QEvent::MouseButtonPress:
0
1498 if (d->mousePressEvent(static_cast<QMouseEvent *>(event)))
d->mousePressE...ent *>(event))Description
TRUEnever evaluated
FALSEnever evaluated
0
1499 return true;
never executed: return true;
0
1500 break;
never executed: break;
0
1501 case QEvent::MouseButtonDblClick:
never executed: case QEvent::MouseButtonDblClick:
0
1502 if (d->mouseDoubleClickEvent(static_cast<QMouseEvent *>(event)))
d->mouseDouble...ent *>(event))Description
TRUEnever evaluated
FALSEnever evaluated
0
1503 return true;
never executed: return true;
0
1504 break;
never executed: break;
0
1505 case QEvent::MouseMove:
never executed: case QEvent::MouseMove:
0
1506 if (d->mouseMoveEvent(static_cast<QMouseEvent *>(event)))
d->mouseMoveEv...ent *>(event))Description
TRUEnever evaluated
FALSEnever evaluated
0
1507 return true;
never executed: return true;
0
1508 break;
never executed: break;
0
1509#ifdef Q_DEAD_CODE_FROM_QT4_WIN-
1510 case QEvent::Leave:-
1511 if (d->state != 0 && d->state->dragging && !d->state->nca) {-
1512 // This is a workaround for loosing the mouse on Vista.-
1513 QPoint pos = QCursor::pos();-
1514 QMouseEvent fake(QEvent::MouseMove, mapFromGlobal(pos), pos, Qt::NoButton,-
1515 QApplication::mouseButtons(), QApplication::keyboardModifiers());-
1516 d->mouseMoveEvent(&fake);-
1517 }-
1518 break;-
1519#endif-
1520 case QEvent::MouseButtonRelease:
never executed: case QEvent::MouseButtonRelease:
0
1521 if (d->mouseReleaseEvent(static_cast<QMouseEvent *>(event)))
d->mouseReleas...ent *>(event))Description
TRUEnever evaluated
FALSEnever evaluated
0
1522 return true;
never executed: return true;
0
1523 break;
never executed: break;
0
1524 case QEvent::NonClientAreaMouseMove:
never executed: case QEvent::NonClientAreaMouseMove:
0
1525 case QEvent::NonClientAreaMouseButtonPress:
never executed: case QEvent::NonClientAreaMouseButtonPress:
0
1526 case QEvent::NonClientAreaMouseButtonRelease:
never executed: case QEvent::NonClientAreaMouseButtonRelease:
0
1527 case QEvent::NonClientAreaMouseButtonDblClick:
never executed: case QEvent::NonClientAreaMouseButtonDblClick:
0
1528 d->nonClientAreaMouseEvent(static_cast<QMouseEvent*>(event));-
1529 return true;
never executed: return true;
0
1530 case QEvent::Move:
never executed: case QEvent::Move:
0
1531 d->moveEvent(static_cast<QMoveEvent*>(event));-
1532 break;
never executed: break;
0
1533 case QEvent::Resize:
never executed: case QEvent::Resize:
0
1534 // if the mainwindow is plugging us, we don't want to update undocked geometry-
1535 if (isFloating() && layout != 0 && layout->pluggingWidget != this)
isFloating()Description
TRUEnever evaluated
FALSEnever evaluated
layout != 0Description
TRUEnever evaluated
FALSEnever evaluated
layout->pluggingWidget != thisDescription
TRUEnever evaluated
FALSEnever evaluated
0
1536 d->undockedGeometry = geometry();
never executed: d->undockedGeometry = geometry();
0
1537 break;
never executed: break;
0
1538 default:
never executed: default:
0
1539 break;
never executed: break;
0
1540 }-
1541 return QWidget::event(event);
never executed: return QWidget::event(event);
0
1542}-
1543-
1544#ifndef QT_NO_ACTION-
1545/*!-
1546 Returns a checkable action that can be used to show or close this-
1547 dock widget.-
1548-
1549 The action's text is set to the dock widget's window title.-
1550-
1551 \sa QAction::text, QWidget::windowTitle-
1552 */-
1553QAction * QDockWidget::toggleViewAction() const-
1554{-
1555 Q_D(const QDockWidget);-
1556 return d->toggleViewAction;
never executed: return d->toggleViewAction;
0
1557}-
1558#endif // QT_NO_ACTION-
1559-
1560/*!-
1561 \fn void QDockWidget::featuresChanged(QDockWidget::DockWidgetFeatures features)-
1562-
1563 This signal is emitted when the \l features property changes. The-
1564 \a features parameter gives the new value of the property.-
1565*/-
1566-
1567/*!-
1568 \fn void QDockWidget::topLevelChanged(bool topLevel)-
1569-
1570 This signal is emitted when the \l floating property changes.-
1571 The \a topLevel parameter is true if the dock widget is now floating;-
1572 otherwise it is false.-
1573-
1574 \sa isWindow()-
1575*/-
1576-
1577/*!-
1578 \fn void QDockWidget::allowedAreasChanged(Qt::DockWidgetAreas allowedAreas)-
1579-
1580 This signal is emitted when the \l allowedAreas property changes. The-
1581 \a allowedAreas parameter gives the new value of the property.-
1582*/-
1583-
1584/*!-
1585 \fn void QDockWidget::visibilityChanged(bool visible)-
1586 \since 4.3-
1587-
1588 This signal is emitted when the dock widget becomes \a visible (or-
1589 invisible). This happens when the widget is hidden or shown, as-
1590 well as when it is docked in a tabbed dock area and its tab-
1591 becomes selected or unselected.-
1592*/-
1593-
1594/*!-
1595 \fn void QDockWidget::dockLocationChanged(Qt::DockWidgetArea area)-
1596 \since 4.3-
1597-
1598 This signal is emitted when the dock widget is moved to another-
1599 dock \a area, or is moved to a different location in its current-
1600 dock area. This happens when the dock widget is moved-
1601 programmatically or is dragged to a new location by the user.-
1602*/-
1603-
1604/*!-
1605 \since 4.3-
1606-
1607 Sets an arbitrary \a widget as the dock widget's title bar. If \a widget-
1608 is 0, any custom title bar widget previously set on the dock widget is-
1609 removed, but not deleted, and the default title bar will be used-
1610 instead.-
1611-
1612 If a title bar widget is set, QDockWidget will not use native window-
1613 decorations when it is floated.-
1614-
1615 Here are some tips for implementing custom title bars:-
1616-
1617 \list-
1618 \li Mouse events that are not explicitly handled by the title bar widget-
1619 must be ignored by calling QMouseEvent::ignore(). These events then-
1620 propagate to the QDockWidget parent, which handles them in the usual-
1621 manner, moving when the title bar is dragged, docking and undocking-
1622 when it is double-clicked, etc.-
1623-
1624 \li When DockWidgetVerticalTitleBar is set on QDockWidget, the title-
1625 bar widget is repositioned accordingly. In resizeEvent(), the title-
1626 bar should check what orientation it should assume:-
1627 \snippet code/src_gui_widgets_qdockwidget.cpp 0-
1628-
1629 \li The title bar widget must have a valid QWidget::sizeHint() and-
1630 QWidget::minimumSizeHint(). These functions should take into account-
1631 the current orientation of the title bar.-
1632-
1633 \li It is not possible to remove a title bar from a dock widget. However,-
1634 a similar effect can be achieved by setting a default constructed-
1635 QWidget as the title bar widget.-
1636 \endlist-
1637-
1638 Using qobject_cast() as shown above, the title bar widget has full access-
1639 to its parent QDockWidget. Hence it can perform such operations as docking-
1640 and hiding in response to user actions.-
1641-
1642 \sa titleBarWidget(), DockWidgetVerticalTitleBar-
1643*/-
1644-
1645void QDockWidget::setTitleBarWidget(QWidget *widget)-
1646{-
1647 Q_D(QDockWidget);-
1648 QDockWidgetLayout *layout-
1649 = qobject_cast<QDockWidgetLayout*>(this->layout());-
1650 layout->setWidgetForRole(QDockWidgetLayout::TitleBar, widget);-
1651 d->updateButtons();-
1652 if (isWindow()) {
isWindow()Description
TRUEnever evaluated
FALSEnever evaluated
0
1653 //this ensures the native decoration is drawn-
1654 d->setWindowState(true /*floating*/, true /*unplug*/);-
1655 }
never executed: end of block
0
1656}
never executed: end of block
0
1657-
1658/*!-
1659 \since 4.3-
1660 Returns the custom title bar widget set on the QDockWidget, or 0 if no-
1661 custom title bar has been set.-
1662-
1663 \sa setTitleBarWidget()-
1664*/-
1665-
1666QWidget *QDockWidget::titleBarWidget() const-
1667{-
1668 QDockWidgetLayout *layout-
1669 = qobject_cast<QDockWidgetLayout*>(this->layout());-
1670 return layout->widgetForRole(QDockWidgetLayout::TitleBar);
never executed: return layout->widgetForRole(QDockWidgetLayout::TitleBar);
0
1671}-
1672-
1673QT_END_NAMESPACE-
1674-
1675#include "qdockwidget.moc"-
1676#include "moc_qdockwidget.cpp"-
1677#include "moc_qdockwidget_p.cpp"-
1678-
1679#endif // QT_NO_DOCKWIDGET-
Source codeSwitch to Preprocessed file

Generated by Squish Coco Non-Commercial 4.3.0-BETA-master-30-08-2018-4cb69e9