| | |
| | | #include "widgetwindowagent.h" |
| | | #include "widgetwindowagent_p.h" |
| | | |
| | | #include <QtGui/QtEvents> |
| | | #include <QtGui/QPainter> |
| | | #include <QtCore/QDebug> |
| | | |
| | | #include "widgetitemdelegate_p.h" |
| | | |
| | | namespace QWK { |
| | | |
| | | class WidgetBorderHandler : public QObject { |
| | | public: |
| | | WidgetBorderHandler(QWidget *widget, AbstractWindowContext *ctx) |
| | | : widget(widget), ctx(ctx), m_thickness(0) { |
| | | updateThickness(); |
| | | widget->installEventFilter(this); |
| | | } |
| | | |
| | | void updateThickness() { |
| | | // Query thickness |
| | | bool native = false; |
| | | void *a[] = { |
| | | &native, |
| | | &m_thickness, |
| | | }; |
| | | ctx->virtual_hook(AbstractWindowContext::BorderThicknessHook, &a); |
| | | } |
| | | |
| | | void updateMargins() { |
| | | if (widget->windowState() & (Qt::WindowMaximized | Qt::WindowFullScreen)) { |
| | | widget->setContentsMargins({}); |
| | | } else { |
| | | widget->setContentsMargins({0, int(m_thickness), 0, 0}); |
| | | } |
| | | } |
| | | |
| | | protected: |
| | | bool eventFilter(QObject *obj, QEvent *event) override { |
| | | switch (event->type()) { |
| | | case QEvent::Paint: { |
| | | if (widget->windowState() & (Qt::WindowMaximized | Qt::WindowFullScreen)) |
| | | break; |
| | | |
| | | auto paintEvent = static_cast<QPaintEvent *>(event); |
| | | QPainter painter(widget); |
| | | QRect rect = paintEvent->rect(); |
| | | QRegion region = paintEvent->region(); |
| | | void *args[] = { |
| | | &painter, |
| | | &rect, |
| | | ®ion, |
| | | }; |
| | | ctx->virtual_hook(AbstractWindowContext::DrawBordersHook, args); |
| | | return true; |
| | | } |
| | | |
| | | case QEvent::WindowStateChange: { |
| | | updateMargins(); |
| | | break; |
| | | } |
| | | |
| | | case QEvent::WindowActivate: |
| | | case QEvent::WindowDeactivate: { |
| | | widget->update(); |
| | | break; |
| | | } |
| | | |
| | | // TODO: Handle DPI Change |
| | | |
| | | default: |
| | | break; |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | QWidget *widget; |
| | | AbstractWindowContext *ctx; |
| | | quint32 m_thickness; |
| | | }; |
| | | |
| | | WidgetWindowAgentPrivate::WidgetWindowAgentPrivate() { |
| | | } |
| | |
| | | return false; |
| | | } |
| | | d->hostWidget = w; |
| | | |
| | | // Install painting hook |
| | | if (bool needPaintBorder = false; |
| | | d->context->virtual_hook(AbstractWindowContext::NeedsDrawBordersHook, &needPaintBorder), |
| | | needPaintBorder) { |
| | | auto borderHandler = std::make_unique<WidgetBorderHandler>(w, d->context.get()); |
| | | borderHandler->updateMargins(); |
| | | d->borderHandler = std::move(borderHandler); |
| | | } |
| | | return true; |
| | | } |
| | | |
| | |
| | | Q_EMIT systemButtonChanged(button, w); |
| | | } |
| | | |
| | | bool WidgetWindowAgent::isHitTestVisible(QWidget *w) const { |
| | | bool WidgetWindowAgent::isHitTestVisible(const QWidget *w) const { |
| | | Q_D(const WidgetWindowAgent); |
| | | return d->context->isHitTestVisible(w); |
| | | } |
| | | |
| | | void WidgetWindowAgent::setHitTestVisible(QWidget *w, bool visible) { |
| | | void WidgetWindowAgent::setHitTestVisible(const QWidget *w, bool visible) { |
| | | Q_D(WidgetWindowAgent); |
| | | d->context->setHitTestVisible(w, visible); |
| | | } |
| | |
| | | } |
| | | |
| | | WidgetWindowAgent::WidgetWindowAgent(WidgetWindowAgentPrivate &d, QObject *parent) |
| | | : CoreWindowAgent(d, parent) { |
| | | : WindowAgentBase(d, parent) { |
| | | d.init(); |
| | | } |
| | | } |