Don't dereference windowBeingDragged->floatingWindow()

Add a level of indirection instead, and support for the wayland case
This commit is contained in:
Sergio Martins
2020-10-16 23:06:30 +01:00
parent 78a3221395
commit b67bdf779e
3 changed files with 30 additions and 6 deletions

View File

@@ -166,6 +166,14 @@ bool WindowBeingDragged::contains(DropArea *dropArea) const
return m_floatingWindow && m_floatingWindow->dropArea() == dropArea;
}
QVector<DockWidgetBase *> WindowBeingDragged::dockWidgets() const
{
if (m_floatingWindow)
return m_floatingWindow->dockWidgets();
return {};
}
Draggable *WindowBeingDragged::draggable() const
{
return m_draggable;
@@ -227,6 +235,18 @@ QPixmap WindowBeingDraggedWayland::pixmap() const
return pixmap;
}
QVector<DockWidgetBase *> WindowBeingDraggedWayland::dockWidgets() const
{
if (m_floatingWindow)
return WindowBeingDragged::dockWidgets();
else if (m_frame)
return m_frame->dockWidgets();
else if (m_dockWidget)
return { m_dockWidget };
return {};
}
QSize WindowBeingDraggedWayland::size() const
{
if (m_floatingWindow)

View File

@@ -64,6 +64,9 @@ public:
/// @brief Returns a pixmap representing this Window. For purposes of QDrag. Wayland only.
virtual QPixmap pixmap() const { return {}; }
/// @brief Returns the list of dock widgets being dragged
virtual QVector<DockWidgetBase*> dockWidgets() const;
/// @brief Returns the draggable
Draggable *draggable() const;
protected:
@@ -82,16 +85,17 @@ public:
explicit WindowBeingDraggedWayland(Draggable *draggable);
~WindowBeingDraggedWayland() override;
QSize size() const override;
QSize minSize() const override;
QSize maxSize() const override;
QPixmap pixmap() const override;
QVector<DockWidgetBase*> dockWidgets() const override;
// These two are set for Wayland only, where we can't make the floating window immediately (no way to position it)
// So we're dragging either a frame with multiple dock widgets or a single tab, keep them here.
// It's important to know what we're dragging, so drop rubber band respect min/max sizes.
QPointer<Frame> m_frame;
QPointer<DockWidgetBase> m_dockWidget;
QSize size() const override;
QSize minSize() const override;
QSize maxSize() const override;
QPixmap pixmap() const override;
};
}

View File

@@ -105,7 +105,7 @@ void ClassicIndicators::updateIndicatorsVisibility(bool visible)
m_tabIndicatorVisible = m_innerIndicatorsVisible && windowBeingDragged &&
DockRegistry::self()->affinitiesMatch(m_hoveredFrame->affinities(), windowBeingDragged->affinities());
if (m_tabIndicatorVisible && tabbingAllowedFunc) {
const DockWidgetBase::List source = windowBeingDragged->floatingWindow()->dockWidgets();
const DockWidgetBase::List source = windowBeingDragged->dockWidgets();
const DockWidgetBase::List target = m_hoveredFrame->dockWidgets();
m_tabIndicatorVisible = tabbingAllowedFunc(source, target);
}