Sine Striker
2024-01-03 7990ac78e1938536650456bf987a4c986a4e6f1b
src/core/shared/systemwindow_p.h
@@ -1,3 +1,7 @@
// Copyright (C) 2023-2024 Stdware Collections (https://www.github.com/stdware)
// Copyright (C) 2021-2023 wangwenx190 (Yuhang Zhao)
// SPDX-License-Identifier: Apache-2.0
#ifndef SYSTEMWINDOW_P_H
#define SYSTEMWINDOW_P_H
@@ -15,107 +19,100 @@
#include <QWKCore/private/qwkglobal_p.h>
// Don't include this header in any header files.
namespace QWK {
    // Anonymous namespace
    namespace {
    class WindowMoveManipulator : public QObject {
    public:
        explicit WindowMoveManipulator(QWindow *targetWindow)
            : QObject(targetWindow), target(targetWindow), initialMousePosition(QCursor::pos()),
              initialWindowPosition(targetWindow->position()) {
            target->installEventFilter(this);
        }
        class WindowMoveManipulator : public QObject {
        public:
            explicit WindowMoveManipulator(QWindow *targetWindow)
                : QObject(targetWindow), target(targetWindow), initialMousePosition(QCursor::pos()),
                  initialWindowPosition(targetWindow->position()) {
                target->installEventFilter(this);
            }
        protected:
            bool eventFilter(QObject *obj, QEvent *event) override {
                switch (event->type()) {
                    case QEvent::MouseMove: {
                        auto mouseEvent = static_cast<QMouseEvent *>(event);
                        QPoint delta = getMouseEventGlobalPos(mouseEvent) - initialMousePosition;
                        target->setPosition(initialWindowPosition + delta);
                        return true;
                    }
                    case QEvent::MouseButtonRelease: {
                        if (target->y() < 0) {
                            target->setPosition(target->x(), 0);
                        }
                        target->removeEventFilter(this);
                        deleteLater();
                    }
                    default:
                        break;
    protected:
        bool eventFilter(QObject *obj, QEvent *event) override {
            switch (event->type()) {
                case QEvent::MouseMove: {
                    auto mouseEvent = static_cast<QMouseEvent *>(event);
                    QPoint delta = getMouseEventGlobalPos(mouseEvent) - initialMousePosition;
                    target->setPosition(initialWindowPosition + delta);
                    return true;
                }
                return false;
            }
        private:
            QWindow *target;
            QPoint initialMousePosition;
            QPoint initialWindowPosition;
        };
        class WindowResizeManipulator : public QObject {
        public:
            WindowResizeManipulator(QWindow *targetWindow, Qt::Edges edges)
                : QObject(targetWindow), target(targetWindow), resizeEdges(edges),
                  initialMousePosition(QCursor::pos()), initialWindowRect(target->geometry()) {
                target->installEventFilter(this);
            }
        protected:
            bool eventFilter(QObject *obj, QEvent *event) override {
                switch (event->type()) {
                    case QEvent::MouseMove: {
                        auto mouseEvent = static_cast<QMouseEvent *>(event);
                        QPoint globalMousePos = getMouseEventGlobalPos(mouseEvent);
                        QRect windowRect = initialWindowRect;
                        if (resizeEdges & Qt::LeftEdge) {
                            int delta = globalMousePos.x() - initialMousePosition.x();
                            windowRect.setLeft(initialWindowRect.left() + delta);
                        }
                        if (resizeEdges & Qt::RightEdge) {
                            int delta = globalMousePos.x() - initialMousePosition.x();
                            windowRect.setRight(initialWindowRect.right() + delta);
                        }
                        if (resizeEdges & Qt::TopEdge) {
                            int delta = globalMousePos.y() - initialMousePosition.y();
                            windowRect.setTop(initialWindowRect.top() + delta);
                        }
                        if (resizeEdges & Qt::BottomEdge) {
                            int delta = globalMousePos.y() - initialMousePosition.y();
                            windowRect.setBottom(initialWindowRect.bottom() + delta);
                        }
                        target->setGeometry(windowRect);
                        return true;
                case QEvent::MouseButtonRelease: {
                    if (target->y() < 0) {
                        target->setPosition(target->x(), 0);
                    }
                    case QEvent::MouseButtonRelease: {
                        target->removeEventFilter(this);
                        deleteLater();
                    }
                    default:
                        break;
                    target->removeEventFilter(this);
                    deleteLater();
                }
                return false;
                default:
                    break;
            }
            return false;
        }
        private:
            QWindow *target;
            QPoint initialMousePosition;
            QRect initialWindowRect;
            Qt::Edges resizeEdges;
        };
    private:
        QWindow *target;
        QPoint initialMousePosition;
        QPoint initialWindowPosition;
    };
    }
    class WindowResizeManipulator : public QObject {
    public:
        WindowResizeManipulator(QWindow *targetWindow, Qt::Edges edges)
            : QObject(targetWindow), target(targetWindow), resizeEdges(edges),
              initialMousePosition(QCursor::pos()), initialWindowRect(target->geometry()) {
            target->installEventFilter(this);
        }
    protected:
        bool eventFilter(QObject *obj, QEvent *event) override {
            switch (event->type()) {
                case QEvent::MouseMove: {
                    auto mouseEvent = static_cast<QMouseEvent *>(event);
                    QPoint globalMousePos = getMouseEventGlobalPos(mouseEvent);
                    QRect windowRect = initialWindowRect;
                    if (resizeEdges & Qt::LeftEdge) {
                        int delta = globalMousePos.x() - initialMousePosition.x();
                        windowRect.setLeft(initialWindowRect.left() + delta);
                    }
                    if (resizeEdges & Qt::RightEdge) {
                        int delta = globalMousePos.x() - initialMousePosition.x();
                        windowRect.setRight(initialWindowRect.right() + delta);
                    }
                    if (resizeEdges & Qt::TopEdge) {
                        int delta = globalMousePos.y() - initialMousePosition.y();
                        windowRect.setTop(initialWindowRect.top() + delta);
                    }
                    if (resizeEdges & Qt::BottomEdge) {
                        int delta = globalMousePos.y() - initialMousePosition.y();
                        windowRect.setBottom(initialWindowRect.bottom() + delta);
                    }
                    target->setGeometry(windowRect);
                    return true;
                }
                case QEvent::MouseButtonRelease: {
                    target->removeEventFilter(this);
                    deleteLater();
                }
                default:
                    break;
            }
            return false;
        }
    private:
        QWindow *target;
        QPoint initialMousePosition;
        QRect initialWindowRect;
        Qt::Edges resizeEdges;
    };
    // QWindow::startSystemMove() and QWindow::startSystemResize() is first supported at Qt 5.15
    // QWindow::startSystemResize() returns false on macOS
@@ -123,7 +120,7 @@
    // When the new API fails, we emulate the window actions using the classical API.
    static inline void startSystemMove(QWindow *window) {
    inline void startSystemMove(QWindow *window) {
#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 0))
        std::ignore = new WindowMoveManipulator(window);
#elif defined(Q_OS_LINUX)
@@ -136,7 +133,7 @@
#endif
    }
    static inline void startSystemResize(QWindow *window, Qt::Edges edges) {
    inline void startSystemResize(QWindow *window, Qt::Edges edges) {
#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 0))
        std::ignore = new WindowResizeManipulator(window, edges);
#elif defined(Q_OS_MAC) || defined(Q_OS_LINUX)