#include "widgetitemdelegate_p.h" #include #include #include extern Q_DECL_IMPORT QWidget *qt_button_down; namespace QWK { WidgetItemDelegate::WidgetItemDelegate() = default; WidgetItemDelegate::~WidgetItemDelegate() = default; QWindow *WidgetItemDelegate::window(const QObject *obj) const { return static_cast(obj)->windowHandle(); } bool WidgetItemDelegate::isEnabled(const QObject *obj) const { return static_cast(obj)->isEnabled(); } bool WidgetItemDelegate::isVisible(const QObject *obj) const { return static_cast(obj)->isVisible(); } QRect WidgetItemDelegate::mapGeometryToScene(const QObject *obj) const { auto widget = static_cast(obj); const QPoint originPoint = widget->mapTo(widget->window(), QPoint(0, 0)); const QSize size = widget->size(); return {originPoint, size}; } QWindow *WidgetItemDelegate::hostWindow(const QObject *host) const { return static_cast(host)->windowHandle(); } bool WidgetItemDelegate::isHostSizeFixed(const QObject *host) const { const auto widget = static_cast(host); // "Qt::MSWindowsFixedSizeDialogHint" is used cross-platform actually. if (widget->windowFlags() & Qt::MSWindowsFixedSizeDialogHint) { return true; } // Caused by setFixedWidth/Height/Size(). const QSize minSize = widget->minimumSize(); const QSize maxSize = widget->maximumSize(); if (!minSize.isEmpty() && !maxSize.isEmpty() && (minSize == maxSize)) { return true; } return false; } bool WidgetItemDelegate::isWindowActive(const QObject *host) const { return static_cast(host)->isActiveWindow(); } void WidgetItemDelegate::resetQtGrabbedControl(QObject *host) const { Q_UNUSED(host); if (!qt_button_down) { return; } static constexpr const auto invalidPos = QPoint{std::numeric_limits::lowest(), std::numeric_limits::lowest()}; const auto event = new QMouseEvent( QEvent::MouseButtonRelease, invalidPos, invalidPos, invalidPos, Qt::LeftButton, QGuiApplication::mouseButtons() ^ Qt::LeftButton, QGuiApplication::keyboardModifiers()); QCoreApplication::postEvent(qt_button_down, event); qt_button_down = nullptr; } Qt::WindowStates WidgetItemDelegate::getWindowState(const QObject *host) const { return static_cast(host)->windowState(); } void WidgetItemDelegate::setWindowState(QObject *host, Qt::WindowStates state) const { static_cast(host)->setWindowState(state); } void WidgetItemDelegate::setCursorShape(QObject *host, Qt::CursorShape shape) const { static_cast(host)->setCursor(QCursor(shape)); } void WidgetItemDelegate::restoreCursorShape(QObject *host) const { static_cast(host)->unsetCursor(); } Qt::WindowFlags WidgetItemDelegate::getWindowFlags(const QObject *host) const { return static_cast(host)->windowFlags(); } void WidgetItemDelegate::setWindowFlags(QObject *host, Qt::WindowFlags flags) const { static_cast(host)->setWindowFlags(flags); } void WidgetItemDelegate::setWindowVisible(QObject *host, bool visible) const { static_cast(host)->setVisible(visible); } void WidgetItemDelegate::bringWindowToTop(QObject *host) const { static_cast(host)->raise(); } }