File indexing completed on 2024-04-21 16:30:17

0001 /*
0002  * SPDX-FileCopyrightText: 2017 Kai Uwe Broulik <kde@privat.broulik.de>
0003  *
0004  * SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "middleclickactioneventfilter.h"
0008 
0009 #include <QAction>
0010 #include <QEvent>
0011 #include <QMenu>
0012 #include <QMouseEvent>
0013 #include <QToolBar>
0014 
0015 MiddleClickActionEventFilter::MiddleClickActionEventFilter(QObject *parent)
0016     : QObject(parent)
0017 {
0018 }
0019 
0020 MiddleClickActionEventFilter::~MiddleClickActionEventFilter() = default;
0021 
0022 bool MiddleClickActionEventFilter::eventFilter(QObject *watched, QEvent *event)
0023 {
0024     if (event->type() == QEvent::MouseButtonPress || event->type() == QEvent::MouseButtonRelease) {
0025         QMouseEvent *me = static_cast<QMouseEvent *>(event);
0026 
0027         if (me->button() == Qt::MiddleButton) {
0028             QToolBar *toolBar = qobject_cast<QToolBar *>(watched);
0029             if (toolBar) {
0030                 QAction *action = toolBar->actionAt(me->pos());
0031                 if (action) {
0032                     if (event->type() == QEvent::MouseButtonPress) {
0033                         m_lastMiddlePressedAction = action;
0034                     } else if (event->type() == QEvent::MouseButtonRelease) {
0035                         if (m_lastMiddlePressedAction == action) {
0036                             Q_EMIT actionMiddleClicked(action);
0037                         }
0038                         m_lastMiddlePressedAction = nullptr;
0039                     }
0040                 }
0041             }
0042             QMenu *menu = qobject_cast<QMenu *>(watched);
0043             if (menu) {
0044                 QAction *action = menu->actionAt(me->pos());
0045                 if (action) {
0046                     if (event->type() == QEvent::MouseButtonPress) {
0047                         m_lastMiddlePressedAction = action;
0048                     } else if (event->type() == QEvent::MouseButtonRelease) {
0049                         if (m_lastMiddlePressedAction == action) {
0050                             Q_EMIT actionMiddleClicked(action);
0051                             return true;
0052                         }
0053                         m_lastMiddlePressedAction = nullptr;
0054                     }
0055                 }
0056             }
0057         }
0058     }
0059 
0060     return QObject::eventFilter(watched, event);
0061 }
0062 
0063 #include "moc_middleclickactioneventfilter.cpp"