Zhao Yuhang
2023-12-14 2452f5958272d50981ab89ff843d2fa715d33957
add macos titlebar
4个文件已修改
1个文件已添加
103 ■■■■■ 已修改文件
examples/mainwindow/mainwindow.cpp 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/widgets/CMakeLists.txt 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/widgets/widgetwindowagent.cpp 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/widgets/widgetwindowagent_cocoa.cpp 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/widgets/widgetwindowagent_p.h 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
examples/mainwindow/mainwindow.cpp
@@ -107,7 +107,7 @@
void MainWindow::installWindowAgent() {
    auto agent = new QWK::WidgetWindowAgent(this);
    if (!agent->setup(this)) {
        qFatal("Frameless handle failed to initialize.");
        qFatal("QWK failed to initialize.");
    }
    auto menuBar = []() {
src/widgets/CMakeLists.txt
@@ -14,6 +14,10 @@
if(WIN32)
    list(APPEND _src widgetwindowagent_win.cpp)
elseif(APPLE)
    list(APPEND _src widgetwindowagent_cocoa.cpp)
else()
    list(APPEND _src widgetwindowagent_qt.cpp)
endif()
qwk_add_library(${PROJECT_NAME} AUTOGEN
src/widgets/widgetwindowagent.cpp
@@ -57,6 +57,9 @@
        if (!d->context->setTitleBar(w)) {
            return;
        }
#ifdef Q_OS_MACOS
        d->setupMacOSTitleBar(w);
#endif
        Q_EMIT titleBarWidgetChanged(w);
    }
src/widgets/widgetwindowagent_cocoa.cpp
New file
@@ -0,0 +1,92 @@
#include "widgetwindowagent_p.h"
namespace QWK {
    class TitleBarEventFilter : public QObject {
        Q_OBJECT
    public:
        explicit TitleBarEventFilter(AbstractWindowContext *context, QObject *parent = nullptr);
        ~TitleBarEventFilter() override;
    protected:
        bool eventFilter(QObject *object, QEvent *event) override;
    private:
        AbstractWindowContext *m_context;
        bool m_leftButtonPressed;
    }
    TitleBarEventFilter::TitleBarEventFilter(QObject *parent) : QObject(parent), m_context(context), m_leftButtonPressed(false) {}
    TitleBarEventFilter::~TitleBarEventFilter() = default;
    bool TitleBarEventFilter::eventFilter(QObject *object, QEvent *event) {
        const auto type = event->type();
        if (type < QEvent::MouseButtonPress || type > QEvent::MouseMove) {
            return false;
        }
        const auto me = static_cast<const QMouseEvent *>(event);
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
        const QPoint scenePos = mouseEvent->scenePosition().toPoint();
        const QPoint globalPos = mouseEvent->globalPosition().toPoint();
#else
        const QPoint scenePos = mouseEvent->windowPos().toPoint();
        const QPoint globalPos = mouseEvent->screenPos().toPoint();
#endif
        if (!m_context->isInTitleBarDraggableArea(scenePos)) {
            return false;
        }
        switch (type) {
            case QEvent::MouseButtonPress: {
                if (me->button() == Qt::LeftButton) {
                    m_leftButtonPressed = true;
                    event->accept();
                    return true;
                }
                break;
            }
            case QEvent::MouseButtonRelease: {
                if (me->button() == Qt::LeftButton) {
                    m_leftButtonPressed = false;
                    event->accept();
                    return true;
                }
                break;
            }
            case QEvent::MouseMove: {
                if (m_leftButtonPressed) {
                    const auto widget = static_cast<QWidget *>(object);
                    widget->windowHandle()->startSystemMove();
                    event->accept();
                    return true;
                }
                break;
            }
            case QEvent::MouseButtonDblClick: {
                if (me->button() == Qt::LeftButton) {
                    if (!widget->isFullScreen()) {
                        if (widget->isMaximized()) {
                            widget->showNormal();
                        } else {
                            widget->showMaximized();
                        }
                        event->accept();
                        return true;
                    }
                }
                break;
            }
            default:
                break;
        }
        return false;
    }
    void WidgetWindowAgentPrivate::setupMacOSTitleBar(QWidget *titleBar) {
        titleBar->installEventFilter(new TitleBarEventFilter(context.get(), titleBar));
    }
}
#include "widgetwindowagent_cocoa.moc"
src/widgets/widgetwindowagent_p.h
@@ -19,6 +19,8 @@
#ifdef Q_OS_WINDOWS
        void setupWindows10BorderWorkaround();
#elif defined(Q_OS_MACOS)
        void setupMacOSTitleBar(QWidget *titleBar);
#endif
    };