Clear dock indicator when not over a floating dock group window
The rubberband is shown depending if there's a current hovered dock widget, but there were a few places that were not calling updateGapIndicator(). Additionally, the rubberband will also disappear if the currentHoveredFloat is destroyed externally (would leave a ghost rubber band behind). Task-number: QTBUG-58049 Change-Id: Iafdf234aa04b0ee280e51f8fa2fd212c86610cd1 Reviewed-by: Olivier Goffart (Woboq GmbH) <ogoffart@woboq.com>
This commit is contained in:
parent
fa8edcba0d
commit
dd2a871eae
@ -1951,6 +1951,27 @@ void QMainWindowLayout::invalidate()
|
||||
minSize = szHint = QSize();
|
||||
}
|
||||
|
||||
#ifndef QT_NO_DOCKWIDGET
|
||||
void QMainWindowLayout::setCurrentHoveredFloat(QWidget *w)
|
||||
{
|
||||
if (currentHoveredFloat != w) {
|
||||
if (currentHoveredFloat) {
|
||||
disconnect(currentHoveredFloat.data(), &QObject::destroyed,
|
||||
this, &QMainWindowLayout::updateGapIndicator);
|
||||
}
|
||||
|
||||
currentHoveredFloat = w;
|
||||
|
||||
if (w) {
|
||||
connect(w, &QObject::destroyed,
|
||||
this, &QMainWindowLayout::updateGapIndicator, Qt::UniqueConnection);
|
||||
}
|
||||
|
||||
updateGapIndicator();
|
||||
}
|
||||
}
|
||||
#endif //QT_NO_DOCKWIDGET
|
||||
|
||||
/******************************************************************************
|
||||
** QMainWindowLayout - remaining stuff
|
||||
*/
|
||||
@ -2037,7 +2058,7 @@ bool QMainWindowLayout::plug(QLayoutItem *widgetItem)
|
||||
dropTo->setParent(floatingTabs);
|
||||
dropTo->show();
|
||||
dropTo->d_func()->plug(QRect());
|
||||
currentHoveredFloat = floatingTabs;
|
||||
setCurrentHoveredFloat(floatingTabs);
|
||||
}
|
||||
#endif // QT_CONFIG(tabwidget)
|
||||
#if QT_CONFIG(tabbar)
|
||||
@ -2190,7 +2211,7 @@ void QMainWindowLayout::animationFinished(QWidget *widget)
|
||||
currentGapPos.clear();
|
||||
pluggingWidget = 0;
|
||||
#if QT_CONFIG(dockwidget)
|
||||
currentHoveredFloat = nullptr;
|
||||
setCurrentHoveredFloat(nullptr);
|
||||
#endif
|
||||
//applying the state will make sure that the currentGap is updated correctly
|
||||
//and all the geometries (especially the one from the central widget) is correct
|
||||
@ -2497,12 +2518,12 @@ void QMainWindowLayout::hover(QLayoutItem *widgetItem, const QPoint &mousePos)
|
||||
if (!w->geometry().contains(mousePos))
|
||||
continue;
|
||||
|
||||
currentHoveredFloat = w;
|
||||
setCurrentHoveredFloat(w);
|
||||
restore(true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
currentHoveredFloat = Q_NULLPTR;
|
||||
setCurrentHoveredFloat(nullptr);
|
||||
#endif //QT_NO_DOCKWIDGET
|
||||
|
||||
QPoint pos = parentWidget()->mapFromGlobal(mousePos);
|
||||
|
@ -306,13 +306,13 @@ public:
|
||||
#endif
|
||||
#ifndef QT_NO_DOCKWIDGET
|
||||
QPointer<QWidget> currentHoveredFloat; // set when dragging over a floating dock widget
|
||||
void setCurrentHoveredFloat(QWidget *w);
|
||||
#endif
|
||||
|
||||
void hover(QLayoutItem *widgetItem, const QPoint &mousePos);
|
||||
bool plug(QLayoutItem *widgetItem);
|
||||
QLayoutItem *unplug(QWidget *widget, bool group = false);
|
||||
void revert(QLayoutItem *widgetItem);
|
||||
void updateGapIndicator();
|
||||
void paintDropIndicator(QPainter *p, QWidget *widget, const QRegion &clip);
|
||||
void applyState(QMainWindowLayoutState &newState, bool animate = true);
|
||||
void restore(bool keepSavedState = false);
|
||||
@ -320,6 +320,7 @@ public:
|
||||
void animationFinished(QWidget *widget);
|
||||
|
||||
private Q_SLOTS:
|
||||
void updateGapIndicator();
|
||||
#ifndef QT_NO_DOCKWIDGET
|
||||
#ifndef QT_NO_TABBAR
|
||||
void tabChanged();
|
||||
|
Loading…
Reference in New Issue
Block a user