diff options
Diffstat (limited to 'src/widgets/widgets/qdockwidget.cpp')
-rw-r--r-- | src/widgets/widgets/qdockwidget.cpp | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/src/widgets/widgets/qdockwidget.cpp b/src/widgets/widgets/qdockwidget.cpp index ec5e4d51d5..67bb099446 100644 --- a/src/widgets/widgets/qdockwidget.cpp +++ b/src/widgets/widgets/qdockwidget.cpp @@ -277,7 +277,7 @@ void QDockWidgetLayout::addItem(QLayoutItem*) QLayoutItem *QDockWidgetLayout::itemAt(int index) const { int cnt = 0; - for (int i = 0; i < item_list.count(); ++i) { + for (int i = 0; i < item_list.size(); ++i) { QLayoutItem *item = item_list.at(i); if (item == nullptr) continue; @@ -290,7 +290,7 @@ QLayoutItem *QDockWidgetLayout::itemAt(int index) const QLayoutItem *QDockWidgetLayout::takeAt(int index) { int j = 0; - for (int i = 0; i < item_list.count(); ++i) { + for (int i = 0; i < item_list.size(); ++i) { QLayoutItem *item = item_list.at(i); if (item == nullptr) continue; @@ -307,7 +307,7 @@ QLayoutItem *QDockWidgetLayout::takeAt(int index) int QDockWidgetLayout::count() const { int result = 0; - for (int i = 0; i < item_list.count(); ++i) { + for (int i = 0; i < item_list.size(); ++i) { if (item_list.at(i)) ++result; } @@ -754,7 +754,7 @@ void QDockWidgetPrivate::initDrag(const QPoint &pos, bool nca) state = new QDockWidgetPrivate::DragState; state->pressPos = pos; state->globalPressPos = q->mapToGlobal(pos); - state->widgetInitialPos = q->pos(); + state->widgetInitialPos = q->isFloating() ? q->pos() : q->mapToGlobal(QPoint(0, 0)); state->dragging = false; state->widgetItem = nullptr; state->ownWidgetItem = false; @@ -1006,19 +1006,25 @@ bool QDockWidgetPrivate::mouseMoveEvent(QMouseEvent *event) - windowMarginOffset; } else { // Fallback in the unlikely case that source and target screens could not be established - qCWarning(lcQpaDockWidgets) + qCDebug(lcQpaDockWidgets) << "QDockWidget failed to find relevant screen info. screenFrom:" << screenFrom << "screenTo:" << screenTo << " wdgScreen:" << wdgScreen << "orgWdgScreen" << orgWdgScreen; pos = event->globalPosition().toPoint() - state->pressPos - windowMarginOffset; } + // If the newly floating dock widget has got a native title bar, + // offset the position by the native title bar's height or width + const int dx = q->geometry().x() - q->x(); + const int dy = q->geometry().y() - q->y(); + pos.rx() += dx; + pos.ry() += dy; + QDockWidgetGroupWindow *floatingTab = qobject_cast<QDockWidgetGroupWindow*>(parent); if (floatingTab && !q->isFloating()) floatingTab->move(pos); else q->move(pos); - if (state && !state->ctrlDrag) mwlayout->hover(state->widgetItem, event->globalPosition().toPoint()); @@ -1079,14 +1085,14 @@ void QDockWidgetPrivate::nonClientAreaMouseEvent(QMouseEvent *event) if (state == nullptr || !state->dragging) break; -#ifndef Q_OS_MAC +#if !defined(Q_OS_MAC) && !defined(Q_OS_WASM) if (state->nca) { endDrag(); } #endif break; case QEvent::NonClientAreaMouseButtonRelease: -#ifdef Q_OS_MAC +#if defined(Q_OS_MAC) || defined(Q_OS_WASM) if (state) endDrag(); #endif @@ -1571,7 +1577,7 @@ bool QDockWidget::event(QEvent *event) bool onTop = false; if (win != nullptr) { const QObjectList &siblings = win->children(); - onTop = siblings.count() > 0 && siblings.last() == (QObject*)this; + onTop = siblings.size() > 0 && siblings.last() == (QObject*)this; } #if QT_CONFIG(tabbar) if (!isFloating() && layout != nullptr && onTop) |