| | |
| | | |
| | | namespace QWK { |
| | | |
| | | static inline QRect getWidgetSceneRect(QWidget *widget) { |
| | | return {widget->mapTo(widget->window(), {}), widget->size()}; |
| | | } |
| | | |
| | | class SystemButtonAreaWidgetEventFilter : public QObject { |
| | | public: |
| | | SystemButtonAreaWidgetEventFilter(QWidget *widget, AbstractWindowContext *ctx, |
| | |
| | | |
| | | protected: |
| | | bool eventFilter(QObject *obj, QEvent *event) override { |
| | | Q_UNUSED(obj) |
| | | switch (event->type()) { |
| | | case QEvent::Move: |
| | | case QEvent::Resize: { |
| | | ctx->setSystemButtonArea(widget->geometry()); |
| | | ctx->setSystemButtonArea(getWidgetSceneRect(widget)); |
| | | break; |
| | | } |
| | | |
| | | default: |
| | | break; |
| | | } |
| | | return QObject::eventFilter(obj, event); |
| | | return false; |
| | | } |
| | | |
| | | protected: |
| | |
| | | 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. |
| | | */ |
| | | void WidgetWindowAgent::setSystemButtonArea(QWidget *widget) { |
| | | Q_D(WidgetWindowAgent); |
| | | if (d->systemButtonAreaWidget == widget) |
| | | return; |
| | | |
| | | auto ctx = d->context.get(); |
| | | d->systemButtonAreaWidget = widget; |
| | | if (!widget) { |
| | |
| | | } |
| | | d->systemButtonAreaWidgetEventFilter = |
| | | std::make_unique<SystemButtonAreaWidgetEventFilter>(widget, ctx); |
| | | ctx->setSystemButtonArea(getWidgetSceneRect(widget)); |
| | | } |
| | | |
| | | } |