Remove some methods from TabWidgetQuick

Reuse more from base class.
This commit is contained in:
Sergio Martins
2020-12-20 13:19:07 +00:00
parent 8b98dafba2
commit 6e0898a31e
9 changed files with 142 additions and 143 deletions

View File

@@ -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);
}

View File

@@ -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;

View File

@@ -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());

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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: