qtquick: Ported TabWidget to the new architecture

This commit is contained in:
Sergio Martins
2022-05-04 22:18:34 +01:00
parent d6f56169e1
commit 9d5c7bfc53
5 changed files with 298 additions and 246 deletions

View File

@@ -9,72 +9,111 @@
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
#pragma once
#include "View_qtquick.h"
#include "views/Stack.h"
#include "controllers/DockWidget.h"
#include <QTabWidget>
QT_BEGIN_NAMESPACE
class QAbstractButton;
class QHBoxLayout;
QT_END_NAMESPACE
namespace KDDockWidgets::Controllers {
class Stack;
class Frame;
}
#include <QAbstractListModel>
namespace KDDockWidgets {
namespace Controllers {
class Frame;
class TabBar;
}
namespace Views {
class DOCKS_EXPORT Stack_qtquick : public View_qtquick<QQuickItem>, public Stack
class DockWidgetModel;
class DOCKS_EXPORT Stack_qtquick
: public View_qtquick,
public Stack
{
Q_OBJECT
Q_PROPERTY(DockWidgetModel *dockWidgetModel READ dockWidgetModel CONSTANT)
Q_PROPERTY(QObject *tabBar READ tabBarObj CONSTANT)
public:
explicit Stack_qtquick(Controllers::Stack *controller,
Controllers::Frame *parent = nullptr);
Controllers::Frame *parent = nullptr);
Controllers::Stack *stack() const;
QTabBar *tabBar() const;
// TabBar *tabBar() const override;
int numDockWidgets() const override;
void removeDockWidget(Controllers::DockWidget *) override;
int indexOfDockWidget(const Controllers::DockWidget *) const override;
bool isPositionDraggable(QPoint p) const override;
void init() override;
public: // TODO: make protected
void mouseDoubleClickEvent(QMouseEvent *) override;
void mousePressEvent(QMouseEvent *) override;
void tabInserted(int index) override;
void tabRemoved(int index) override;
void setCurrentDockWidget(int index) override;
DockWidgetModel *dockWidgetModel() const;
Controllers::DockWidget *dockwidgetAt(int index) const override;
int currentIndex() const override;
bool insertDockWidget(int index, Controllers::DockWidget *, 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: // TODOv2: Review these signals
void currentTabChanged(int index);
void currentDockWidgetChanged(KDDockWidgets::Controllers::DockWidget *dw);
void countChanged();
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;
Controllers::DockWidget *dockwidgetAt(int index) const override;
int currentIndex() const override;
/// @brief Shows the context menu. Override to implement your own context menu.
/// By default it's used to honour Config::Flag_AllowSwitchingTabsViaMenu
virtual void showContextMenu(QPoint pos);
private:
void updateMargins();
void setupTabBarButtons();
QHBoxLayout *m_cornerWidgetLayout = nullptr;
QAbstractButton *m_floatButton = nullptr;
QAbstractButton *m_closeButton = nullptr;
Controllers::Stack *const m_stack;
Q_DISABLE_COPY(Stack_qtquick)
DockWidgetModel *const m_dockWidgetModel;
// TabBar *const m_tabBar;
Controllers::Stack *const m_stack;
Controllers::DockWidget *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;
Controllers::DockWidget *dockWidgetAt(int index) const;
void remove(Controllers::DockWidget *);
int indexOf(const Controllers::DockWidget *);
bool insert(Controllers::DockWidget *dw, int index);
bool contains(Controllers::DockWidget *dw) const;
protected:
QHash<int, QByteArray> roleNames() const override;
Q_SIGNALS:
void countChanged();
private:
void emitDataChangedFor(Controllers::DockWidget *);
Controllers::DockWidget::List m_dockWidgets;
QHash<Controllers::DockWidget *, QVector<QMetaObject::Connection>> m_connections; // To make it easy to disconnect from lambdas
bool m_removeGuard = false;
};
}
}
#endif