From ac1a62b2a76e4d15e412b9579b80da2dafbc6d6a Mon Sep 17 00:00:00 2001 From: SineStriker <55847490+SineStriker@users.noreply.github.com> Date: 周一, 19 5月 2025 15:38:12 +0800 Subject: [PATCH] Update qmsetup --- src/widgets/widgetwindowagent_mac.cpp | 50 ++++++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 46 insertions(+), 4 deletions(-) diff --git a/src/widgets/widgetwindowagent_mac.cpp b/src/widgets/widgetwindowagent_mac.cpp index 48679cd..17156e4 100644 --- a/src/widgets/widgetwindowagent_mac.cpp +++ b/src/widgets/widgetwindowagent_mac.cpp @@ -1,8 +1,16 @@ +// Copyright (C) 2023-2024 Stdware Collections (https://www.github.com/stdware) +// Copyright (C) 2021-2023 wangwenx190 (Yuhang Zhao) +// SPDX-License-Identifier: Apache-2.0 + #include "widgetwindowagent_p.h" #include <QtGui/QtEvents> namespace QWK { + + static inline QRect getWidgetSceneRect(QWidget *widget) { + return {widget->mapTo(widget->window(), QPoint()), widget->size()}; + } class SystemButtonAreaWidgetEventFilter : public QObject { public: @@ -10,8 +18,11 @@ QObject *parent = nullptr) : QObject(parent), widget(widget), ctx(ctx) { widget->installEventFilter(this); + ctx->setSystemButtonAreaCallback([widget](const QSize &) { + return getWidgetSceneRect(widget); // + }); } - ~SystemButtonAreaWidgetEventFilter() = default; + ~SystemButtonAreaWidgetEventFilter() override = default; protected: bool eventFilter(QObject *obj, QEvent *event) override { @@ -19,8 +30,7 @@ switch (event->type()) { case QEvent::Move: case QEvent::Resize: { - QRect rect(widget->mapTo(widget->window(), {}), widget->size()); - ctx->setSystemButtonArea(rect); + ctx->virtual_hook(AbstractWindowContext::SystemButtonAreaChangedHook, nullptr); break; } @@ -35,22 +45,54 @@ AbstractWindowContext *ctx; }; + /*! + Returns the widget that acts as the system button area. + */ QWidget *WidgetWindowAgent::systemButtonArea() const { Q_D(const WidgetWindowAgent); return d->systemButtonAreaWidget; } + /*! + Sets the widget that acts as the system button area. The system button will be centered in + its area, it is recommended to place the widget in a layout and set a fixed size policy. + + The system button will be visible in the system title bar area. + */ void WidgetWindowAgent::setSystemButtonArea(QWidget *widget) { Q_D(WidgetWindowAgent); + if (d->systemButtonAreaWidget == widget) + return; + auto ctx = d->context.get(); d->systemButtonAreaWidget = widget; if (!widget) { + d->context->setSystemButtonAreaCallback({}); d->systemButtonAreaWidgetEventFilter.reset(); - ctx->setSystemButtonArea({}); return; } d->systemButtonAreaWidgetEventFilter = std::make_unique<SystemButtonAreaWidgetEventFilter>(widget, ctx); } + /*! + Returns the the system button area callback. + */ + ScreenRectCallback WidgetWindowAgent::systemButtonAreaCallback() const { + Q_D(const WidgetWindowAgent); + return d->systemButtonAreaWidget ? nullptr : d->context->systemButtonAreaCallback(); + } + + /*! + Sets the the system button area callback, the \c size of the callback is the native title + bar size. + + The system button position will be updated when the window resizes. + */ + void WidgetWindowAgent::setSystemButtonAreaCallback(const ScreenRectCallback &callback) { + Q_D(WidgetWindowAgent); + setSystemButtonArea(nullptr); + d->context->setSystemButtonAreaCallback(callback); + } + } \ No newline at end of file -- Gitblit v1.9.1