qtquick: Remove old TabWidgetQuick

This commit is contained in:
Sergio Martins
2022-05-06 18:50:43 +01:00
parent 16cca5a719
commit 7ba5d1de3b
2 changed files with 0 additions and 354 deletions

View File

@@ -1,243 +0,0 @@
/*
This file is part of KDDockWidgets.
SPDX-FileCopyrightText: 2019-2022 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
Author: Sérgio Martins <sergio.martins@kdab.com>
SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only
Contact KDAB at <info@kdab.com> for commercial licensing options.
*/
#include "TabWidgetQuick_p.h"
#include "Config.h"
#include "FrameworkWidgetFactory.h"
#include "../Frame_p.h"
#include <QDebug>
#include <QScopedValueRollback>
using namespace KDDockWidgets;
TabWidgetQuick::TabWidgetQuick(Frame *parent)
: QWidgetAdapter(parent)
, TabWidget(this, parent)
, m_dockWidgetModel(new DockWidgetModel(this))
, m_tabBar(Config::self().frameworkWidgetFactory()->createTabBar(this))
{
connect(m_dockWidgetModel, &DockWidgetModel::countChanged, this,
[this] {
if (m_currentDockWidget && indexOfDockWidget(m_currentDockWidget) == -1) {
// The current dock widget was removed, set the first one as current
if (numDockWidgets() > 0)
setCurrentDockWidget(0);
}
Q_EMIT countChanged(); });
}
TabBar *TabWidgetQuick::tabBar() const
{
return m_tabBar;
}
int TabWidgetQuick::numDockWidgets() const
{
return m_dockWidgetModel->count();
}
void TabWidgetQuick::removeDockWidget(DockWidgetBase *dw)
{
m_dockWidgetModel->remove(dw);
}
int TabWidgetQuick::indexOfDockWidget(const DockWidgetBase *dw) const
{
return m_dockWidgetModel->indexOf(dw);
}
bool TabWidgetQuick::isPositionDraggable(QPoint p) const
{
Q_UNUSED(p);
return true;
}
void TabWidgetQuick::setCurrentDockWidget(int index)
{
DockWidgetBase *dw = dockwidgetAt(index);
if (m_currentDockWidget != dw) {
m_currentDockWidget = dw;
Q_EMIT currentDockWidgetChanged(dw);
Q_EMIT currentTabChanged(index);
}
}
QObject *TabWidgetQuick::tabBarObj() const
{
return m_tabBar->asWidget();
}
bool TabWidgetQuick::insertDockWidget(int index, DockWidgetBase *dw, const QIcon &, const QString &title)
{
Q_UNUSED(title); // todo
return m_dockWidgetModel->insert(dw, index);
}
void TabWidgetQuick::setTabBarAutoHide(bool)
{
qWarning() << Q_FUNC_INFO << "Not implemented";
}
void TabWidgetQuick::renameTab(int index, const QString &)
{
Q_UNUSED(index);
qWarning() << Q_FUNC_INFO << "Not implemented";
}
void TabWidgetQuick::changeTabIcon(int index, const QIcon &)
{
Q_UNUSED(index);
qWarning() << Q_FUNC_INFO << "Not implemented";
}
DockWidgetBase *TabWidgetQuick::dockwidgetAt(int index) const
{
return m_dockWidgetModel->dockWidgetAt(index);
}
int TabWidgetQuick::currentIndex() const
{
if (!m_currentDockWidget)
return -1;
const int index = indexOfDockWidget(m_currentDockWidget);
if (index == -1)
qWarning() << Q_FUNC_INFO << "Unexpected null index for" << m_currentDockWidget << this
<< "; count=" << m_dockWidgetModel->count();
return index;
}
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)
{
QScopedValueRollback<bool> guard(m_removeGuard, true);
const int row = indexOf(dw);
if (row == -1) {
if (!m_removeGuard) {
// can happen if there's reentrancy. Some user code reacting
// to the signals and call remove for whatever reason.
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 (const QMetaObject::Connection &conn : connections)
disconnect(conn);
beginRemoveRows(QModelIndex(), row, row);
m_dockWidgets.removeOne(dw);
endRemoveRows();
Q_EMIT countChanged();
}
}
int DockWidgetModel::indexOf(const DockWidgetBase *dw)
{
return m_dockWidgets.indexOf(const_cast<DockWidgetBase *>(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

@@ -1,111 +0,0 @@
/*
This file is part of KDDockWidgets.
SPDX-FileCopyrightText: 2019-2022 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
Author: Sérgio Martins <sergio.martins@kdab.com>
SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only
Contact KDAB at <info@kdab.com> for commercial licensing options.
*/
/**
* @file
* @brief The QQuickItem counter part of TabWidgetQuick. Handles GUI while TabWidget handles state.
*
* @author Sérgio Martins \<sergio.martins@kdab.com\>
*/
#ifndef KDTABWIDGETQUICK_P_H
#define KDTABWIDGETQUICK_P_H
#include "../TabWidget_p.h"
#include "QWidgetAdapter_quick_p.h"
#include <QQuickItem>
#include <QAbstractListModel>
namespace KDDockWidgets {
class Frame;
class TabBar;
class DockWidgetModel;
class DOCKS_EXPORT TabWidgetQuick
: public QWidgetAdapter,
public TabWidget
{
Q_OBJECT
Q_PROPERTY(DockWidgetModel *dockWidgetModel READ dockWidgetModel CONSTANT)
Q_PROPERTY(QObject *tabBar READ tabBarObj CONSTANT)
public:
explicit TabWidgetQuick(Frame *parent);
TabBar *tabBar() const override;
int numDockWidgets() const override;
void removeDockWidget(DockWidgetBase *) override;
int indexOfDockWidget(const DockWidgetBase *) const override;
DockWidgetModel *dockWidgetModel() const;
DockWidgetBase *dockwidgetAt(int index) const override;
int currentIndex() const override;
bool insertDockWidget(int index, DockWidgetBase *, const QIcon &, const QString &title) override;
Q_INVOKABLE void setCurrentDockWidget(int index) override;
/// @brief Returns the tab bar as a QObject for QML.
/// As the base class is not a QObject.
QObject *tabBarObj() const;
Q_SIGNALS:
void currentTabChanged(int index) override;
void currentDockWidgetChanged(KDDockWidgets::DockWidgetBase *dw) override;
void countChanged() override;
protected:
bool isPositionDraggable(QPoint p) const override;
void setTabBarAutoHide(bool) override;
void renameTab(int index, const QString &) override;
void changeTabIcon(int index, const QIcon &) override;
private:
Q_DISABLE_COPY(TabWidgetQuick)
DockWidgetModel *const m_dockWidgetModel;
TabBar *const m_tabBar;
DockWidgetBase *m_currentDockWidget = nullptr;
};
class DockWidgetModel : public QAbstractListModel
{
Q_OBJECT
public:
enum Role
{
Role_Title = Qt::UserRole
};
explicit DockWidgetModel(QObject *parent);
int count() const;
int rowCount(const QModelIndex &parent) const override;
QVariant data(const QModelIndex &index, int role) const override;
DockWidgetBase *dockWidgetAt(int index) const;
void remove(DockWidgetBase *);
int indexOf(const DockWidgetBase *);
bool insert(DockWidgetBase *dw, int index);
bool contains(DockWidgetBase *dw) const;
protected:
QHash<int, QByteArray> roleNames() const override;
Q_SIGNALS:
void countChanged();
private:
void emitDataChangedFor(DockWidgetBase *);
DockWidgetBase::List m_dockWidgets;
QHash<DockWidgetBase *, QVector<QMetaObject::Connection>> m_connections; // To make it easy to disconnect from lambdas
bool m_removeGuard = false;
};
}
#endif