Don't dereference windowBeingDragged->floatingWindow()
Add a level of indirection instead, and support for the wayland case
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user