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"