diff --git a/framework/CMakeLists.txt b/framework/CMakeLists.txt index 44f9475..dc05a7d 100644 --- a/framework/CMakeLists.txt +++ b/framework/CMakeLists.txt @@ -29,9 +29,7 @@ function(link_libs_and_set_properties target_name) target_include_directories(${target_name} PUBLIC "${QT6_ROOT_DIR}/include") target_include_directories(${target_name} PUBLIC "${QT6_ROOT_DIR}/include/QtGui") - target_include_directories(${target_name} PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include/toon_boom") - target_include_directories(${target_name} PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include/framework") - target_include_directories(${target_name} PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include/hooks") + target_include_directories(${target_name} PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include/public") target_include_directories(${target_name} PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/include/internal") target_link_directories(${target_name} PUBLIC "${QT6_ROOT_DIR}/lib") diff --git a/framework/hook/hook.cpp b/framework/hook/hook.cpp index cbe04b5..a5a8084 100644 --- a/framework/hook/hook.cpp +++ b/framework/hook/hook.cpp @@ -1,4 +1,4 @@ -#include "../include/hooks/toon_boom_hooks.hpp" +#include "../include/public/hooks/toon_boom_hooks.hpp" #include "../include/internal/harmony_signatures.hpp" #include #include diff --git a/framework/include/public/toon_boom/ext/layout.hpp b/framework/include/public/toon_boom/ext/layout.hpp new file mode 100644 index 0000000..9baa7e3 --- /dev/null +++ b/framework/include/public/toon_boom/ext/layout.hpp @@ -0,0 +1,73 @@ +#pragma once +#include "../PLUG_Services.hpp" +#include "../toon_boom_layout.hpp" +#include "QtXml/qdom.h" +#include +#include +#include +#include +#include +#include + +template +concept isQWidget = std::is_base_of::value; + +/** + * @brief Simple base class for implementing TULayoutView with a QWidget, with + all the ugly parts abstracted away. + + * @tparam T The QWidget type to use + */ +template class TUWidgetLayoutViewBase : public TULayoutView { +public: + TUWidgetLayoutViewBase() { m_widget = nullptr; }; + TUWidgetLayoutViewBase(T *widget) { m_widget = widget; }; + virtual ~TUWidgetLayoutViewBase() { + }; + virtual void triggerMenuChanged() override {} + QWidget *widget() override { + return reinterpret_cast(static_cast(this)); + } + const QWidget *getWidget() const override { + return m_widget; + } + QWidget *getWidget() override { + ensureWidget(); + return m_widget; + } + TULayoutView *initiate(QWidget *parent) override { + ensureWidget(); + if (parent && m_widget) { + m_widget->setParent(parent); + } + QObject::connect( + parent, &QObject::destroyed, m_widget, + [this]() { + if (m_widget) { + m_widget->setParent(nullptr); // Prevent Qt from deleting us + } + }, + Qt::DirectConnection); // DirectConnection ensures this runs BEFORE + // deletion + + return this; + } + + void isTULayoutView() override {} + void disconnectView() override {} + +protected: + QPointer m_widget; + void ensureWidget() { + if (!m_widget) { + m_widget = createWidget(); + m_widget->setAttribute(Qt::WA_DeleteOnClose, false); + m_widget->setAttribute(Qt::WA_QuitOnClose, false); + } + } + void isTULayoutView() override {} + void disconnectView() override { + + } + virtual T *createWidget() = 0; +}; \ No newline at end of file