#include "proxywindow.hpp" #include #include #include #include #include ProxyWindowBase::~ProxyWindowBase() { if (this->window != nullptr) { this->window->deleteLater(); } } void ProxyWindowBase::earlyInit(QObject* old) { auto* oldpw = qobject_cast(old); if (oldpw == nullptr || oldpw->window == nullptr) { this->window = new QQuickWindow(); } else { this->window = oldpw->disownWindow(); } // clang-format off QObject::connect(this->window, &QWindow::visibilityChanged, this, &ProxyWindowBase::visibleChanged); QObject::connect(this->window, &QWindow::widthChanged, this, &ProxyWindowBase::widthChanged); QObject::connect(this->window, &QWindow::heightChanged, this, &ProxyWindowBase::heightChanged); // clang-format on } QQuickWindow* ProxyWindowBase::disownWindow() { QObject::disconnect(this->window, nullptr, this, nullptr); auto data = this->data(); ProxyWindowBase::dataClear(&data); data.clear(&data); auto* window = this->window; this->window = nullptr; return window; } QQuickItem* ProxyWindowBase::item() { return this->window->contentItem(); } // NOLINTNEXTLINE #define PROXYPROP(type, get, set) \ type ProxyWindowBase::get() { return this->window->get(); } \ void ProxyWindowBase::set(type value) { this->window->set(value); } PROXYPROP(bool, isVisible, setVisible); PROXYPROP(qint32, width, setWidth); PROXYPROP(qint32, height, setHeight); PROXYPROP(QColor, color, setColor); // see: // https://code.qt.io/cgit/qt/qtdeclarative.git/tree/src/quick/items/qquickwindow.cpp // https://code.qt.io/cgit/qt/qtdeclarative.git/tree/src/quick/items/qquickitem.cpp // // relevant functions are private so we call them via the property QQmlListProperty ProxyWindowBase::data() { return QQmlListProperty( this, nullptr, ProxyWindowBase::dataAppend, ProxyWindowBase::dataCount, ProxyWindowBase::dataAt, ProxyWindowBase::dataClear, ProxyWindowBase::dataReplace, ProxyWindowBase::dataRemoveLast ); } QQmlListProperty ProxyWindowBase::dataBacker(QQmlListProperty* prop) { auto* that = static_cast(prop->object); // NOLINT return that->window->property("data").value>(); } void ProxyWindowBase::dataAppend(QQmlListProperty* prop, QObject* obj) { auto backer = dataBacker(prop); backer.append(&backer, obj); } qsizetype ProxyWindowBase::dataCount(QQmlListProperty* prop) { auto backer = dataBacker(prop); return backer.count(&backer); } QObject* ProxyWindowBase::dataAt(QQmlListProperty* prop, qsizetype i) { auto backer = dataBacker(prop); return backer.at(&backer, i); } void ProxyWindowBase::dataClear(QQmlListProperty* prop) { auto backer = dataBacker(prop); backer.clear(&backer); } void ProxyWindowBase::dataReplace(QQmlListProperty* prop, qsizetype i, QObject* obj) { auto backer = dataBacker(prop); backer.replace(&backer, i, obj); } void ProxyWindowBase::dataRemoveLast(QQmlListProperty* prop) { auto backer = dataBacker(prop); backer.removeLast(&backer); } void ProxyFloatingWindow::earlyInit(QObject* old) { ProxyWindowBase::earlyInit(old); this->geometryLocked = this->window->isVisible(); } void ProxyFloatingWindow::componentComplete() { ProxyWindowBase::componentComplete(); this->geometryLocked = true; } void ProxyFloatingWindow::setWidth(qint32 value) { if (!this->geometryLocked) { ProxyWindowBase::setWidth(value); } } void ProxyFloatingWindow::setHeight(qint32 value) { if (!this->geometryLocked) { ProxyWindowBase::setHeight(value); } }