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:
Sergio Martins 2017-01-10 17:03:17 +00:00 committed by Sérgio Martins
parent fa8edcba0d
commit dd2a871eae
2 changed files with 27 additions and 5 deletions

View File

@ -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);

View File

@ -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();