Add DockWidget::Option_NonDockable

A dock widget with this option will always be floating and not be
able to dock into anything. Other widgets can't dock into it either.
This commit is contained in:
Sergio Martins
2020-04-13 12:45:35 +01:00
parent 899ca6af6a
commit ab0fc1e328
11 changed files with 104 additions and 13 deletions

View File

@@ -197,6 +197,12 @@ bool StateDragging::handleMouseButtonRelease(QPoint globalPos)
return true;
}
if (floatingWindow->anyNonDockable()) {
qCDebug(state) << "StateDragging: Ignoring floating window with non dockable widgets";
Q_EMIT q->dragCanceled();
return true;
}
if (q->m_currentDropArea) {
if (q->m_currentDropArea->drop(floatingWindow, globalPos)) {
Q_EMIT q->dropped();
@@ -213,21 +219,36 @@ bool StateDragging::handleMouseButtonRelease(QPoint globalPos)
bool StateDragging::handleMouseMove(QPoint globalPos)
{
if (!q->m_windowBeingDragged->floatingWindow()) {
FloatingWindow *fw = q->m_windowBeingDragged->floatingWindow();
if (!fw) {
qCDebug(state) << "Canceling drag, window was deleted";
Q_EMIT q->dragCanceled();
return true;
}
if (!q->m_nonClientDrag)
q->m_windowBeingDragged->floatingWindow()->windowHandle()->setPosition(globalPos - q->m_offset);
fw->windowHandle()->setPosition(globalPos - q->m_offset);
if (fw->anyNonDockable()) {
qCDebug(state) << "StateDragging: Ignoring non dockable floating window";
return true;
}
DropArea *dropArea = q->dropAreaUnderCursor();
if (q->m_currentDropArea && dropArea != q->m_currentDropArea)
q->m_currentDropArea->removeHover();
if (dropArea)
dropArea->hover(q->m_windowBeingDragged->floatingWindow(), globalPos);
if (dropArea) {
if (FloatingWindow *targetFw = dropArea->floatingWindow()) {
if (targetFw->anyNonDockable()) {
qCDebug(state) << "StateDragging: Ignoring non dockable target floating window";
return false;
}
}
dropArea->hover(fw, globalPos);
}
q->m_currentDropArea = dropArea;