Abstract TabWidget away from QtWidgets, so can be used for QtQuick
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -33,4 +33,4 @@ cmake_install.cmake
|
||||
latex
|
||||
html
|
||||
fuzzer
|
||||
bin/custom_titlebar
|
||||
custom_titlebar
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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 *)
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user