diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2019-03-26 08:24:59 +0100 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2019-03-26 08:24:59 +0100 |
commit | 7f635d9777baf4af85a2575de123a75ec58bda78 (patch) | |
tree | 90ef3a223f8b0b1601f8e72a3adce6f4513fe2dd /src/widgets/widgets | |
parent | d0f016ebfb86fcebcf72c37c489260a0d02147e7 (diff) | |
parent | 945198fd237a83348feb4537d811565a2c2cd8e0 (diff) |
Merge remote-tracking branch 'origin/5.13' into dev
Change-Id: I38389a69411f4549fed432f1181dbe23398b34a2
Diffstat (limited to 'src/widgets/widgets')
-rw-r--r-- | src/widgets/widgets/qdockwidget.cpp | 28 | ||||
-rw-r--r-- | src/widgets/widgets/qdockwidget_p.h | 28 | ||||
-rw-r--r-- | src/widgets/widgets/qmainwindowlayout.cpp | 27 | ||||
-rw-r--r-- | src/widgets/widgets/qsplashscreen.cpp | 13 | ||||
-rw-r--r-- | src/widgets/widgets/qsplitter.cpp | 8 |
5 files changed, 73 insertions, 31 deletions
diff --git a/src/widgets/widgets/qdockwidget.cpp b/src/widgets/widgets/qdockwidget.cpp index ba8bd90da6..4041c730b8 100644 --- a/src/widgets/widgets/qdockwidget.cpp +++ b/src/widgets/widgets/qdockwidget.cpp @@ -67,18 +67,21 @@ extern QString qt_setWindowTitle_helperHelper(const QString&, const QWidget*); / // qmainwindow.cpp extern QMainWindowLayout *qt_mainwindow_layout(const QMainWindow *window); -static inline QMainWindowLayout *qt_mainwindow_layout_from_dock(const QDockWidget *dock) +static const QMainWindow *mainwindow_from_dock(const QDockWidget *dock) { - const QWidget *p = dock->parentWidget(); - while (p) { - const QMainWindow *window = qobject_cast<const QMainWindow*>(p); - if (window) - return qt_mainwindow_layout(window); - p = p->parentWidget(); + for (const QWidget *p = dock->parentWidget(); p; p = p->parentWidget()) { + if (const QMainWindow *window = qobject_cast<const QMainWindow*>(p)) + return window; } return nullptr; } +static inline QMainWindowLayout *qt_mainwindow_layout_from_dock(const QDockWidget *dock) +{ + auto mainWindow = mainwindow_from_dock(dock); + return mainWindow ? qt_mainwindow_layout(mainWindow) : nullptr; +} + static inline bool hasFeature(const QDockWidgetPrivate *priv, QDockWidget::DockWidgetFeature feature) { return (priv->features & feature) == feature; } @@ -839,8 +842,9 @@ void QDockWidgetPrivate::endDrag(bool abort) q->releaseMouse(); if (state->dragging) { - QMainWindowLayout *mwLayout = qt_mainwindow_layout_from_dock(q); - Q_ASSERT(mwLayout != 0); + const QMainWindow *mainWindow = mainwindow_from_dock(q); + Q_ASSERT(mainWindow != nullptr); + QMainWindowLayout *mwLayout = qt_mainwindow_layout(mainWindow); if (abort || !mwLayout->plug(state->widgetItem)) { if (hasFeature(this, QDockWidget::DockWidgetFloatable)) { @@ -861,8 +865,12 @@ void QDockWidgetPrivate::endDrag(bool abort) } else { setResizerActive(false); } - if (q->isFloating()) // Might not be floating when dragging a QDockWidgetGroupWindow + if (q->isFloating()) { // Might not be floating when dragging a QDockWidgetGroupWindow undockedGeometry = q->geometry(); +#if QT_CONFIG(tabwidget) + tabPosition = mwLayout->tabPosition(mainWindow->dockWidgetArea(q)); +#endif + } q->activateWindow(); } else { // The tab was not plugged back in the QMainWindow but the QDockWidget cannot diff --git a/src/widgets/widgets/qdockwidget_p.h b/src/widgets/widgets/qdockwidget_p.h index 2543f10f97..bc6ac86c45 100644 --- a/src/widgets/widgets/qdockwidget_p.h +++ b/src/widgets/widgets/qdockwidget_p.h @@ -57,6 +57,10 @@ #include "QtWidgets/qboxlayout.h" #include "QtWidgets/qdockwidget.h" +#if QT_CONFIG(tabwidget) +# include "QtWidgets/qtabwidget.h" +#endif + QT_REQUIRE_CONFIG(dockwidget); QT_BEGIN_NAMESPACE @@ -81,28 +85,26 @@ class QDockWidgetPrivate : public QWidgetPrivate }; public: - inline QDockWidgetPrivate() - : QWidgetPrivate(), state(nullptr), - features(QDockWidget::DockWidgetClosable - | QDockWidget::DockWidgetMovable - | QDockWidget::DockWidgetFloatable), - allowedAreas(Qt::AllDockWidgetAreas), resizer(nullptr) - { } - void init(); void _q_toggleView(bool); // private slot void _q_toggleTopLevel(); // private slot void updateButtons(); - DragState *state; - QDockWidget::DockWidgetFeatures features; - Qt::DockWidgetAreas allowedAreas; +#if QT_CONFIG(tabwidget) + QTabWidget::TabPosition tabPosition = QTabWidget::North; +#endif + + DragState *state = nullptr; + + QDockWidget::DockWidgetFeatures features = QDockWidget::DockWidgetClosable + | QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetFloatable; + Qt::DockWidgetAreas allowedAreas = Qt::AllDockWidgetAreas; QFont font; #ifndef QT_NO_ACTION - QAction *toggleViewAction; + QAction *toggleViewAction = nullptr; #endif // QMainWindow *findMainWindow(QWidget *widget) const; @@ -129,7 +131,7 @@ public: bool isAnimating() const; private: - QWidgetResizeHandler *resizer; + QWidgetResizeHandler *resizer = nullptr; }; class Q_WIDGETS_EXPORT QDockWidgetLayout : public QLayout diff --git a/src/widgets/widgets/qmainwindowlayout.cpp b/src/widgets/widgets/qmainwindowlayout.cpp index ed054c7e9a..f54835f23b 100644 --- a/src/widgets/widgets/qmainwindowlayout.cpp +++ b/src/widgets/widgets/qmainwindowlayout.cpp @@ -2525,6 +2525,30 @@ void QMainWindowLayout::updateGapIndicator() #endif // QT_CONFIG(rubberband) } +static QTabBar::Shape tabwidgetPositionToTabBarShape(QWidget *w) +{ + QTabBar::Shape result = QTabBar::RoundedSouth; +#if QT_CONFIG(tabwidget) + if (qobject_cast<QDockWidget *>(w)) { + switch (static_cast<QDockWidgetPrivate *>(qt_widget_private(w))->tabPosition) { + case QTabWidget::North: + result = QTabBar::RoundedNorth; + break; + case QTabWidget::South: + result = QTabBar::RoundedSouth; + break; + case QTabWidget::West: + result = QTabBar::RoundedWest; + break; + case QTabWidget::East: + result = QTabBar::RoundedEast; + break; + } + } +#endif // tabwidget + return result; +} + void QMainWindowLayout::hover(QLayoutItem *widgetItem, const QPoint &mousePos) { if (!parentWidget()->isVisible() || parentWidget()->isMinimized() @@ -2573,8 +2597,9 @@ void QMainWindowLayout::hover(QLayoutItem *widgetItem, const QPoint &mousePos) QDockWidgetGroupWindow *floatingTabs = createTabbedDockWindow(); // FIXME floatingTabs->setGeometry(dropTo->geometry()); QDockAreaLayoutInfo *info = floatingTabs->layoutInfo(); + const QTabBar::Shape shape = tabwidgetPositionToTabBarShape(dropTo); *info = QDockAreaLayoutInfo(&layoutState.dockAreaLayout.sep, QInternal::LeftDock, - Qt::Horizontal, QTabBar::RoundedSouth, + Qt::Horizontal, shape, static_cast<QMainWindow *>(parentWidget())); info->tabbed = true; QLayout *parentLayout = dropTo->parentWidget()->layout(); diff --git a/src/widgets/widgets/qsplashscreen.cpp b/src/widgets/widgets/qsplashscreen.cpp index 4af4f90119..bf6bf1c7c9 100644 --- a/src/widgets/widgets/qsplashscreen.cpp +++ b/src/widgets/widgets/qsplashscreen.cpp @@ -289,8 +289,7 @@ void QSplashScreen::setPixmap(const QPixmap &pixmap) // 1) If a QDesktopScreenWidget is found in the parent hierarchy, use that (see docs on // QSplashScreen(QWidget *, QPixmap). // 2) If a widget with associated QWindow is found, use that -// 3) When nothing can be found, do not position the widget, allowing for -// QPlatformWindow::initialGeometry() to center it over the cursor +// 3) When nothing can be found, try to center it over the cursor static inline int screenNumberOf(const QDesktopScreenWidget *dsw) { @@ -307,7 +306,15 @@ const QScreen *QSplashScreenPrivate::screenFor(const QWidget *w) if (QWindow *window = p->windowHandle()) return window->screen(); } - return nullptr; +#if QT_CONFIG(cursor) + // Note: We could rely on QPlatformWindow::initialGeometry() to center it + // over the cursor, but not all platforms (namely Android) use that. + if (QGuiApplication::screens().size() > 1) { + if (auto screenAtCursor = QGuiApplication::screenAt(QCursor::pos())) + return screenAtCursor; + } +#endif // cursor + return QGuiApplication::primaryScreen(); } void QSplashScreenPrivate::setPixmap(const QPixmap &p, const QScreen *screen) diff --git a/src/widgets/widgets/qsplitter.cpp b/src/widgets/widgets/qsplitter.cpp index 98bb23caad..de838a8f93 100644 --- a/src/widgets/widgets/qsplitter.cpp +++ b/src/widgets/widgets/qsplitter.cpp @@ -161,11 +161,10 @@ Qt::Orientation QSplitterHandle::orientation() const /*! - Returns \c true if widgets are resized dynamically (opaquely), otherwise - returns \c false. This value is controlled by the QSplitter. + Returns \c true if widgets are resized dynamically (opaquely) while interactively moving the + splitter. Otherwise returns \c false. This value is controlled by the QSplitter. \sa QSplitter::opaqueResize() - */ bool QSplitterHandle::opaqueResize() const { @@ -1483,7 +1482,8 @@ int QSplitter::closestLegalPosition(int pos, int index) /*! \property QSplitter::opaqueResize - \brief whether resizing is opaque + Returns \c true if widgets are resized dynamically (opaquely) while interactively moving the + splitter. Otherwise returns \c false. The default resize behavior is style dependent (determined by the SH_Splitter_OpaqueResize style hint). However, you can override it |