feat(framework): add TUWidgetLayoutViewBase template class to make implementing TULayoutView easier

This commit is contained in:
☙◦ The Tablet ❀ GamerGirlandCo ◦❧ 2026-01-15 00:02:31 -05:00
parent 848c0e1c81
commit 958b566751
Signed by: tablet
GPG Key ID: 924A5F6AF051E87C
3 changed files with 75 additions and 4 deletions

View File

@ -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")

View File

@ -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 <iostream>
#include <vector>

View File

@ -0,0 +1,73 @@
#pragma once
#include "../PLUG_Services.hpp"
#include "../toon_boom_layout.hpp"
#include "QtXml/qdom.h"
#include <QtCore/QObject>
#include <QtCore/QPointer>
#include <QtCore/Qt>
#include <QtWidgets/QWidget>
#include <iostream>
#include <type_traits>
template <typename T>
concept isQWidget = std::is_base_of<QWidget, T>::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 <isQWidget T> 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<QWidget *>(static_cast<TULayoutView *>(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<T> 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;
};