12#include "WindowBeingDragged_p.h" 
   13#include "DragController_p.h" 
   15#include "LayoutWidget_p.h" 
   19#ifdef KDDOCKWIDGETS_QTWIDGETS 
   20#include "widgets/TabBarWidget_p.h" 
   21#include "widgets/TabWidgetWidget_p.h" 
   37    if (
auto titleBar = qobject_cast<TitleBar *>(draggable->asWidget())) {
 
   38        if (titleBar->isVisible())
 
   41        auto fw = qobject_cast<FloatingWindow *>(titleBar->window());
 
   45        if (fw->titleBar() == titleBar) {
 
   49            if (KDDockWidgets::usesNativeTitleBar())
 
   51            return fw->titleBar();
 
 
   58WindowBeingDragged::WindowBeingDragged(FloatingWindow *fw, Draggable *draggable)
 
   59    : m_floatingWindow(fw)
 
   61    , m_draggableWidget(m_draggable ? m_draggable->asWidget() : nullptr)
 
   68        if (!qIsNaN(opacity) && !qFuzzyCompare(1.0, opacity))
 
   69            fw->setWindowOpacity(opacity);
 
   73WindowBeingDragged::WindowBeingDragged(Draggable *draggable)
 
   74    : m_draggable(draggable)
 
   75    , m_draggableWidget(m_draggable->asWidget())
 
   78        qWarning() << Q_FUNC_INFO << 
"Wrong ctor called."; 
 
   84#ifdef DOCKS_DEVELOPER_MODE 
   87WindowBeingDragged::WindowBeingDragged(FloatingWindow *fw)
 
   88    : m_floatingWindow(fw)
 
   89    , m_draggable(nullptr)
 
   95WindowBeingDragged::~WindowBeingDragged()
 
   99    if (!isWayland() && m_floatingWindow) { 
 
  102        if (!qIsNaN(opacity) && !qFuzzyCompare(1.0, opacity))
 
  103            m_floatingWindow->setWindowOpacity(1);
 
  107void WindowBeingDragged::init()
 
  109    Q_ASSERT(m_floatingWindow);
 
  111    m_floatingWindow->raise();
 
  114void WindowBeingDragged::grabMouse(
bool grab)
 
  116    if (!m_draggableWidget)
 
  119    qCDebug(hovering) << 
"WindowBeingDragged: grab " << m_floatingWindow << grab << m_draggableWidget;
 
  121        DragController::instance()->grabMouseFor(m_draggableWidget);
 
  123        DragController::instance()->releaseMouse(m_draggableWidget);
 
  128    return m_floatingWindow ? m_floatingWindow->affinities()
 
  132QSize WindowBeingDragged::size()
 const 
  134    if (m_floatingWindow)
 
  135        return m_floatingWindow->size();
 
  140QSize WindowBeingDragged::minSize()
 const 
  142    if (m_floatingWindow)
 
  143        return m_floatingWindow->layoutWidget()->layoutMinimumSize();
 
  148QSize WindowBeingDragged::maxSize()
 const 
  150    if (m_floatingWindow)
 
  151        return m_floatingWindow->layoutWidget()->layoutMaximumSizeHint();
 
  156bool WindowBeingDragged::contains(LayoutWidget *layoutWidget)
 const 
  161    if (m_floatingWindow)
 
  162        return m_floatingWindow->layoutWidget() == layoutWidget;
 
  164    if (
auto fw = qobject_cast<FloatingWindow *>(m_draggableWidget->window())) {
 
  166        return fw->layoutWidget() == layoutWidget && fw->hasSingleFrame();
 
  174    if (m_floatingWindow)
 
  175        return m_floatingWindow->dockWidgets();
 
  180Draggable *WindowBeingDragged::draggable()
 const 
  185WindowBeingDraggedWayland::WindowBeingDraggedWayland(Draggable *draggable)
 
  186    : WindowBeingDragged(draggable)
 
  190        qWarning() << Q_FUNC_INFO << 
"This CTOR is only called on Wayland";
 
  195    if (
auto tb = qobject_cast<TitleBar *>(draggable->asWidget())) {
 
  196        if (
auto fw = tb->floatingWindow()) {
 
  198            m_floatingWindow = fw;
 
  199        } 
else if (Frame *frame = tb->frame()) {
 
  202            qWarning() << Q_FUNC_INFO << 
"Shouldn't happen. TitleBar of what ?";
 
  204    } 
else if (
auto fw = qobject_cast<FloatingWindow *>(draggable->asWidget())) {
 
  207        m_floatingWindow = fw;
 
  208#ifdef KDDOCKWIDGETS_QTWIDGETS 
  209    } 
else if (
auto tbw = qobject_cast<TabBarWidget *>(draggable->asWidget())) {
 
  210        m_dockWidget = tbw->currentDockWidget();
 
  211    } 
else if (
auto tw = qobject_cast<TabWidgetWidget *>(draggable->asWidget())) {
 
  212        m_frame = tw->frame();
 
  215        qWarning() << 
"Unknown draggable" << draggable->asWidget()
 
  220WindowBeingDraggedWayland::~WindowBeingDraggedWayland()
 
  224QPixmap WindowBeingDraggedWayland::pixmap()
 const 
  230    if (m_floatingWindow) {
 
  231        m_floatingWindow->render(&p);
 
  232    } 
else if (m_frame) {
 
  234    } 
else if (m_dockWidget) {
 
  235        m_dockWidget->render(&p);
 
  241QStringList WindowBeingDraggedWayland::affinities()
 const 
  243    if (m_floatingWindow)
 
  244        return WindowBeingDragged::affinities();
 
  246        return m_frame->affinities();
 
  247    else if (m_dockWidget)
 
  248        return { m_dockWidget->affinities() };
 
  255    if (m_floatingWindow)
 
  256        return WindowBeingDragged::dockWidgets();
 
  258        return m_frame->dockWidgets();
 
  259    else if (m_dockWidget)
 
  260        return { m_dockWidget };
 
  265QSize WindowBeingDraggedWayland::size()
 const 
  267    if (m_floatingWindow)
 
  268        return WindowBeingDragged::size();
 
  270        return m_frame->QWidgetAdapter::size();
 
  271    else if (m_dockWidget)
 
  272        return m_dockWidget->size();
 
  274    qWarning() << Q_FUNC_INFO << 
"Unknown size, shouldn't happen";
 
  278QSize WindowBeingDraggedWayland::minSize()
 const 
  280    if (m_floatingWindow) {
 
  281        return WindowBeingDragged::minSize();
 
  282    } 
else if (m_frame) {
 
  283        return m_frame->minSize();
 
  284    } 
else if (m_dockWidget) {
 
  288    qWarning() << Q_FUNC_INFO << 
"Unknown minSize, shouldn't happen";
 
  292QSize WindowBeingDraggedWayland::maxSize()
 const 
  294    if (m_floatingWindow) {
 
  295        return WindowBeingDragged::maxSize();
 
  296    } 
else if (m_frame) {
 
  297        return m_frame->maxSizeHint();
 
  298    } 
else if (m_dockWidget) {
 
  302    qWarning() << Q_FUNC_INFO << 
"Unknown maxSize, shouldn't happen";
 
  306bool WindowBeingDraggedWayland::isInWaylandDrag(Frame *frame)
 const 
  308    return frame && m_frame == frame;
 
static Draggable * bestDraggable(Draggable *draggable)