diff --git a/include/FramelessHelper/Widgets/private/widgetssharedhelper_p.h b/include/FramelessHelper/Widgets/private/widgetssharedhelper_p.h index 4cfacaad..b34a3db2 100644 --- a/include/FramelessHelper/Widgets/private/widgetssharedhelper_p.h +++ b/include/FramelessHelper/Widgets/private/widgetssharedhelper_p.h @@ -27,10 +27,6 @@ #include #include -QT_BEGIN_NAMESPACE -class QPaintEvent; -QT_END_NAMESPACE - FRAMELESSHELPER_BEGIN_NAMESPACE class MicaMaterial; @@ -62,8 +58,9 @@ private Q_SLOTS: void handleScreenChanged(QScreen *screen); private: - void changeEventHandler(QEvent *event); - void paintEventHandler(QPaintEvent *event); + void repaintMica(); + void repaintBorder(); + void emitCustomWindowStateSignals(); Q_SIGNALS: void micaEnabledChanged(); diff --git a/src/widgets/widgetssharedhelper.cpp b/src/widgets/widgetssharedhelper.cpp index 963faede..872b8b2a 100644 --- a/src/widgets/widgetssharedhelper.cpp +++ b/src/widgets/widgetssharedhelper.cpp @@ -33,7 +33,6 @@ #endif // Q_OS_WINDOWS #include #include -#include #include #include #include @@ -156,12 +155,21 @@ bool WidgetsSharedHelper::eventFilter(QObject *object, QEvent *event) return QObject::eventFilter(object, event); } switch (event->type()) { + //case QEvent::WindowActivate: + //case QEvent::WindowDeactivate: + case QEvent::ActivationChange: + //case QEvent::ApplicationStateChange: + m_targetWidget->update(); + break; case QEvent::Paint: { - const auto paintEvent = static_cast(event); - paintEventHandler(paintEvent); + repaintMica(); + repaintBorder(); } break; case QEvent::WindowStateChange: - changeEventHandler(event); + if (event->type() == QEvent::WindowStateChange) { + updateContentsMargins(); + emitCustomWindowStateSignals(); + } break; case QEvent::Move: case QEvent::Resize: @@ -175,47 +183,39 @@ bool WidgetsSharedHelper::eventFilter(QObject *object, QEvent *event) return QObject::eventFilter(object, event); } -void WidgetsSharedHelper::changeEventHandler(QEvent *event) +void WidgetsSharedHelper::repaintMica() { - Q_ASSERT(event); - if (!event) { + if (!m_micaEnabled || !m_micaMaterial) { return; } - if (event->type() != QEvent::WindowStateChange) { + QPainter painter(m_targetWidget); + m_micaMaterial->paint(&painter, m_targetWidget->size(), m_targetWidget->mapToGlobal(QPoint(0, 0))); +} + +void WidgetsSharedHelper::repaintBorder() +{ + if ((Utils::windowStatesToWindowState(m_targetWidget->windowState()) != Qt::WindowNoState) || !m_borderPainter) { return; } - updateContentsMargins(); - if (const auto mo = m_targetWidget->metaObject()) { - if (const int idx = mo->indexOfSignal(QMetaObject::normalizedSignature("hiddenChanged()").constData()); idx >= 0) { - QMetaObject::invokeMethod(m_targetWidget, "hiddenChanged"); - } - if (const int idx = mo->indexOfSignal(QMetaObject::normalizedSignature("normalChanged()").constData()); idx >= 0) { - QMetaObject::invokeMethod(m_targetWidget, "normalChanged"); - } - if (const int idx = mo->indexOfSignal(QMetaObject::normalizedSignature("zoomedChanged()").constData()); idx >= 0) { - QMetaObject::invokeMethod(m_targetWidget, "zoomedChanged"); - } - } + QPainter painter(m_targetWidget); + m_borderPainter->paint(&painter, m_targetWidget->size(), m_targetWidget->isActiveWindow()); } -void WidgetsSharedHelper::paintEventHandler(QPaintEvent *event) +void WidgetsSharedHelper::emitCustomWindowStateSignals() { - Q_ASSERT(event); - if (!event) { + const QMetaObject * const mo = m_targetWidget->metaObject(); + if (!mo) { return; } - if (m_micaEnabled && m_micaMaterial) { - QPainter painter(m_targetWidget); - m_micaMaterial->paint(&painter, m_targetWidget->size(), - m_targetWidget->mapToGlobal(QPoint(0, 0))); + if (const int idx = mo->indexOfSignal(QMetaObject::normalizedSignature("hiddenChanged()").constData()); idx >= 0) { + QMetaObject::invokeMethod(m_targetWidget, "hiddenChanged"); + } + if (const int idx = mo->indexOfSignal(QMetaObject::normalizedSignature("normalChanged()").constData()); idx >= 0) { + QMetaObject::invokeMethod(m_targetWidget, "normalChanged"); } - if ((Utils::windowStatesToWindowState(m_targetWidget->windowState()) == Qt::WindowNoState) - && m_borderPainter) { - QPainter painter(m_targetWidget); - m_borderPainter->paint(&painter, m_targetWidget->size(), m_targetWidget->isActiveWindow()); + if (const int idx = mo->indexOfSignal(QMetaObject::normalizedSignature("zoomedChanged()").constData()); idx >= 0) { + QMetaObject::invokeMethod(m_targetWidget, "zoomedChanged"); } - // Don't eat this event here, we need Qt to keep dispatching this paint event - // otherwise the widget won't paint anything else from the user side. } void WidgetsSharedHelper::handleScreenChanged(QScreen *screen)