File indexing completed on 2024-05-19 05:35:23

0001 //////////////////////////////////////////////////////////////////////////////
0002 // oxygenwidgetexplorer.cpp
0003 // print widget's and parent's information on mouse click
0004 // -------------------
0005 //
0006 // SPDX-FileCopyrightText: 2010 Hugo Pereira Da Costa <hugo.pereira@free.fr>
0007 //
0008 // SPDX-License-Identifier: MIT
0009 //////////////////////////////////////////////////////////////////////////////
0010 
0011 #include "oxygenwidgetexplorer.h"
0012 #include "oxygen.h"
0013 
0014 #include <QApplication>
0015 #include <QMouseEvent>
0016 #include <QPainter>
0017 #include <QTextStream>
0018 
0019 #include <iostream>
0020 
0021 namespace Oxygen
0022 {
0023 //________________________________________________
0024 WidgetExplorer::WidgetExplorer(QObject *parent)
0025     : QObject(parent)
0026     , _enabled(false)
0027     , _drawWidgetRects(false)
0028 {
0029     _eventTypes.insert(QEvent::Enter, QStringLiteral("Enter"));
0030     _eventTypes.insert(QEvent::Leave, QStringLiteral("Leave"));
0031 
0032     _eventTypes.insert(QEvent::HoverMove, QStringLiteral("HoverMove"));
0033     _eventTypes.insert(QEvent::HoverEnter, QStringLiteral("HoverEnter"));
0034     _eventTypes.insert(QEvent::HoverLeave, QStringLiteral("HoverLeave"));
0035 
0036     _eventTypes.insert(QEvent::MouseMove, QStringLiteral("MouseMove"));
0037     _eventTypes.insert(QEvent::MouseButtonPress, QStringLiteral("MouseButtonPress"));
0038     _eventTypes.insert(QEvent::MouseButtonRelease, QStringLiteral("MouseButtonRelease"));
0039 
0040     _eventTypes.insert(QEvent::FocusIn, QStringLiteral("FocusIn"));
0041     _eventTypes.insert(QEvent::FocusOut, QStringLiteral("FocusOut"));
0042 
0043     // _eventTypes.insert( QEvent::Paint, "Paint" );
0044 }
0045 
0046 //________________________________________________
0047 void WidgetExplorer::setEnabled(bool value)
0048 {
0049     if (value == _enabled)
0050         return;
0051     _enabled = value;
0052 
0053     qApp->removeEventFilter(this);
0054     if (_enabled)
0055         qApp->installEventFilter(this);
0056 }
0057 
0058 //________________________________________________
0059 bool WidgetExplorer::eventFilter(QObject *object, QEvent *event)
0060 {
0061     if (object->isWidgetType()) {
0062         QString type(_eventTypes[event->type()]);
0063         if (!type.isEmpty()) {
0064             std::cout << "Oxygen::WidgetExplorer::eventFilter - widget: " << object << " (" << object->metaObject()->className() << ")";
0065             std::cout << " type: " << qPrintable(type) << std::endl;
0066         }
0067     }
0068 
0069     switch (event->type()) {
0070     case QEvent::Paint:
0071         if (_drawWidgetRects) {
0072             QWidget *widget(qobject_cast<QWidget *>(object));
0073             if (!widget)
0074                 return false;
0075 
0076             QPainter painter(widget);
0077             painter.setRenderHints(QPainter::Antialiasing);
0078             painter.setBrush(Qt::NoBrush);
0079             painter.setPen(Qt::red);
0080             painter.drawRect(widget->rect());
0081             painter.end();
0082         }
0083         break;
0084 
0085     case QEvent::MouseButtonPress: {
0086         // cast event and check button
0087         QMouseEvent *mouseEvent(static_cast<QMouseEvent *>(event));
0088         if (mouseEvent->button() != Qt::LeftButton)
0089             break;
0090 
0091         // case widget and check (should not be necessary)
0092         QWidget *widget(qobject_cast<QWidget *>(object));
0093         if (!widget)
0094             return false;
0095 
0096         std::cout << "Oxygen::WidgetExplorer::eventFilter -"
0097                   << " event: " << event << " type: " << qPrintable(eventType(event->type())) << " widget: " << qPrintable(widgetInformation(widget))
0098                   << std::endl;
0099 
0100         // print parent information
0101         QWidget *parent(widget->parentWidget());
0102         while (parent) {
0103             std::cout << "    parent: " << qPrintable(widgetInformation(parent)) << std::endl;
0104             parent = parent->parentWidget();
0105         }
0106         std::cout << "" << std::endl;
0107 
0108     } break;
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()
0141                       << " hover: " << widget->testAttribute(Qt::WA_Hover);
0142     return out;
0143 }
0144 }