qtquick: Ported TabWidget to the new architecture
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user