File indexing completed on 2024-05-12 05:28:39

0001 /*
0002  * SPDX-FileCopyrightText: 2014 Hugo Pereira Da Costa <hugo.pereira@free.fr>
0003  *
0004  * SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "breezewidgetexplorer.h"
0008 
0009 #include "breeze.h"
0010 
0011 #include <QApplication>
0012 #include <QMouseEvent>
0013 #include <QPainter>
0014 #include <QTextStream>
0015 
0016 namespace Breeze
0017 {
0018 //________________________________________________
0019 WidgetExplorer::WidgetExplorer(QObject *parent)
0020     : QObject(parent)
0021 {
0022     _eventTypes.insert(QEvent::Enter, QStringLiteral("Enter"));
0023     _eventTypes.insert(QEvent::Leave, QStringLiteral("Leave"));
0024 
0025     _eventTypes.insert(QEvent::HoverMove, QStringLiteral("HoverMove"));
0026     _eventTypes.insert(QEvent::HoverEnter, QStringLiteral("HoverEnter"));
0027     _eventTypes.insert(QEvent::HoverLeave, QStringLiteral("HoverLeave"));
0028 
0029     _eventTypes.insert(QEvent::MouseMove, QStringLiteral("MouseMove"));
0030     _eventTypes.insert(QEvent::MouseButtonPress, QStringLiteral("MouseButtonPress"));
0031     _eventTypes.insert(QEvent::MouseButtonRelease, QStringLiteral("MouseButtonRelease"));
0032 
0033     _eventTypes.insert(QEvent::FocusIn, QStringLiteral("FocusIn"));
0034     _eventTypes.insert(QEvent::FocusOut, QStringLiteral("FocusOut"));
0035 
0036     // _eventTypes.insert( QEvent::Paint, "Paint" );
0037 }
0038 
0039 //________________________________________________
0040 void WidgetExplorer::setEnabled(bool value)
0041 {
0042     if (value == _enabled) {
0043         return;
0044     }
0045     _enabled = value;
0046 
0047     qApp->removeEventFilter(this);
0048     if (_enabled) {
0049         qApp->installEventFilter(this);
0050     }
0051 }
0052 
0053 //________________________________________________
0054 bool WidgetExplorer::eventFilter(QObject *object, QEvent *event)
0055 {
0056     //         if( object->isWidgetType() )
0057     //         {
0058     //             QString type( _eventTypes[event->type()] );
0059     //             if( !type.isEmpty() )
0060     //             {
0061     //                 QTextStream( stdout ) << "Breeze::WidgetExplorer::eventFilter - widget: " << object << " (" << object->metaObject()->className() << ")";
0062     //                 QTextStream( stdout ) << " type: " << type  << Qt::endl;
0063     //             }
0064     //         }
0065 
0066     switch (event->type()) {
0067     case QEvent::Paint:
0068         if (_drawWidgetRects) {
0069             QWidget *widget(qobject_cast<QWidget *>(object));
0070             if (!widget) {
0071                 return false;
0072             }
0073 
0074             QPainter painter(widget);
0075             painter.setRenderHints(QPainter::Antialiasing);
0076             painter.setBrush(Qt::NoBrush);
0077             painter.setPen(Qt::red);
0078             painter.drawRect(widget->rect());
0079             painter.end();
0080         }
0081         break;
0082 
0083     case QEvent::MouseButtonPress: {
0084         // cast event and check button
0085         QMouseEvent *mouseEvent(static_cast<QMouseEvent *>(event));
0086         if (mouseEvent->button() != Qt::LeftButton) {
0087             break;
0088         }
0089 
0090         // case widget and check (should not be necessary)
0091         QWidget *widget(qobject_cast<QWidget *>(object));
0092         if (!widget) {
0093             return false;
0094         }
0095 
0096         QTextStream(stdout) << "Breeze::WidgetExplorer::eventFilter -"
0097                             << " event: " << event << " type: " << eventType(event->type()) << " widget: " << widgetInformation(widget) << Qt::endl;
0098 
0099         // print parent information
0100         QWidget *parent(widget->parentWidget());
0101         while (parent) {
0102             QTextStream(stdout) << "    parent: " << widgetInformation(parent) << Qt::endl;
0103             parent = parent->parentWidget();
0104         }
0105         QTextStream(stdout) << "" << Qt::endl;
0106 
0107         break;
0108     }
0109 
0110     default:
0111         break;
0112     }
0113 
0114     // always return false to go on with normal chain
0115     return false;
0116 }
0117 
0118 //________________________________________________
0119 QString WidgetExplorer::eventType(const QEvent::Type &type) const
0120 {
0121     switch (type) {
0122     case QEvent::MouseButtonPress:
0123         return QStringLiteral("MouseButtonPress");
0124     case QEvent::MouseButtonRelease:
0125         return QStringLiteral("MouseButtonRelease");
0126     case QEvent::MouseMove:
0127         return QStringLiteral("MouseMove");
0128     default:
0129         return QStringLiteral("Unknown");
0130     }
0131 }
0132 
0133 //________________________________________________
0134 QString WidgetExplorer::widgetInformation(const QWidget *widget) const
0135 {
0136     QRect r(widget->geometry());
0137     const char *className(widget->metaObject()->className());
0138     QString out;
0139     QTextStream(&out) << widget << " (" << className << ")"
0140                       << " position: " << r.x() << "," << r.y() << " size: " << r.width() << "," << r.height() << " sizeHint: " << widget->sizeHint().width()
0141                       << "," << widget->sizeHint().height() << " minimumSizeHint: " << widget->minimumSizeHint().width() << ","
0142                       << widget->minimumSizeHint().height() << " hover: " << widget->testAttribute(Qt::WA_Hover);
0143 
0144     return out;
0145 }
0146 
0147 }