File indexing completed on 2024-05-12 05:53:36

0001 /*
0002     SPDX-FileCopyrightText: 2006-2008 Robert Knight <robertknight@gmail.com>
0003     SPDX-FileCopyrightText: 1997, 1998 Lars Doelle <lars.doelle@on-line.de>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 #include "CompositeWidgetFocusWatcher.h"
0009 
0010 #include <QFocusEvent>
0011 
0012 using namespace Konsole;
0013 
0014 CompositeWidgetFocusWatcher::CompositeWidgetFocusWatcher(QWidget *compositeWidget)
0015     : QObject(compositeWidget)
0016 {
0017     registerWidgetAndChildren(compositeWidget);
0018 }
0019 
0020 bool CompositeWidgetFocusWatcher::eventFilter(QObject *watched, QEvent *event)
0021 {
0022     switch (event->type()) {
0023     case QEvent::Close:
0024     case QEvent::DeferredDelete:
0025     case QEvent::Destroy:
0026         removeEventFilter(watched);
0027         disconnect(this, &CompositeWidgetFocusWatcher::compositeFocusChanged, watched, nullptr);
0028         break;
0029     case QEvent::FocusIn:
0030         Q_EMIT compositeFocusChanged(true);
0031         break;
0032     case QEvent::FocusOut:
0033         if (static_cast<QFocusEvent *>(event)->reason() != Qt::PopupFocusReason) {
0034             Q_EMIT compositeFocusChanged(false);
0035         }
0036         break;
0037     default:
0038         break;
0039     }
0040     return false;
0041 }
0042 
0043 void CompositeWidgetFocusWatcher::registerWidgetAndChildren(QWidget *widget)
0044 {
0045     Q_ASSERT(widget != nullptr);
0046 
0047     if (widget->focusPolicy() != Qt::NoFocus) {
0048         widget->installEventFilter(this);
0049     }
0050     for (auto *child : widget->children()) {
0051         auto *childWidget = qobject_cast<QWidget *>(child);
0052         if (childWidget != nullptr) {
0053             registerWidgetAndChildren(childWidget);
0054         }
0055     }
0056 }
0057 
0058 #include "moc_CompositeWidgetFocusWatcher.cpp"