diff options
author | Qt Forward Merge Bot <qt_forward_merge_bot@qt-project.org> | 2019-04-04 23:01:17 +0000 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2019-04-04 23:01:17 +0000 |
commit | ed485243b594a730cebee4d76847e0f556d369f4 (patch) | |
tree | 545dd98a3138782df786f742cac02bc63113eaf6 /src/widgets/widgets | |
parent | 8d7c97d428cdf89c3419a4e13b62a9849feefce9 (diff) | |
parent | eb606d85b3f1548445cfd1fee43f882da88fb6e7 (diff) |
Merge "Merge remote-tracking branch 'origin/5.13' into dev" into refs/staging/dev
Diffstat (limited to 'src/widgets/widgets')
-rw-r--r-- | src/widgets/widgets/qabstractspinbox.cpp | 16 | ||||
-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/qspinbox.cpp | 4 | ||||
-rw-r--r-- | src/widgets/widgets/qsplashscreen.cpp | 13 | ||||
-rw-r--r-- | src/widgets/widgets/qsplitter.cpp | 8 |
7 files changed, 85 insertions, 39 deletions
diff --git a/src/widgets/widgets/qabstractspinbox.cpp b/src/widgets/widgets/qabstractspinbox.cpp index 54caa26fb6..c617525c45 100644 --- a/src/widgets/widgets/qabstractspinbox.cpp +++ b/src/widgets/widgets/qabstractspinbox.cpp @@ -2030,8 +2030,8 @@ QVariant operator+(const QVariant &arg1, const QVariant &arg2) #if QT_CONFIG(datetimeparser) case QVariant::DateTime: { QDateTime a2 = arg2.toDateTime(); - QDateTime a1 = arg1.toDateTime().addDays(QDATETIMEEDIT_DATETIME_MIN.daysTo(a2)); - a1.setTime(a1.time().addMSecs(QTime().msecsTo(a2.time()))); + QDateTime a1 = arg1.toDateTime().addDays(QDATETIMEEDIT_DATE_MIN.daysTo(a2.date())); + a1.setTime(a1.time().addMSecs(a2.time().msecsSinceStartOfDay())); ret = QVariant(a1); break; } @@ -2093,11 +2093,11 @@ QVariant operator*(const QVariant &arg1, double multiplier) #if QT_CONFIG(datetimeparser) case QVariant::DateTime: { double days = QDATETIMEEDIT_DATE_MIN.daysTo(arg1.toDateTime().date()) * multiplier; - int daysInt = (int)days; + const qint64 daysInt = qint64(days); days -= daysInt; - long msecs = (long)((QDATETIMEEDIT_TIME_MIN.msecsTo(arg1.toDateTime().time()) * multiplier) - + (days * (24 * 3600 * 1000))); - ret = QDateTime(QDate().addDays(int(days)), QTime().addMSecs(msecs)); + qint64 msecs = qint64(arg1.toDateTime().time().msecsSinceStartOfDay() * multiplier + + days * (24 * 3600 * 1000)); + ret = QDateTime(QDATETIMEEDIT_DATE_MIN.addDays(daysInt), QTime::fromMSecsSinceStartOfDay(msecs)); break; } #endif // datetimeparser @@ -2127,8 +2127,8 @@ double operator/(const QVariant &arg1, const QVariant &arg2) case QVariant::DateTime: a1 = QDATETIMEEDIT_DATE_MIN.daysTo(arg1.toDate()); a2 = QDATETIMEEDIT_DATE_MIN.daysTo(arg2.toDate()); - a1 += (double)QDATETIMEEDIT_TIME_MIN.msecsTo(arg1.toDateTime().time()) / (long)(3600 * 24 * 1000); - a2 += (double)QDATETIMEEDIT_TIME_MIN.msecsTo(arg2.toDateTime().time()) / (long)(3600 * 24 * 1000); + a1 += arg1.toDateTime().time().msecsSinceStartOfDay() / (36e5 * 24); + a2 += arg2.toDateTime().time().msecsSinceStartOfDay() / (36e5 * 24); break; #endif // datetimeparser default: break; 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/qspinbox.cpp b/src/widgets/widgets/qspinbox.cpp index 40044223e2..97a3a12336 100644 --- a/src/widgets/widgets/qspinbox.cpp +++ b/src/widgets/widgets/qspinbox.cpp @@ -751,6 +751,10 @@ void QDoubleSpinBox::setPrefix(const QString &prefix) d->prefix = prefix; d->updateEdit(); + + d->cachedSizeHint = QSize(); + d->cachedMinimumSizeHint = QSize(); // minimumSizeHint cares about the prefix + updateGeometry(); } /*! 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 |