qtquick: Don't overload Q_INVOKABLES

Apparently QML doesn't support it very well.

Fixes #291
This commit is contained in:
Sergio Martins
2022-06-19 20:11:33 +01:00
parent 9072555814
commit da70b1baed
7 changed files with 67 additions and 57 deletions

View File

@@ -109,6 +109,13 @@ ApplicationWindow {
color: "black"
}
}
KDDW.DockWidget {
id: dock7
uniqueName: "dock7"
Rectangle {
color: "green"
}
}
Component.onCompleted: {
// Add dock4 to the Bottom location
@@ -122,6 +129,10 @@ ApplicationWindow {
// See MainWindowInstantiator_p.h for the API
addDockWidget(dock6, KDDW.KDDockWidgets.Location_OnLeft, null,
Qt.size(500, 100), KDDW.KDDockWidgets.StartHidden);
// dock7 will be tabbed with dock7:
dock5.addDockWidgetAsTab(dock7);
}
}

View File

@@ -14,6 +14,8 @@
#include "kddockwidgets/controllers/DockWidget.h"
#include "ViewFactory_qtquick.h"
#include "Config.h"
#include "Platform_qtquick.h"
#include "controllers/DockWidget.h"
using namespace KDDockWidgets;
@@ -91,41 +93,31 @@ void DockWidgetInstantiator::setFloating(bool is)
m_isFloating = is;
}
void DockWidgetInstantiator::addDockWidgetAsTab(DockWidgetInstantiator *other,
void DockWidgetInstantiator::addDockWidgetAsTab(QQuickItem *other,
InitialVisibilityOption option)
{
if (m_dockWidget)
m_dockWidget->addDockWidgetAsTab(other ? other->controller() : nullptr, option);
if (!other || !m_dockWidget)
return;
Controllers::DockWidget *otherDockWidget = Platform_qtquick::dockWidgetForItem(other);
m_dockWidget->addDockWidgetAsTab(otherDockWidget, option);
}
void DockWidgetInstantiator::addDockWidgetAsTab(Controllers::DockWidget *other,
InitialVisibilityOption option)
{
if (m_dockWidget)
m_dockWidget->addDockWidgetAsTab(other, option);
}
void DockWidgetInstantiator::addDockWidgetToContainingWindow(Controllers::DockWidget *other,
void DockWidgetInstantiator::addDockWidgetToContainingWindow(QQuickItem *other,
Location location,
Controllers::DockWidget *relativeTo,
QQuickItem *relativeTo,
QSize initialSize,
InitialVisibilityOption option)
{
if (m_dockWidget)
m_dockWidget->addDockWidgetToContainingWindow(other, location, relativeTo,
InitialOption(option, initialSize));
}
if (!other || !m_dockWidget)
return;
void DockWidgetInstantiator::addDockWidgetToContainingWindow(DockWidgetInstantiator *other,
Location location,
DockWidgetInstantiator *relativeTo,
QSize initialSize,
InitialVisibilityOption option)
{
if (m_dockWidget)
m_dockWidget->addDockWidgetToContainingWindow(
other ? other->controller() : nullptr, location,
relativeTo ? relativeTo->controller() : nullptr, InitialOption(option, initialSize));
Controllers::DockWidget *otherDockWidget = Platform_qtquick::dockWidgetForItem(other);
Controllers::DockWidget *relativeToDockWidget = Platform_qtquick::dockWidgetForItem(relativeTo);
m_dockWidget->addDockWidgetToContainingWindow(
otherDockWidget, location,
relativeToDockWidget, InitialOption(option, initialSize));
}
void DockWidgetInstantiator::setAsCurrentTab()

View File

@@ -60,20 +60,12 @@ public:
bool isFloating() const;
void setFloating(bool);
Q_INVOKABLE void addDockWidgetAsTab(KDDockWidgets::DockWidgetInstantiator *other,
KDDockWidgets::InitialVisibilityOption = {});
Q_INVOKABLE void addDockWidgetAsTab(KDDockWidgets::Controllers::DockWidget *other,
Q_INVOKABLE void addDockWidgetAsTab(QQuickItem *other,
KDDockWidgets::InitialVisibilityOption = {});
Q_INVOKABLE void addDockWidgetToContainingWindow(KDDockWidgets::Controllers::DockWidget *other,
Q_INVOKABLE void addDockWidgetToContainingWindow(QQuickItem *other,
KDDockWidgets::Location location,
KDDockWidgets::Controllers::DockWidget *relativeTo = nullptr,
QSize initialSize = {},
KDDockWidgets::InitialVisibilityOption = {});
Q_INVOKABLE void addDockWidgetToContainingWindow(KDDockWidgets::DockWidgetInstantiator *other,
KDDockWidgets::Location location,
KDDockWidgets::DockWidgetInstantiator *relativeTo = nullptr,
QQuickItem *relativeTo = nullptr,
QSize initialSize = {},
KDDockWidgets::InitialVisibilityOption = {});

View File

@@ -18,6 +18,7 @@
#include "DockWidgetInstantiator.h"
#include "DockRegistry.h"
#include "Platform_qtquick.h"
using namespace KDDockWidgets;
@@ -62,24 +63,18 @@ bool MainWindowInstantiator::isMDI() const
return m_mainWindow && m_mainWindow->isMDI();
}
void MainWindowInstantiator::addDockWidget(Controllers::DockWidget *dockWidget, Location location,
Controllers::DockWidget *relativeTo, QSize initialSize,
void MainWindowInstantiator::addDockWidget(QQuickItem *dockWidget, Location location,
QQuickItem *relativeTo, QSize initialSize,
InitialVisibilityOption option)
{
if (!m_mainWindow) {
qWarning() << Q_FUNC_INFO << "No MainWindow created yet";
if (!dockWidget || !m_mainWindow)
return;
}
m_mainWindow->addDockWidget(dockWidget, location, relativeTo, { option, initialSize });
}
Controllers::DockWidget *dw = Platform_qtquick::dockWidgetForItem(dockWidget);
Controllers::DockWidget *relativeToDw = Platform_qtquick::dockWidgetForItem(relativeTo);
void MainWindowInstantiator::addDockWidget(DockWidgetInstantiator *dockWidget, Location location,
DockWidgetInstantiator *relativeTo, QSize initialSize,
InitialVisibilityOption option)
{
addDockWidget(dockWidget ? dockWidget->controller() : nullptr, location,
relativeTo ? relativeTo->controller() : nullptr, initialSize, option);
m_mainWindow->addDockWidget(dw, location,
relativeToDw, { option, initialSize });
}
void MainWindowInstantiator::layoutEqually()

View File

@@ -53,14 +53,9 @@ public:
bool isMDI() const;
/// @brief See KDDockWidgets::MainWindowBase::addDockWidget()
Q_INVOKABLE void addDockWidget(KDDockWidgets::Controllers::DockWidget *dockWidget,
Q_INVOKABLE void addDockWidget(QQuickItem *dockWidget,
KDDockWidgets::Location location,
KDDockWidgets::Controllers::DockWidget *relativeTo = nullptr,
QSize initialSize = {}, KDDockWidgets::InitialVisibilityOption = {});
Q_INVOKABLE void addDockWidget(KDDockWidgets::DockWidgetInstantiator *dockWidget,
KDDockWidgets::Location location,
KDDockWidgets::DockWidgetInstantiator *relativeTo = nullptr,
QQuickItem *relativeTo = nullptr,
QSize initialSize = {}, KDDockWidgets::InitialVisibilityOption = {});
Q_INVOKABLE void layoutEqually();

View File

@@ -23,6 +23,9 @@
#include "private/Platform_p.h"
#include "ViewFactory_qtquick.h"
#include "views/DockWidget_qtquick.h"
#include "DockWidgetInstantiator.h"
#include <QQmlEngine>
#include <QQuickStyle>
#include <QQuickWindow>
@@ -219,3 +222,18 @@ void Platform_qtquick::ungrabMouse()
}
}
}
Controllers::DockWidget *Platform_qtquick::dockWidgetForItem(QQuickItem *item)
{
if (!item)
return nullptr;
if (auto dwView = qobject_cast<Views::DockWidget_qtquick *>(item))
return dwView->dockWidget();
if (auto dwi = qobject_cast<DockWidgetInstantiator *>(item))
if (auto view = dwi->dockWidget())
return view->dockWidget();
return nullptr;
}

View File

@@ -15,12 +15,17 @@
#include "kddockwidgets/Platform_qt.h"
class QQmlEngine;
class QQuickItem;
namespace KDDockWidgets {
class QtQuickHelpers;
class ViewFactory_qtquick;
namespace Controllers {
class DockWidget;
}
/// @brief implements functions specific to a particular platform
/// A platform can be for example qtwidgets, qtquick, etc.
class DOCKS_EXPORT Platform_qtquick : public Platform_qt
@@ -45,6 +50,8 @@ public:
void ungrabMouse() override;
static Platform_qtquick *instance();
static Controllers::DockWidget *dockWidgetForItem(QQuickItem *);
#ifdef DOCKS_DEVELOPER_MODE
explicit Platform_qtquick(int &argc, char **argv);
void tests_initPlatform_impl() override;