#include "qsmenu.hpp" #include #include #include #include #include #include "platformmenu.hpp" using namespace qs::menu::platform; namespace qs::menu { QString QsMenuButtonType::toString(QsMenuButtonType::Enum value) { switch (value) { case QsMenuButtonType::None: return "None"; case QsMenuButtonType::CheckBox: return "CheckBox"; case QsMenuButtonType::RadioButton: return "RadioButton"; default: return "Invalid button type"; } } void QsMenuEntry::display(QObject* parentWindow, int relativeX, int relativeY) { auto* platform = new PlatformMenuEntry(this); QObject::connect(platform, &PlatformMenuEntry::closed, platform, [=]() { platform->deleteLater(); }); auto success = platform->display(parentWindow, relativeX, relativeY); if (!success) delete platform; } QQmlListProperty QsMenuEntry::emptyChildren(QObject* parent) { return QQmlListProperty( parent, nullptr, &QsMenuEntry::childCount, &QsMenuEntry::childAt ); } void QsMenuEntry::ref() { this->refcount++; if (this->refcount == 1) emit this->opened(); } void QsMenuEntry::unref() { this->refcount--; if (this->refcount == 0) emit this->closed(); } QQmlListProperty QsMenuEntry::children() { return QsMenuEntry::emptyChildren(this); } QsMenuEntry* QsMenuOpener::menu() const { return this->mMenu; } void QsMenuOpener::setMenu(QsMenuEntry* menu) { if (menu == this->mMenu) return; if (this->mMenu != nullptr) { this->mMenu->unref(); QObject::disconnect(this->mMenu, nullptr, this, nullptr); } this->mMenu = menu; if (menu != nullptr) { QObject::connect(menu, &QObject::destroyed, this, &QsMenuOpener::onMenuDestroyed); QObject::connect(menu, &QsMenuEntry::childrenChanged, this, &QsMenuOpener::childrenChanged); menu->ref(); } emit this->menuChanged(); emit this->childrenChanged(); } void QsMenuOpener::onMenuDestroyed() { this->mMenu = nullptr; emit this->menuChanged(); emit this->childrenChanged(); } QQmlListProperty QsMenuOpener::children() { return this->mMenu ? this->mMenu->children() : QsMenuEntry::emptyChildren(this); } qsizetype QsMenuEntry::childCount(QQmlListProperty* /*property*/) { return 0; } QsMenuEntry* QsMenuEntry::childAt(QQmlListProperty* /*property*/, qsizetype /*index*/) { return nullptr; } } // namespace qs::menu