Abstract TabWidget away from QtWidgets, so can be used for QtQuick

This commit is contained in:
Sergio Martins
2019-08-07 21:00:49 +01:00
parent 0ba3371c6c
commit 89757def76
14 changed files with 237 additions and 121 deletions

2
.gitignore vendored
View File

@@ -33,4 +33,4 @@ cmake_install.cmake
latex
html
fuzzer
bin/custom_titlebar
custom_titlebar

View File

@@ -262,7 +262,7 @@ DockWidgetBase::Options DockWidgetBase::options() const
bool DockWidgetBase::isTabbed() const
{
if (TabWidget* tabWidget = d->parentTabWidget()) {
return frame()->alwaysShowsTabs() || tabWidget->count() > 1;
return frame()->alwaysShowsTabs() || tabWidget->numDockWidgets() > 1;
} else {
if (!isFloating())
qWarning() << "DockWidget::isTabbed() Couldn't find any tab widget.";
@@ -273,7 +273,7 @@ bool DockWidgetBase::isTabbed() const
bool DockWidgetBase::isCurrentTab() const
{
if (TabWidget* tabWidget = d->parentTabWidget()) {
return tabWidget->currentIndex() == tabWidget->indexOf(const_cast<DockWidgetBase*>(this));
return tabWidget->currentIndex() == tabWidget->indexOfDockWidget(const_cast<DockWidgetBase*>(this));
} else {
return true;
}
@@ -282,7 +282,7 @@ bool DockWidgetBase::isCurrentTab() const
void DockWidgetBase::setAsCurrentTab()
{
if (TabWidget* tabWidget = d->parentTabWidget())
tabWidget->setCurrentWidget(this);
tabWidget->setCurrentDockWidget(this);
}
void DockWidgetBase::setIcon(const QIcon &icon)
@@ -302,12 +302,6 @@ void DockWidgetBase::forceClose()
d->close();
}
QTabWidget *DockWidgetBase::tabWidget() const
{
return frame() ? frame()->tabWidget()
: nullptr;
}
FloatingWindow *DockWidgetBase::morphIntoFloatingWindow()
{
qCDebug(creation) << "DockWidget::morphIntoFloatingWindow() this=" << this
@@ -414,11 +408,8 @@ void DockWidgetBase::Private::onDockWidgetHidden()
TabWidget *DockWidgetBase::Private::parentTabWidget() const
{
QWidget *p= q->parentWidget();
if (p && p->objectName() == QLatin1String("qt_tabwidget_stackedwidget")) {
if (auto tw = qobject_cast<TabWidget *>(p->parentWidget()))
return tw;
}
if (auto f = q->frame())
return f->tabWidget();
return nullptr;
}
@@ -483,8 +474,7 @@ void DockWidgetBase::Private::maybeRestoreToPreviousPosition()
int DockWidgetBase::Private::currentTabIndex() const
{
TabWidget *tabWidget = parentTabWidget();
return tabWidget ? tabWidget->indexOf(q)
: 0;
return tabWidget ? tabWidget->indexOfDockWidget(q) : 0;
}
void DockWidgetBase::Private::saveTabIndex()

View File

@@ -35,7 +35,6 @@
#include <QWidget>
class QAction;
class QTabWidget;
namespace KDDockWidgets {
@@ -45,8 +44,8 @@ class DragController;
class Item;
class LastPosition;
class DockRegistry;
class TabWidget;
class LayoutSaver;
class TabWidget;
class TitleBar;
/**
@@ -193,15 +192,6 @@ public:
*/
void forceClose();
/**
* @brief Returns the tab widget where this dock widget is in.
*
* It will be nullptr right after DockWidget() ctor, but will get set as soon as the DockWidget,
* gets added ao a MainWindow, or on the next event loop, where it's transformed into a
* FloatingWindow if floating.
*/
QTabWidget* tabWidget() const;
Q_SIGNALS:
///@brief signal emitted when the parent changed
void parentChanged();

View File

@@ -37,6 +37,7 @@
#include "DockRegistry_p.h"
#include "Config.h"
#include <QTabBar>
#include <QCloseEvent>
#define MARGIN_THRESHOLD 100
@@ -51,24 +52,10 @@ Frame::Frame(QWidget *parent, Options options)
, m_titleBar(Config::self().frameWorkWidgetFactory()->createTitleBar(this))
, m_options(options)
{
qDebug() << "Frame";
s_dbg_numFrames++;
DockRegistry::self()->registerFrame(this);
qCDebug(creation) << "Frame" << ((void*)this) << s_dbg_numFrames;
connect(m_tabWidget, &TabWidget::dockWidgetCountChanged, this, &Frame::onDockWidgetCountChanged);
connect(m_tabWidget, &TabWidget::dockWidgetCountChanged, this, &Frame::numDockWidgetsChanged);
connect(m_tabWidget, &QTabWidget::currentChanged, this, [this] (int index) {
if (index != -1) {
if (auto dock = dockWidgetAt(index)) {
Q_EMIT currentDockWidgetChanged(dock);
} else {
qWarning() << "dockWidgetAt" << index << "returned nullptr" << this;
}
}
});
connect(this, &Frame::currentDockWidgetChanged, this, &Frame::updateTitleAndIcon);
m_tabWidget->setTabBarAutoHide(!alwaysShowsTabs());
@@ -104,7 +91,7 @@ void Frame::updateTitleAndIcon()
void Frame::addWidget(DockWidgetBase *dockWidget)
{
insertWidget(dockWidget, m_tabWidget->count()); // append
insertWidget(dockWidget, m_tabWidget->numDockWidgets()); // append
}
void Frame::addWidget(Frame *frame)
@@ -168,6 +155,19 @@ void Frame::onDockWidgetCountChanged()
if (!(m_options & Option_AlwaysShowsTabs))
Q_EMIT hasTabsVisibleChanged();
}
Q_EMIT numDockWidgetsChanged();
}
void Frame::onCurrentTabChanged(int index)
{
if (index != -1) {
if (auto dock = dockWidgetAt(index)) {
Q_EMIT currentDockWidgetChanged(dock);
} else {
qWarning() << "dockWidgetAt" << index << "returned nullptr" << this;
}
}
}
void Frame::updateTitleBarVisibility()
@@ -292,12 +292,12 @@ int Frame::currentTabIndex() const
void Frame::setCurrentTabIndex(int index)
{
m_tabWidget->setCurrentIndex(index);
m_tabWidget->setCurrentDockWidget(index);
}
DockWidgetBase *Frame::currentDockWidget() const
{
return qobject_cast<DockWidgetBase*>(m_tabWidget->currentWidget());
return m_tabWidget->dockwidgetAt(m_tabWidget->currentIndex());
}
bool Frame::anyNonClosable() const
@@ -366,7 +366,7 @@ int Frame::dbg_numFrames()
void Frame::dumpDebug()
{
qDebug() << " Frame:" << (void*)this;
qDebug() << " layoutItem=" << m_layoutItem << "; num=" << m_tabWidget->count();
qDebug() << " layoutItem=" << m_layoutItem << "; num=" << m_tabWidget->numDockWidgets();
for (auto dw : dockWidgets()) {
qDebug() << " dockwidget=" << dw << "; dw->layoutItem=" << dw->lastPosition()->layoutItem();
dw->lastPosition()->dumpDebug();
@@ -395,7 +395,7 @@ bool Frame::hasTabsVisible() const
DockWidgetBase *Frame::dockWidgetAt(int index) const
{
return qobject_cast<DockWidgetBase *>(m_tabWidget->widget(index));
return qobject_cast<DockWidgetBase *>(m_tabWidget->dockwidgetAt(index));
}
void Frame::setDropArea(DropArea *dt)
@@ -443,7 +443,7 @@ bool Frame::isInMainWindow() const
int Frame::dockWidgetCount() const
{
return m_tabWidget->count();
return m_tabWidget->numDockWidgets();
}
bool Frame::event(QEvent *e)

View File

@@ -90,6 +90,7 @@ public:
void updateTitleBarVisibility();
bool containsMouse(QPoint globalPos) const;
TitleBar *titleBar() const;
TabWidget *tabWidget() const;
QString title() const;
QIcon icon() const;
const QVector<DockWidgetBase *> dockWidgets() const;
@@ -197,9 +198,6 @@ public:
*/
bool beingDeletedLater() const;
///@brief getter for the tab widget
TabWidget *tabWidget() const;
///@brief getter for the tab bar
TabBar *tabBar() const;
@@ -210,6 +208,7 @@ public:
**/
bool hasTabsVisible() const;
Q_SIGNALS:
void currentDockWidgetChanged(KDDockWidgets::DockWidgetBase *);
void numDockWidgetsChanged();
@@ -218,8 +217,10 @@ Q_SIGNALS:
private:
Q_DISABLE_COPY(Frame)
friend class TestDocks;
void scheduleDeleteLater();
friend class TabWidget;
void onDockWidgetCountChanged();
void onCurrentTabChanged(int index);
void scheduleDeleteLater();
bool event(QEvent *) override;
TabWidget *const m_tabWidget;
TitleBar *const m_titleBar;

View File

@@ -55,7 +55,7 @@ TabBar *DefaultWidgetFactory::createTabBar(TabWidget *parent) const
return new TabBarWidget(parent);
}
TabWidget *DefaultWidgetFactory::createTabWidget(QWidget *parent) const
TabWidget *DefaultWidgetFactory::createTabWidget(Frame *parent) const
{
return new TabWidgetWidget(parent);
}

View File

@@ -38,7 +38,7 @@ public:
virtual TitleBar* createTitleBar(Frame *) const = 0;
virtual TitleBar* createTitleBar(FloatingWindow *) const = 0;
virtual TabBar* createTabBar(TabWidget *parent = nullptr) const = 0;
virtual TabWidget* createTabWidget(QWidget *parent) const = 0;
virtual TabWidget* createTabWidget(Frame *parent) const = 0;
virtual Separator* createSeparator(Anchor *anchor, QWidgetAdapter *parent = nullptr) const = 0;
virtual FloatingWindow *createFloatingWindow(QWidget *parent = nullptr) const = 0;
virtual FloatingWindow *createFloatingWindow(Frame *frame, QWidget *parent = nullptr) const = 0;
@@ -51,7 +51,7 @@ public:
TitleBar *createTitleBar(Frame *) const override;
TitleBar *createTitleBar(FloatingWindow *) const override;
TabBar *createTabBar(TabWidget *parent) const override;
TabWidget *createTabWidget(QWidget *parent) const override;
TabWidget *createTabWidget(Frame *parent) const override;
Separator *createSeparator(Anchor *anchor, QWidgetAdapter *parent = nullptr) const override;
FloatingWindow *createFloatingWindow(QWidget *parent = nullptr) const override;
FloatingWindow *createFloatingWindow(Frame *frame, QWidget *parent = nullptr) const override;

View File

@@ -41,10 +41,10 @@
using namespace KDDockWidgets;
TabBar::TabBar(TabWidget *parent)
: QTabBar(parent)
TabBar::TabBar(TabWidget *tabWidget)
: QTabBar(tabWidget->asWidget())
, Draggable(this)
, m_tabWidget(parent)
, m_tabWidget(tabWidget)
{
setMinimumWidth(30);
}
@@ -54,7 +54,7 @@ DockWidgetBase *TabBar::dockWidgetAt(int index) const
if (index < 0 || index >= count())
return nullptr;
return qobject_cast<DockWidgetBase *>(m_tabWidget->widget(index));
return m_tabWidget->dockwidgetAt(index);
}
DockWidgetBase *TabBar::dockWidgetAt(QPoint localPos) const
@@ -102,29 +102,41 @@ void TabBar::onMousePress(QPoint localPos)
m_lastPressedDockWidget = dockWidgetAt(localPos);
}
TabWidget::TabWidget(QWidget *parent)
: QTabWidget(parent)
, Draggable(this, Config::self().flags() & Config::Flag_HideTitleBarWhenTabsVisible)
, m_tabBar(Config::self().frameWorkWidgetFactory()->createTabBar(this))
TabWidget::TabWidget(QWidgetOrQuick *thisWidget, Frame *frame)
: Draggable(thisWidget, Config::self().flags() & Config::Flag_HideTitleBarWhenTabsVisible)
, m_frame(frame)
, m_thisWidget(thisWidget)
{
setTabBarAutoHide(true);
setTabBar(m_tabBar);
#ifdef KDDOCKWIDGETS_QTWIDGETS
// Little ifdefery, as this is not so easy to abstract
QObject::connect(static_cast<QTabWidget*>(thisWidget), &QTabWidget::currentChanged,
frame, &Frame::onCurrentTabChanged);
#else
qWarning() << Q_FUNC_INFO << "Implement me")
#endif
}
void TabWidget::setCurrentDockWidget(DockWidgetBase *dw)
{
setCurrentDockWidget(indexOfDockWidget(dw));
}
void TabWidget::addDockWidget(DockWidgetBase *dock)
{
insertDockWidget(dock, count());
insertDockWidget(dock, numDockWidgets());
}
void TabWidget::insertDockWidget(DockWidgetBase *dock, int index)
{
Q_ASSERT(dock);
qCDebug(addwidget) << Q_FUNC_INFO << dock << "; count before=" << count();
qCDebug(addwidget) << Q_FUNC_INFO << dock << "; count before=" << numDockWidgets();
if (index < 0)
index = 0;
if (index > count())
index = count();
if (index > numDockWidgets())
index = numDockWidgets();
if (contains(dock)) {
qWarning() << Q_FUNC_INFO << "Refusing to add already existing widget";
@@ -132,8 +144,8 @@ void TabWidget::insertDockWidget(DockWidgetBase *dock, int index)
}
QPointer<Frame> oldFrame = dock->frame();
insertTab(index, dock, dock->icon(), dock->title());
setCurrentIndex(index);
insertDockWidget(index, dock, dock->icon(), dock->title());
setCurrentDockWidget(index);
if (oldFrame && oldFrame->beingDeletedLater()) {
// give it a push and delete it immediately.
@@ -148,32 +160,30 @@ void TabWidget::insertDockWidget(DockWidgetBase *dock, int index)
}
}
void TabWidget::removeDockWidget(DockWidgetBase *w)
{
removeTab(indexOf(w));
}
void TabWidget::detachTab(DockWidgetBase *dockWidget)
{
m_tabBar->detachTab(dockWidget);
tabBar()->detachTab(dockWidget);
}
bool TabWidget::contains(DockWidgetBase *dw) const
{
return indexOf(dw) != -1;
return indexOfDockWidget(dw) != -1;
}
QWidgetOrQuick *TabWidget::asWidget() const
{
return m_thisWidget;
}
std::unique_ptr<WindowBeingDragged> TabWidget::makeWindow()
{
auto frame = qobject_cast<Frame*>(parentWidget());
Q_ASSERT(frame);
QRect r = m_frame->geometry();
QRect r = frame->geometry();
const QPoint globalPoint = mapToGlobal(QPoint(0, 0));
const QPoint globalPoint = m_thisWidget->mapToGlobal(QPoint(0, 0));
auto floatingWindow = Config::self().frameWorkWidgetFactory()->createFloatingWindow(frame);
auto floatingWindow = Config::self().frameWorkWidgetFactory()->createFloatingWindow(m_frame);
r.moveTopLeft(globalPoint);
floatingWindow->setGeometry(r);
floatingWindow->show();
@@ -181,22 +191,13 @@ std::unique_ptr<WindowBeingDragged> TabWidget::makeWindow()
return std::unique_ptr<WindowBeingDragged>(new WindowBeingDragged(floatingWindow, this));
}
bool TabWidget::isPositionDraggable(QPoint p) const
{
if (tabPosition() != QTabWidget::North) {
qWarning() << Q_FUNC_INFO << "Not implemented yet. Only North is supported";
return false;
}
return p.y() >= 0 && p.y() <= m_tabBar->height();
void TabWidget::onTabInserted()
{
m_frame->onDockWidgetCountChanged();
}
void TabWidget::tabInserted(int)
void TabWidget::onTabRemoved()
{
Q_EMIT dockWidgetCountChanged();
}
void TabWidget::tabRemoved(int)
{
Q_EMIT dockWidgetCountChanged();
m_frame->onDockWidgetCountChanged();
}

View File

@@ -87,16 +87,52 @@ private:
QPointer<DockWidgetBase> m_lastPressedDockWidget = nullptr;
};
class DOCKS_EXPORT TabWidget : public QTabWidget, public Draggable
class DOCKS_EXPORT TabWidget : public Draggable
{
Q_OBJECT
public:
explicit TabWidget(QWidget *parent);
/**
* @brief Constructs a new TabWidget, with @p frame as a parent
*/
explicit TabWidget(QWidgetOrQuick *thisWidget, Frame *frame);
/**
* @brief returns the number of dock widgets in this TabWidget
*/
virtual int numDockWidgets() const = 0;
/**
* @brief Removes a dock widget from the TabWidget
*/
virtual void removeDockWidget(DockWidgetBase *) = 0;
/**
* @brief Returns the index of the dock widget, or -1 if it doesn't exist
*/
virtual int indexOfDockWidget(DockWidgetBase *) const = 0;
/**
* @brief Sets the current dock widget index
*/
virtual void setCurrentDockWidget(int index) = 0;
void setCurrentDockWidget(DockWidgetBase *);
virtual void insertDockWidget(int index, DockWidgetBase *, const QIcon&, const QString &title) = 0;
virtual void setTabBarAutoHide(bool) = 0;
/**
* @brief Returns the current index
*/
virtual int currentIndex() const = 0;
///@brief appends a dock widget into this TabWidget
void addDockWidget(DockWidgetBase *);
/**
* @brief Returns the dock widget tabbed at index @p index
*/
virtual DockWidgetBase *dockwidgetAt(int index) const = 0;
/**
* @brief inserts @p dockwidget into the TabWidget, at @p index
* @param dockwidget the dockwidget to insert
@@ -104,8 +140,6 @@ public:
*/
void insertDockWidget(DockWidgetBase *dockwidget, int index);
void removeDockWidget(DockWidgetBase *);
/**
* @brief detaches a dock widget and shows it as a floating dock widget
* @param dockWidget the dock widget to detach
@@ -118,17 +152,26 @@ public:
*/
bool contains(DockWidgetBase *dw) const;
/**
* @brief Returns the tab bar
*/
virtual TabBar* tabBar() const = 0;
/**
* @brief Returns this class as a QWidget (if using QtWidgets) or QQuickItem
*/
QWidgetOrQuick *asWidget() const;
// Draggable interface
std::unique_ptr<WindowBeingDragged> makeWindow() override;
bool isPositionDraggable(QPoint p) const override;
Q_SIGNALS:
void dockWidgetCountChanged();
protected:
void tabInserted(int index) override;
void tabRemoved(int index) override;
void onTabInserted();
void onTabRemoved();
private:
TabBar *const m_tabBar;
Frame *const m_frame;
QWidgetOrQuick *const m_thisWidget;
Q_DISABLE_COPY(TabWidget)
};
}

View File

@@ -31,20 +31,18 @@
#include <QVBoxLayout>
#include <QPainter>
#include <QVBoxLayout>
using namespace KDDockWidgets;
FrameWidget::FrameWidget(QWidget *parent, Options options)
: Frame(parent, options)
{
qDebug() << "FrameWidget";
auto vlayout = new QVBoxLayout(this);
vlayout->setContentsMargins(0, 0, 0, 0);
vlayout->setSpacing(0);
vlayout->addWidget(titleBar());
vlayout->addWidget(tabWidget());
vlayout->addWidget(tabWidget()->asWidget());
}
void FrameWidget::paintEvent(QPaintEvent *)

View File

@@ -26,12 +26,37 @@
*/
#include "TabWidgetWidget_p.h"
#include "Frame_p.h"
#include "Config.h"
using namespace KDDockWidgets;
TabWidgetWidget::TabWidgetWidget(QWidget *parent)
: TabWidget(parent)
TabWidgetWidget::TabWidgetWidget(Frame *parent)
: QTabWidget(parent)
, TabWidget(this, parent)
, m_tabBar(Config::self().frameWorkWidgetFactory()->createTabBar(this))
{
setTabBar(m_tabBar);
}
TabBar *TabWidgetWidget::tabBar() const
{
return m_tabBar;
}
int TabWidgetWidget::numDockWidgets() const
{
return count();
}
void TabWidgetWidget::removeDockWidget(DockWidgetBase *dw)
{
removeTab(indexOf(dw));
}
int TabWidgetWidget::indexOfDockWidget(DockWidgetBase *dw) const
{
return indexOf(dw);
}
void TabWidgetWidget::paintEvent(QPaintEvent *p)
@@ -41,3 +66,49 @@ void TabWidgetWidget::paintEvent(QPaintEvent *p)
if (count() > 1)
QTabWidget::paintEvent(p);
}
void TabWidgetWidget::tabInserted(int)
{
onTabInserted();
}
void TabWidgetWidget::tabRemoved(int)
{
onTabRemoved();
}
bool TabWidgetWidget::isPositionDraggable(QPoint p) const
{
if (tabPosition() != QTabWidget::North) {
qWarning() << Q_FUNC_INFO << "Not implemented yet. Only North is supported";
return false;
}
return p.y() >= 0 && p.y() <= QTabWidget::tabBar()->height();
}
void TabWidgetWidget::setCurrentDockWidget(int index)
{
setCurrentIndex(index);
}
void TabWidgetWidget::insertDockWidget(int index, DockWidgetBase *dw,
const QIcon &icon, const QString &title)
{
insertTab(index, dw, icon, title);
}
void TabWidgetWidget::setTabBarAutoHide(bool b)
{
QTabWidget::setTabBarAutoHide(b);
}
DockWidgetBase *TabWidgetWidget::dockwidgetAt(int index) const
{
return qobject_cast<DockWidgetBase *>(widget(index));
}
int TabWidgetWidget::currentIndex() const
{
return QTabWidget::currentIndex();
}

View File

@@ -29,18 +29,39 @@
#define KDTABWIDGETWIDGET_P_H
#include "TabWidget_p.h"
#include <QTabWidget>
namespace KDDockWidgets {
class DOCKS_EXPORT TabWidgetWidget : public TabWidget
class Frame;
class TabBar;
class DOCKS_EXPORT TabWidgetWidget : public QTabWidget, public TabWidget
{
Q_OBJECT
public:
explicit TabWidgetWidget(QWidget *parent);
explicit TabWidgetWidget(Frame *parent);
TabBar *tabBar() const override;
int numDockWidgets() const override;
void removeDockWidget(DockWidgetBase *) override;
int indexOfDockWidget(DockWidgetBase *) const override;
protected:
void paintEvent(QPaintEvent *) override;
void tabInserted(int index) override;
void tabRemoved(int index) override;
bool isPositionDraggable(QPoint p) const override;
void setCurrentDockWidget(int index) override;
void insertDockWidget(int index, DockWidgetBase *, const QIcon&, const QString &title) override;
void setTabBarAutoHide(bool) override;
DockWidgetBase *dockwidgetAt(int index) const override;
int currentIndex() const override;
private:
Q_DISABLE_COPY(TabWidgetWidget)
TabBar *const m_tabBar;
};
}

View File

@@ -2517,7 +2517,7 @@ void TestDocks::tst_setFloatingWhenWasTabbed()
dock2->setVisible(false);
QVERIFY(dock2->isTabbed());
QVERIFY(!dock1->isFloating());
QCOMPARE(dock2->frame()->m_tabWidget->count(), 2);
QCOMPARE(dock2->frame()->m_tabWidget->numDockWidgets(), 2);
// 3. Set one floating. Now both cease to be tabbed, and both are floating.
dock1->setFloating(true);
@@ -2573,7 +2573,7 @@ void TestDocks::tst_setFloatingWhenWasTabbed()
dock2->setFloating(false);
QVERIFY(!dock2->isFloating());
QVERIFY(dock2->isTabbed());
QCOMPARE(dock2->frame()->m_tabWidget->indexOf(dock2), 1);
QCOMPARE(dock2->frame()->m_tabWidget->indexOfDockWidget(dock2), 1);
// 10. Float dock1, and dock it to main window as tab. This tests Option_AlwaysShowsTabs.
@@ -2586,7 +2586,7 @@ void TestDocks::tst_setFloatingWhenWasTabbed()
QVERIFY(dock1->isTabbed());
dock1->setFloating(true);
dock1->setFloating(false);
QCOMPARE(dock1->frame()->m_tabWidget->count(), 1);
QCOMPARE(dock1->frame()->m_tabWidget->numDockWidgets(), 1);
// Cleanup
m->addDockWidgetAsTab(dock2);

View File

@@ -21,6 +21,7 @@
#include "utils.h"
#include "DropArea_p.h"
#include "Config.h"
#include "TabWidgetWidget_p.h"
#include <QCloseEvent>
#include <QDebug>
@@ -156,10 +157,10 @@ QWidget *KDDockWidgets::Tests::draggableFor(QWidget *w)
if (auto frame = dock->frame())
draggable = frame->titleBar();
} else if (auto fw = qobject_cast<FloatingWindow *>(w)) {
draggable = ((Config::self().flags() & Config::Flag_HideTitleBarWhenTabsVisible) && fw->hasSingleFrame() && fw->frames().first()->hasTabsVisible()) ? static_cast<QWidget*>(fw->frames().first()->tabWidget())
draggable = ((Config::self().flags() & Config::Flag_HideTitleBarWhenTabsVisible) && fw->hasSingleFrame() && fw->frames().first()->hasTabsVisible()) ? static_cast<QWidget*>(fw->frames().first()->tabWidget()->asWidget())
: static_cast<QWidget*>(fw->titleBar());
} else if (qobject_cast<TabWidget *>(w) || qobject_cast<TitleBar *>(w)) {
} else if (qobject_cast<TabWidgetWidget *>(w) || qobject_cast<TitleBar *>(w)) {
draggable = w;
}