diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index c00fddb9..b6976c25 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -196,6 +196,8 @@ set(KDDW_QTQUICK_FRONTEND_SRCS qtquick/Platform_qtquick.h qtquick/views/View_qtquick.cpp qtquick/views/View_qtquick.h + qtquick/views/ViewWrapper_qtquick.cpp + qtquick/views/ViewWrapper_qtquick.h ) if(${PROJECT_NAME}_QTQUICK) @@ -293,7 +295,7 @@ set(RESOURCES ${CMAKE_CURRENT_SOURCE_DIR}/kddockwidgets_resources.qrc) add_library(kddockwidgets ${KDDockWidgets_LIBRARY_MODE} ${DOCKSLIBS_SRCS} ${DOCKS_INSTALLABLE_INCLUDES} ${RESOURCES}) -add_library(kddockwidgets_qtquick ${KDDW_QTQUICK_FRONTEND_SRCS}) +add_library(kddockwidgets_qtquick STATIC ${KDDW_QTQUICK_FRONTEND_SRCS}) add_library(KDAB::kddockwidgets ALIAS kddockwidgets) set_target_properties(kddockwidgets PROPERTIES OUTPUT_NAME "kddockwidgets${KDDockWidgets_LIBRARY_QTID}") @@ -315,6 +317,15 @@ target_include_directories(kddockwidgets ${CMAKE_CURRENT_SOURCE_DIR} ) +target_include_directories(kddockwidgets_qtquick + PUBLIC + $ + $ + $ # TODO: Link to KDBindings instead + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} +) + target_compile_definitions(kddockwidgets PRIVATE QT_NO_CAST_TO_ASCII diff --git a/src/qtquick/views/ViewWrapper_qtquick.cpp b/src/qtquick/views/ViewWrapper_qtquick.cpp index 9c74c3fa..486bda50 100644 --- a/src/qtquick/views/ViewWrapper_qtquick.cpp +++ b/src/qtquick/views/ViewWrapper_qtquick.cpp @@ -9,16 +9,16 @@ Contact KDAB at for commercial licensing options. */ -#include "ViewWrapper_qtwidgets.h" -#include "qtwidgets/views/DockWidget_qtwidgets.h" -#include "qtwidgets/views/FloatingWindow_qtwidgets.h" -#include "qtwidgets/views/Frame_qtwidgets.h" -#include "qtwidgets/views/MainWindow_qtwidgets.h" -#include "qtwidgets/views/Separator_qtwidgets.h" -#include "qtwidgets/views/SideBar_qtwidgets.h" -#include "qtwidgets/views/Stack_qtwidgets.h" -#include "qtwidgets/views/TabBar_qtwidgets.h" -#include "qtwidgets/views/TitleBar_qtwidgets.h" +#include "ViewWrapper_qtquick.h" +// #include "qtwidgets/views/DockWidget_qtquick.h" +// #include "qtwidgets/views/FloatingWindow_qtquick.h" +// #include "qtwidgets/views/Frame_qtquick.h" +// #include "qtwidgets/views/MainWindow_qtquick.h" +// #include "qtwidgets/views/Separator_qtquick.h" +// #include "qtwidgets/views/SideBar_qtquick.h" +// #include "qtwidgets/views/Stack_qtquick.h" +// #include "qtwidgets/views/TabBar_qtquick.h" +// #include "qtwidgets/views/TitleBar_qtquick.h" #include "private/MultiSplitter_p.h" #include "private/MDILayoutWidget_p.h" @@ -29,237 +29,166 @@ using namespace KDDockWidgets; using namespace KDDockWidgets::Views; -static Controller *controllerForWidget(QWidget *widget) -{ - // KDDW deals in views, but sometimes we might get a native type like QWidget, for example if you call - // someview->window(). This function let's us retrieve the actual controller of the stray QWidget. - - for (int i = int(Type::FIRST); i <= int(::Type::LAST); i *= 2) { - // Using a for+switch pattern so that compiler reminds us if new enumerators are added to enum - switch (Type(i)) { - case Type::Frame: - if (auto view = qobject_cast(widget)) - return view->controller(); - break; - case Type::TitleBar: - if (auto view = qobject_cast(widget)) - return view->controller(); - break; - case Type::TabBar: - if (auto view = qobject_cast(widget)) - return view->controller(); - break; - case Type::Stack: - if (auto view = qobject_cast(widget)) - return view->controller(); - break; - case Type::FloatingWindow: - if (auto view = qobject_cast(widget)) - return view->controller(); - break; - case Type::Separator: - if (auto view = qobject_cast(widget)) - return view->controller(); - break; - case Type::DockWidget: - if (auto view = qobject_cast(widget)) - return view->controller(); - break; - case Type::MultiSplitter: - case Type::MDILayout: - case Type::Layout: - if (auto view = qobject_cast(widget)) - return view->controller(); - case Type::MDIArea: - if (auto view = qobject_cast(widget)) - return view->controller(); - break; - case Type::SideBar: - if (auto view = qobject_cast(widget)) - return view->controller(); - break; - case Type::MainWindow: - if (auto view = qobject_cast(widget)) - return view->controller(); - break; - case Type::LayoutItem: - case Type::DropIndicatorOverlayInterface: - case Type::ViewWrapper: - // skip internal types - continue; - } - } - - return nullptr; -} - -ViewWrapper_qtwidgets::ViewWrapper_qtwidgets(QObject *widget) - : ViewWrapper_qtwidgets(qobject_cast(widget)) +ViewWrapper_qtquick::ViewWrapper_qtquick(QObject *item) + : ViewWrapper_qtquick(qobject_cast(item)) { } -ViewWrapper_qtwidgets::ViewWrapper_qtwidgets(QWidget *widget) - : ViewWrapper(controllerForWidget(widget), widget) - , m_widget(widget) +ViewWrapper_qtquick::ViewWrapper_qtquick(QQuickItem *item) + : ViewWrapper(nullptr /*controllerForWidget(widget)*/, item) + , m_item(item) { } -void ViewWrapper_qtwidgets::setObjectName(const QString &name) +void ViewWrapper_qtquick::setObjectName(const QString &name) { - m_widget->setObjectName(name); + m_item->setObjectName(name); } -QRect ViewWrapper_qtwidgets::geometry() const +QRect ViewWrapper_qtquick::geometry() const { - return m_widget->geometry(); + return {}; } -QPoint ViewWrapper_qtwidgets::mapToGlobal(QPoint localPt) const +QPoint ViewWrapper_qtquick::mapToGlobal(QPoint localPt) const { - return m_widget->mapToGlobal(localPt); + return {}; } -QPoint ViewWrapper_qtwidgets::mapFromGlobal(QPoint globalPt) const +QPoint ViewWrapper_qtquick::mapFromGlobal(QPoint globalPt) const { - return m_widget->mapFromGlobal(globalPt); + return {}; } -void ViewWrapper_qtwidgets::setGeometry(QRect rect) +void ViewWrapper_qtquick::setGeometry(QRect) { - m_widget->setGeometry(rect); } -QWindow *ViewWrapper_qtwidgets::windowHandle() const +QWindow *ViewWrapper_qtquick::windowHandle() const { - return m_widget->windowHandle(); + return {}; } -bool ViewWrapper_qtwidgets::isTopLevel() const +bool ViewWrapper_qtquick::isTopLevel() const { - return m_widget->isTopLevel(); + return {}; } -void ViewWrapper_qtwidgets::setVisible(bool is) +void ViewWrapper_qtquick::setVisible(bool) { - m_widget->setVisible(is); } -bool ViewWrapper_qtwidgets::isVisible() const +bool ViewWrapper_qtquick::isVisible() const { - return m_widget->isVisible(); + return {}; } -void ViewWrapper_qtwidgets::move(int x, int y) +void ViewWrapper_qtquick::move(int, int) { - m_widget->move(x, y); } -void ViewWrapper_qtwidgets::move(QPoint pt) +void ViewWrapper_qtquick::move(QPoint) { - m_widget->move(pt); } -void ViewWrapper_qtwidgets::activateWindow() +void ViewWrapper_qtquick::activateWindow() { - m_widget->activateWindow(); } -bool ViewWrapper_qtwidgets::isMaximized() const +bool ViewWrapper_qtquick::isMaximized() const { - return m_widget->isMaximized(); + return {}; } -QSize ViewWrapper_qtwidgets::maximumSize() const +QSize ViewWrapper_qtquick::maximumSize() const { - return m_widget->maximumSize(); + return {}; } -void ViewWrapper_qtwidgets::setSize(int x, int y) +void ViewWrapper_qtquick::setSize(int, int) { - m_widget->resize(x, y); } -bool ViewWrapper_qtwidgets::is(Type t) const +bool ViewWrapper_qtquick::is(Type t) const { if (t == Type::ViewWrapper) return true; - switch (t) { + // switch (t) { - case Type::Frame: - return qobject_cast(m_widget); - case Type::TitleBar: - return qobject_cast(m_widget); - case Type::TabBar: - return qobject_cast(m_widget); - case Type::Stack: - return qobject_cast(m_widget); - case Type::FloatingWindow: - return qobject_cast(m_widget); - case Type::Separator: - return qobject_cast(m_widget); - case Type::DockWidget: - return qobject_cast(m_widget); - case Type::SideBar: - return qobject_cast(m_widget); - case Type::MainWindow: - return qobject_cast(m_widget); - case Type::Layout: - return qobject_cast(m_widget); - case Type::MultiSplitter: - return qobject_cast(m_widget); - case Type::MDILayout: - return qobject_cast(m_widget); - case Type::MDIArea: - return qobject_cast(m_widget); - case Type::LayoutItem: - case Type::DropIndicatorOverlayInterface: - qWarning() << Q_FUNC_INFO << "These are framework internals that are not wrapped"; - return false; - case Type::ViewWrapper: - return true; - } + // case Type::Frame: + // return qobject_cast(m_item); + // case Type::TitleBar: + // return qobject_cast(m_item); + // case Type::TabBar: + // return qobject_cast(m_item); + // case Type::Stack: + // return qobject_cast(m_item); + // case Type::FloatingWindow: + // return qobject_cast(m_item); + // case Type::Separator: + // return qobject_cast(m_item); + // case Type::DockWidget: + // return qobject_cast(m_item); + // case Type::SideBar: + // return qobject_cast(m_item); + // case Type::MainWindow: + // return qobject_cast(m_item); + // case Type::Layout: + // return qobject_cast(m_item); + // case Type::MultiSplitter: + // return qobject_cast(m_item); + // case Type::MDILayout: + // return qobject_cast(m_item); + // case Type::MDIArea: + // return qobject_cast(m_item); + // case Type::LayoutItem: + // case Type::DropIndicatorOverlayInterface: + // qWarning() << Q_FUNC_INFO << "These are framework internals that are not wrapped"; + // return false; + // case Type::ViewWrapper: + // return true; + // } qWarning() << Q_FUNC_INFO << "Unknown type" << static_cast(t); return false; } -std::unique_ptr ViewWrapper_qtwidgets::window() const +std::unique_ptr ViewWrapper_qtquick::window() const { - return std::unique_ptr(new ViewWrapper_qtwidgets(m_widget->window())); + // return std::unique_ptr(new ViewWrapper_qtquick(m_item->window())); + return {}; } -std::unique_ptr ViewWrapper_qtwidgets::parentView() const +std::unique_ptr ViewWrapper_qtquick::parentView() const { - return std::unique_ptr(new ViewWrapper_qtwidgets(m_widget->parentWidget())); + // return std::unique_ptr(new ViewWrapper_qtquick(m_item->parentWidget())); + return {}; } -HANDLE ViewWrapper_qtwidgets::handle() const +HANDLE ViewWrapper_qtquick::handle() const { - return reinterpret_cast(m_widget); + return reinterpret_cast(m_item); } -void ViewWrapper_qtwidgets::grabMouse() +void ViewWrapper_qtquick::grabMouse() { - m_widget->grabMouse(); } -void ViewWrapper_qtwidgets::releaseMouse() +void ViewWrapper_qtquick::releaseMouse() { - m_widget->releaseMouse(); } -QScreen *ViewWrapper_qtwidgets::screen() const +QScreen *ViewWrapper_qtquick::screen() const { - return m_widget->screen(); + return {}; } -void ViewWrapper_qtwidgets::setFocus(Qt::FocusReason reason) +void ViewWrapper_qtquick::setFocus(Qt::FocusReason) { - m_widget->setFocus(reason); } -QString ViewWrapper_qtwidgets::objectName() const +QString ViewWrapper_qtquick::objectName() const { - return m_widget->QWidget::objectName(); + return {}; } diff --git a/src/qtquick/views/ViewWrapper_qtquick.h b/src/qtquick/views/ViewWrapper_qtquick.h index d8e7dd8f..fc3797fd 100644 --- a/src/qtquick/views/ViewWrapper_qtquick.h +++ b/src/qtquick/views/ViewWrapper_qtquick.h @@ -13,18 +13,18 @@ #include "ViewWrapper.h" -#include +#include namespace KDDockWidgets::Views { -/// @brief A View that doesn't own its QWidget -/// Implements a View API around an existing QWidget -/// Useful for widgets that are not created by KDDW. -class DOCKS_EXPORT ViewWrapper_qtwidgets : public ViewWrapper +/// @brief A View that doesn't own its QQuickItem +/// Implements a View API around an existing QQuickItem +/// Useful for items that are not created by KDDW. +class DOCKS_EXPORT ViewWrapper_qtquick : public ViewWrapper { public: - explicit ViewWrapper_qtwidgets(QObject *widget); - explicit ViewWrapper_qtwidgets(QWidget *widget); + explicit ViewWrapper_qtquick(QObject *widget); + explicit ViewWrapper_qtquick(QQuickItem *widget); void setObjectName(const QString &name) override; QRect geometry() const override; @@ -52,7 +52,7 @@ public: QString objectName() const override; private: - QWidget *const m_widget; + QQuickItem *const m_item; }; }