From 7a54badb4a5782c551deb2919f3c489fdb4fbc02 Mon Sep 17 00:00:00 2001
From: Sine Striker <trueful@163.com>
Date: 周日, 03 12月 2023 17:17:40 +0800
Subject: [PATCH] Add snap layout handling

---
 src/widgets/widgetitemdelegate.cpp |   33 ++++++++++++++++++++++++++++-----
 1 files changed, 28 insertions(+), 5 deletions(-)

diff --git a/src/widgets/widgetitemdelegate.cpp b/src/widgets/widgetitemdelegate.cpp
index 61ed17b..08b3804 100644
--- a/src/widgets/widgetitemdelegate.cpp
+++ b/src/widgets/widgetitemdelegate.cpp
@@ -1,14 +1,16 @@
 #include "widgetitemdelegate_p.h"
 
+#include <QtGui/QMouseEvent>
 #include <QtWidgets/QWidget>
+#include <QtWidgets/QApplication>
+
+extern Q_WIDGETS_EXPORT QWidget *qt_button_down;
 
 namespace QWK {
-    
-    WidgetItemDelegate::WidgetItemDelegate() {
-    }
 
-    WidgetItemDelegate::~WidgetItemDelegate() {
-    }
+    WidgetItemDelegate::WidgetItemDelegate() = default;
+
+    WidgetItemDelegate::~WidgetItemDelegate() = default;
 
     QWindow *WidgetItemDelegate::window(QObject *obj) const {
         return static_cast<QWidget *>(obj)->windowHandle();
@@ -22,4 +24,25 @@
         return static_cast<QWidget *>(obj)->isVisible();
     }
 
+    QRect WidgetItemDelegate::mapGeometryToScene(const QObject *obj) const {
+        auto widget = static_cast<const QWidget *>(obj);
+        const QPoint originPoint = widget->mapTo(widget->window(), QPoint(0, 0));
+        const QSize size = widget->size();
+        return {originPoint, size};
+    }
+
+    bool WidgetItemDelegate::resetQtGrabbedControl() const {
+        if (qt_button_down) {
+            static constexpr const auto invalidPos = QPoint{-99999, -99999};
+            const auto event =
+                new QMouseEvent(QEvent::MouseButtonRelease, invalidPos, invalidPos, invalidPos,
+                                Qt::LeftButton, QGuiApplication::mouseButtons() ^ Qt::LeftButton,
+                                QGuiApplication::keyboardModifiers());
+            QApplication::postEvent(qt_button_down, event);
+            qt_button_down = nullptr;
+            return true;
+        }
+        return false;
+    }
+
 }
\ No newline at end of file

--
Gitblit v1.9.1