Added TabBar view interface

Removes some dependencies to QtWidget
This commit is contained in:
Sergio Martins
2022-04-02 22:38:33 +01:00
parent 5681a5a231
commit f2aaf65674
6 changed files with 73 additions and 29 deletions

View File

@@ -43,12 +43,6 @@ class DropArea;
class TabBar;
class TabWidgetQuick;
namespace Views {
class Separator;
class TitleBar;
class TabBar;
}
namespace Controllers {
class Separator;
class TabBar;

View File

@@ -14,15 +14,18 @@
#include "Controller.h"
#include "controllers/Stack.h"
#include "controllers/FloatingWindow.h"
#include "views_qtwidgets/TabBar_qtwidgets.h"
#include "views/TabBar.h"
#include "private/DragController_p.h"
#include "private/Utils_p.h"
#include "Config.h"
#include "FrameworkWidgetFactory.h"
using namespace KDDockWidgets;
using namespace KDDockWidgets::Controllers;
Controllers::TabBar::TabBar(Stack *tabWidget)
: Controller(Type::TabBar, new Views::TabBar_qtwidgets(this, tabWidget->view()->asQWidget())) // TODO: Config::self().frameworkWidgetFactory()->createTabBar(this)
: Controller(Type::TabBar, Config::self().frameworkWidgetFactory()->createTabBar(this, tabWidget->view()))
, Draggable(view())
, m_tabWidget(tabWidget)
{
@@ -32,22 +35,26 @@ Controllers::TabBar::~TabBar()
{
}
bool Controllers::TabBar::tabsAreMovable() const
{
return dynamic_cast<Views::TabBar *>(view())->tabsAreMovable();
}
bool Controllers::TabBar::dragCanStart(QPoint pressPos, QPoint pos) const
{
// Here we allow the user to re-order tabs instead of dragging them off.
// To do that we just return false here, and QTabBar will handle the mouse event, assuming QTabBar::isMovable.
const bool defaultResult = Draggable::dragCanStart(pressPos, pos);
auto view = static_cast<Views::TabBar_qtwidgets *>(this->view()); // TODO
if (!defaultResult || !view->isMovable()) {
if (!defaultResult || !tabsAreMovable()) {
// Nothing more to do. If the drag wouldn't start anyway, return false.
// And if the tabs aren't movable, just return the default result, which just considers
// QApplication::startDragDistances
return defaultResult;
}
const int index = view->tabAt(view->mapFromGlobal(pos));
const int index = dynamic_cast<Views::TabBar *>(view())->tabAt(view()->mapFromGlobal(pos));
if (index == -1)
return defaultResult;
@@ -76,7 +83,7 @@ DockWidgetBase *Controllers::TabBar::dockWidgetAt(int index) const
DockWidgetBase *Controllers::TabBar::dockWidgetAt(QPoint localPos) const
{
return dockWidgetAt(static_cast<Views::TabBar_qtwidgets *>(view())->tabAt(localPos));
return dockWidgetAt(dynamic_cast<Views::TabBar *>(view())->tabAt(localPos));
}
std::unique_ptr<WindowBeingDragged> Controllers::TabBar::makeWindow()
@@ -169,27 +176,20 @@ Frame *Controllers::TabBar::frame() const
void Controllers::TabBar::moveTabTo(int from, int to)
{
auto view = static_cast<Views::TabBar_qtwidgets *>(this->view()); // TODO
view->moveTabTo(from, to);
dynamic_cast<Views::TabBar *>(view())->moveTabTo(from, to);
}
QString Controllers::TabBar::text(int index) const
{
// TODO: We can store the text in the controller
auto view = static_cast<Views::TabBar_qtwidgets *>(this->view()); // TODO
return view->text(index);
return dynamic_cast<Views::TabBar *>(view())->text(index);
}
QRect Controllers::TabBar::rectForTab(int index) const
{
auto view = static_cast<Views::TabBar_qtwidgets *>(this->view()); // TODO
return view->rectForTab(index);
return dynamic_cast<Views::TabBar *>(view())->rectForTab(index);
}
DockWidget *Controllers::TabBar::currentDockWidget() const
{
auto view = static_cast<Views::TabBar_qtwidgets *>(this->view()); // TODO
return view->currentDockWidget();
return dynamic_cast<Views::TabBar *>(view())->currentDockWidget();
}

View File

@@ -56,6 +56,8 @@ public:
int numDockWidgets() const;
bool tabsAreMovable() const;
/**
* @brief Returns this class as a QWidget (if using QtWidgets) or QQuickItem
*/

40
src/views/TabBar.h Normal file
View File

@@ -0,0 +1,40 @@
/*
This file is part of KDDockWidgets.
SPDX-FileCopyrightText: 2020-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.
*/
#pragma once
class QPoint;
class QRect;
class QString;
namespace KDDockWidgets {
namespace Controllers {
class DockWidget;
}
namespace Views {
/// @brief The interface that TabBar views should implement
class TabBar
{
public:
virtual bool tabsAreMovable() const = 0;
virtual int tabAt(QPoint localPt) const = 0;
virtual void moveTabTo(int from, int to) = 0;
virtual QRect rectForTab(int index) const = 0;
virtual Controllers::DockWidget *currentDockWidget() const = 0;
virtual QString text(int index) const = 0;
};
}
}

View File

@@ -124,3 +124,8 @@ void TabBar_qtwidgets::moveTabTo(int from, int to)
{
moveTab(from, to);
}
bool TabBar_qtwidgets::tabsAreMovable() const
{
return isMovable();
}

View File

@@ -12,6 +12,7 @@
#pragma once
#include "View_qtwidgets.h"
#include "views/TabBar.h"
#include <QTabBar>
@@ -26,20 +27,22 @@ class DockWidget;
namespace KDDockWidgets::Views {
class DOCKS_EXPORT TabBar_qtwidgets : public View_qtwidgets<QTabBar>
class DOCKS_EXPORT TabBar_qtwidgets : public View_qtwidgets<QTabBar>, public TabBar
{
Q_OBJECT
public:
explicit TabBar_qtwidgets(Controllers::TabBar *controller, QWidget *parent = nullptr);
Controllers::TabBar *tabBar() const;
int tabAt(QPoint localPos) const;
Controllers::DockWidget *currentDockWidget() const;
Controllers::DockWidget *currentDockWidget() const override;
QString text(int index) const;
QRect rectForTab(int index) const;
void moveTabTo(int from, int to);
QString text(int index) const override;
QRect rectForTab(int index) const override;
void moveTabTo(int from, int to) override;
bool tabsAreMovable() const override;
int tabAt(QPoint localPos) const override;
protected:
void mousePressEvent(QMouseEvent *) override;