Remove some methods from TabWidgetQuick
Reuse more from base class.
This commit is contained in:
@@ -186,7 +186,7 @@ TabBar *DefaultWidgetFactory::createTabBar(TabWidget *parent) const
|
||||
return new TabBarQuick(parent);
|
||||
}
|
||||
|
||||
TabWidget *DefaultWidgetFactory::createTabWidget(Frame *parent) const
|
||||
TabWidgetQuick *DefaultWidgetFactory::createTabWidget(Frame *parent) const
|
||||
{
|
||||
return new TabWidgetQuick(parent);
|
||||
}
|
||||
|
||||
@@ -43,6 +43,7 @@ class Frame;
|
||||
class DropArea;
|
||||
class SideBar;
|
||||
class TabBar;
|
||||
class TabWidgetQuick;
|
||||
|
||||
/**
|
||||
* @brief A factory class for allowing the user to customize some internal widgets.
|
||||
@@ -99,11 +100,6 @@ public:
|
||||
///@param parent Just forward to TabBar's's constructor.
|
||||
virtual TabBar* createTabBar(TabWidget *parent = nullptr) const = 0;
|
||||
|
||||
///@brief Called internally by the framework to create a TabWidget
|
||||
/// Override to provide your own TabWidget sub-class.
|
||||
///@param parent Just forward to TabWidget's constructor.
|
||||
virtual TabWidget* createTabWidget(Frame *parent) const = 0;
|
||||
|
||||
///@brief Called internally by the framework to create a Separator
|
||||
/// Override to provide your own Separator sub-class. The Separator allows
|
||||
/// the user to resize nested dock widgets.
|
||||
@@ -141,7 +137,18 @@ public:
|
||||
///@brief Called internally by the framework to create a title bar button
|
||||
///@p parent the button's parent
|
||||
virtual QAbstractButton* createTitleBarButton(QWidget *parent, TitleBarButtonType) const = 0;
|
||||
|
||||
///@brief Called internally by the framework to create a TabWidget
|
||||
/// Override to provide your own TabWidget sub-class.
|
||||
///@param parent Just forward to TabWidget's constructor.
|
||||
virtual TabWidget* createTabWidget(Frame *parent) const = 0;
|
||||
|
||||
#else
|
||||
///@brief Called internally by the framework to create a TabWidget
|
||||
/// Override to provide your own TabWidget sub-class.
|
||||
///@param parent Just forward to TabWidget's constructor.
|
||||
virtual TabWidgetQuick* createTabWidget(Frame *parent) const = 0;
|
||||
|
||||
virtual QUrl titleBarFilename() const = 0;
|
||||
#endif
|
||||
|
||||
@@ -163,7 +170,6 @@ public:
|
||||
TitleBar *createTitleBar(Frame *) const override;
|
||||
TitleBar *createTitleBar(FloatingWindow *) const override;
|
||||
TabBar *createTabBar(TabWidget *parent) const override;
|
||||
TabWidget *createTabWidget(Frame *parent) const override;
|
||||
Layouting::Separator *createSeparator(Layouting::Widget *parent = nullptr) const override;
|
||||
FloatingWindow *createFloatingWindow(MainWindowBase *parent = nullptr) const override;
|
||||
FloatingWindow *createFloatingWindow(Frame *frame, MainWindowBase *parent = nullptr) const override;
|
||||
@@ -173,8 +179,10 @@ public:
|
||||
|
||||
#ifdef KDDOCKWIDGETS_QTWIDGETS
|
||||
QAbstractButton* createTitleBarButton(QWidget *parent, TitleBarButtonType) const override;
|
||||
TabWidget *createTabWidget(Frame *parent) const override;
|
||||
#else
|
||||
QUrl titleBarFilename() const override;
|
||||
TabWidgetQuick *createTabWidget(Frame *parent) const override;
|
||||
#endif
|
||||
|
||||
QIcon iconForButtonType(TitleBarButtonType type, qreal dpr) const override;
|
||||
|
||||
@@ -150,6 +150,11 @@ void TabWidget::setCurrentDockWidget(DockWidgetBase *dw)
|
||||
setCurrentDockWidget(indexOfDockWidget(dw));
|
||||
}
|
||||
|
||||
DockWidgetBase *TabWidget::currentDockWidget() const
|
||||
{
|
||||
return dockwidgetAt(currentIndex());
|
||||
}
|
||||
|
||||
void TabWidget::addDockWidget(DockWidgetBase *dock)
|
||||
{
|
||||
insertDockWidget(dock, numDockWidgets());
|
||||
|
||||
@@ -111,6 +111,9 @@ public:
|
||||
virtual void setCurrentDockWidget(int index) = 0;
|
||||
void setCurrentDockWidget(DockWidgetBase *);
|
||||
|
||||
/// @brief Returns the current dock widget
|
||||
DockWidgetBase *currentDockWidget() const;
|
||||
|
||||
virtual bool insertDockWidget(int index, DockWidgetBase *, const QIcon&, const QString &title) = 0;
|
||||
|
||||
virtual void setTabBarAutoHide(bool) = 0;
|
||||
|
||||
@@ -27,7 +27,7 @@ using namespace KDDockWidgets;
|
||||
|
||||
FrameQuick::FrameQuick(QWidgetAdapter *parent, FrameOptions options)
|
||||
: Frame(parent, options)
|
||||
, m_tabWidget(static_cast<TabWidgetQuick*>(Config::self().frameworkWidgetFactory()->createTabWidget(this)))
|
||||
, m_tabWidget(Config::self().frameworkWidgetFactory()->createTabWidget(this))
|
||||
{
|
||||
connect(m_tabWidget, &TabWidgetQuick::countChanged,
|
||||
this, &FrameQuick::onDockWidgetCountChanged);
|
||||
@@ -108,7 +108,7 @@ void FrameQuick::setCurrentTabIndex_impl(int index)
|
||||
|
||||
void FrameQuick::setCurrentDockWidget_impl(DockWidgetBase *dw)
|
||||
{
|
||||
m_tabWidget->setCurrentDockWidget(dw);
|
||||
m_tabWidget->TabWidget::setCurrentDockWidget(dw);
|
||||
}
|
||||
|
||||
void FrameQuick::insertDockWidget_impl(DockWidgetBase *dw, int index)
|
||||
@@ -184,114 +184,3 @@ int FrameQuick::nonContentsHeight() const
|
||||
{
|
||||
return m_visualItem->property("nonContentsHeight").toInt();
|
||||
}
|
||||
|
||||
DockWidgetModel::DockWidgetModel(QObject *parent)
|
||||
: QAbstractListModel(parent)
|
||||
{
|
||||
}
|
||||
|
||||
int DockWidgetModel::count() const
|
||||
{
|
||||
return m_dockWidgets.size();
|
||||
}
|
||||
|
||||
int DockWidgetModel::rowCount(const QModelIndex &parent) const
|
||||
{
|
||||
return parent.isValid() ? 0 : m_dockWidgets.size();
|
||||
}
|
||||
|
||||
QVariant DockWidgetModel::data(const QModelIndex &index, int role) const
|
||||
{
|
||||
const int row = index.row();
|
||||
if (row < 0 || row >= m_dockWidgets.size())
|
||||
return {};
|
||||
|
||||
DockWidgetBase *dw = m_dockWidgets.at(row);
|
||||
|
||||
switch (role) {
|
||||
case Role_Title:
|
||||
return dw->title();
|
||||
}
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
DockWidgetBase *DockWidgetModel::dockWidgetAt(int index) const
|
||||
{
|
||||
if (index < 0 || index >= m_dockWidgets.size()) {
|
||||
// Can happen. Benign.
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return m_dockWidgets[index];
|
||||
}
|
||||
|
||||
bool DockWidgetModel::contains(DockWidgetBase *dw) const
|
||||
{
|
||||
return m_dockWidgets.contains(dw);
|
||||
}
|
||||
|
||||
QHash<int, QByteArray> DockWidgetModel::roleNames() const
|
||||
{
|
||||
return { {Role_Title, "title"} };
|
||||
}
|
||||
|
||||
void DockWidgetModel::emitDataChangedFor(DockWidgetBase *dw)
|
||||
{
|
||||
const int row = indexOf(dw);
|
||||
if (row == -1) {
|
||||
qWarning() << Q_FUNC_INFO << "Couldn't find" << dw;
|
||||
} else {
|
||||
QModelIndex index = this->index(row, 0);
|
||||
Q_EMIT dataChanged(index, index);
|
||||
}
|
||||
}
|
||||
|
||||
void DockWidgetModel::remove(DockWidgetBase *dw)
|
||||
{
|
||||
const int row = indexOf(dw);
|
||||
if (row == -1) {
|
||||
qWarning() << Q_FUNC_INFO << "Nothing to remove"
|
||||
<< static_cast<void*>(dw); // Print address only, as it might be deleted already
|
||||
} else {
|
||||
const auto connections = m_connections.take(dw);
|
||||
for (QMetaObject::Connection conn : connections)
|
||||
disconnect(conn);
|
||||
|
||||
beginRemoveRows(QModelIndex(), row, row);
|
||||
m_dockWidgets.removeOne(dw);
|
||||
endRemoveRows();
|
||||
|
||||
Q_EMIT countChanged();
|
||||
}
|
||||
}
|
||||
|
||||
int DockWidgetModel::indexOf(DockWidgetBase *dw)
|
||||
{
|
||||
return m_dockWidgets.indexOf(dw);
|
||||
}
|
||||
|
||||
bool DockWidgetModel::insert(DockWidgetBase *dw, int index)
|
||||
{
|
||||
if (m_dockWidgets.contains(dw)) {
|
||||
qWarning() << Q_FUNC_INFO << "Shouldn't happen";
|
||||
return false;
|
||||
}
|
||||
|
||||
QMetaObject::Connection conn = connect(dw, &DockWidgetBase::titleChanged, this, [dw, this] {
|
||||
emitDataChangedFor(dw);
|
||||
});
|
||||
|
||||
QMetaObject::Connection conn2 = connect(dw, &QObject::destroyed, this, [dw, this] {
|
||||
remove(dw);
|
||||
});
|
||||
|
||||
m_connections[dw] = { conn, conn2 };
|
||||
|
||||
beginInsertRows(QModelIndex(), index, index);
|
||||
m_dockWidgets.insert(index, dw);
|
||||
endInsertRows();
|
||||
|
||||
Q_EMIT countChanged();
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -30,6 +30,7 @@ class DOCKS_EXPORT FrameQuick : public Frame
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_PROPERTY(DockWidgetModel* dockWidgetModel READ dockWidgetModel CONSTANT)
|
||||
//Q_PROPERTY(TabWidget* tabWidget READ tabWidget CONSTANT)
|
||||
public:
|
||||
explicit FrameQuick(QWidgetAdapter *parent = nullptr, FrameOptions = FrameOption::FrameOption_None);
|
||||
~FrameQuick() override;
|
||||
|
||||
@@ -56,15 +56,7 @@ bool TabWidgetQuick::isPositionDraggable(QPoint p) const
|
||||
|
||||
void TabWidgetQuick::setCurrentDockWidget(int index)
|
||||
{
|
||||
setCurrentDockWidget(dockwidgetAt(index));
|
||||
}
|
||||
|
||||
void TabWidgetQuick::setCurrentDockWidget(DockWidgetBase *dw)
|
||||
{
|
||||
if (dw && !containsDockWidget(dw)) {
|
||||
qWarning() << Q_FUNC_INFO << "Shouldn't happen";
|
||||
return;
|
||||
}
|
||||
DockWidgetBase *dw = dockwidgetAt(index);
|
||||
|
||||
if (m_currentDockWidget != dw) {
|
||||
m_currentDockWidget = dw;
|
||||
@@ -72,16 +64,6 @@ void TabWidgetQuick::setCurrentDockWidget(DockWidgetBase *dw)
|
||||
}
|
||||
}
|
||||
|
||||
bool TabWidgetQuick::containsDockWidget(DockWidgetBase *dw) const
|
||||
{
|
||||
return m_dockWidgetModel->contains(dw);
|
||||
}
|
||||
|
||||
DockWidgetBase *TabWidgetQuick::currentDockWidget() const
|
||||
{
|
||||
return m_currentDockWidget;
|
||||
}
|
||||
|
||||
bool TabWidgetQuick::insertDockWidget(int index, DockWidgetBase *dw, const QIcon &, const QString &title)
|
||||
{
|
||||
Q_UNUSED(title); // todo
|
||||
@@ -116,3 +98,114 @@ DockWidgetModel *TabWidgetQuick::dockWidgetModel() const
|
||||
{
|
||||
return m_dockWidgetModel;
|
||||
}
|
||||
|
||||
DockWidgetModel::DockWidgetModel(QObject *parent)
|
||||
: QAbstractListModel(parent)
|
||||
{
|
||||
}
|
||||
|
||||
int DockWidgetModel::count() const
|
||||
{
|
||||
return m_dockWidgets.size();
|
||||
}
|
||||
|
||||
int DockWidgetModel::rowCount(const QModelIndex &parent) const
|
||||
{
|
||||
return parent.isValid() ? 0 : m_dockWidgets.size();
|
||||
}
|
||||
|
||||
QVariant DockWidgetModel::data(const QModelIndex &index, int role) const
|
||||
{
|
||||
const int row = index.row();
|
||||
if (row < 0 || row >= m_dockWidgets.size())
|
||||
return {};
|
||||
|
||||
DockWidgetBase *dw = m_dockWidgets.at(row);
|
||||
|
||||
switch (role) {
|
||||
case Role_Title:
|
||||
return dw->title();
|
||||
}
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
DockWidgetBase *DockWidgetModel::dockWidgetAt(int index) const
|
||||
{
|
||||
if (index < 0 || index >= m_dockWidgets.size()) {
|
||||
// Can happen. Benign.
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return m_dockWidgets[index];
|
||||
}
|
||||
|
||||
bool DockWidgetModel::contains(DockWidgetBase *dw) const
|
||||
{
|
||||
return m_dockWidgets.contains(dw);
|
||||
}
|
||||
|
||||
QHash<int, QByteArray> DockWidgetModel::roleNames() const
|
||||
{
|
||||
return { {Role_Title, "title"} };
|
||||
}
|
||||
|
||||
void DockWidgetModel::emitDataChangedFor(DockWidgetBase *dw)
|
||||
{
|
||||
const int row = indexOf(dw);
|
||||
if (row == -1) {
|
||||
qWarning() << Q_FUNC_INFO << "Couldn't find" << dw;
|
||||
} else {
|
||||
QModelIndex index = this->index(row, 0);
|
||||
Q_EMIT dataChanged(index, index);
|
||||
}
|
||||
}
|
||||
|
||||
void DockWidgetModel::remove(DockWidgetBase *dw)
|
||||
{
|
||||
const int row = indexOf(dw);
|
||||
if (row == -1) {
|
||||
qWarning() << Q_FUNC_INFO << "Nothing to remove"
|
||||
<< static_cast<void*>(dw); // Print address only, as it might be deleted already
|
||||
} else {
|
||||
const auto connections = m_connections.take(dw);
|
||||
for (QMetaObject::Connection conn : connections)
|
||||
disconnect(conn);
|
||||
|
||||
beginRemoveRows(QModelIndex(), row, row);
|
||||
m_dockWidgets.removeOne(dw);
|
||||
endRemoveRows();
|
||||
|
||||
Q_EMIT countChanged();
|
||||
}
|
||||
}
|
||||
|
||||
int DockWidgetModel::indexOf(DockWidgetBase *dw)
|
||||
{
|
||||
return m_dockWidgets.indexOf(dw);
|
||||
}
|
||||
|
||||
bool DockWidgetModel::insert(DockWidgetBase *dw, int index)
|
||||
{
|
||||
if (m_dockWidgets.contains(dw)) {
|
||||
qWarning() << Q_FUNC_INFO << "Shouldn't happen";
|
||||
return false;
|
||||
}
|
||||
|
||||
QMetaObject::Connection conn = connect(dw, &DockWidgetBase::titleChanged, this, [dw, this] {
|
||||
emitDataChangedFor(dw);
|
||||
});
|
||||
|
||||
QMetaObject::Connection conn2 = connect(dw, &QObject::destroyed, this, [dw, this] {
|
||||
remove(dw);
|
||||
});
|
||||
|
||||
m_connections[dw] = { conn, conn2 };
|
||||
|
||||
beginInsertRows(QModelIndex(), index, index);
|
||||
m_dockWidgets.insert(index, dw);
|
||||
endInsertRows();
|
||||
|
||||
Q_EMIT countChanged();
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -49,9 +49,7 @@ public:
|
||||
int currentIndex() const override;
|
||||
bool insertDockWidget(int index, DockWidgetBase *, const QIcon&, const QString &title) override;
|
||||
void setCurrentDockWidget(int index) override;
|
||||
void setCurrentDockWidget(DockWidgetBase *);
|
||||
bool containsDockWidget(DockWidgetBase *) const;
|
||||
DockWidgetBase *currentDockWidget() const;
|
||||
|
||||
protected:
|
||||
bool isPositionDraggable(QPoint p) const override;
|
||||
void setTabBarAutoHide(bool) override;
|
||||
|
||||
@@ -33,7 +33,9 @@ namespace KDDockWidgets {
|
||||
class DockWidget;
|
||||
class TabWidget;
|
||||
|
||||
class DOCKS_EXPORT TabBarWidget : public QTabBar, public TabBar
|
||||
class DOCKS_EXPORT TabBarWidget
|
||||
: public QTabBar
|
||||
, public TabBar
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
|
||||
Reference in New Issue
Block a user