File indexing completed on 2024-04-28 15:51:46

0001 /* This file was part of the KDE libraries (copied partially from kmenu.cpp)
0002 
0003     SPDX-License-Identifier: LGPL-2.0-only
0004 */
0005 
0006 #include "okmenutitle.h"
0007 
0008 #include <QApplication>
0009 #include <QEvent>
0010 #include <QKeyEvent>
0011 #include <QMenu>
0012 #include <QToolButton>
0013 
0014 OKMenuTitle::OKMenuTitle(QMenu *menu, const QString &text, const QIcon &icon)
0015     : QWidgetAction(menu)
0016 {
0017     QAction *buttonAction = new QAction(menu);
0018     QFont font = buttonAction->font();
0019     font.setBold(true);
0020     buttonAction->setFont(font);
0021     buttonAction->setText(text);
0022     buttonAction->setIcon(icon);
0023 
0024     QToolButton *titleButton = new QToolButton(menu);
0025     titleButton->installEventFilter(this); // prevent clicks on the title of the menu
0026     titleButton->setDefaultAction(buttonAction);
0027     titleButton->setDown(true); // prevent hover style changes in some styles
0028     titleButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
0029     setDefaultWidget(titleButton);
0030 }
0031 
0032 bool OKMenuTitle::eventFilter(QObject *object, QEvent *event)
0033 {
0034     Q_UNUSED(object);
0035 
0036     if (event->type() == QEvent::Paint) {
0037         return QWidgetAction::eventFilter(object, event);
0038     } else if (event->type() == QEvent::KeyRelease) {
0039         // If we're receiving the key release event is because we just gained
0040         // focus though a key event, use the same key to move it to the next action
0041         if (static_cast<QMenu *>(parent())->activeAction() == this) {
0042             QKeyEvent *ke = static_cast<QKeyEvent *>(event);
0043             QKeyEvent newKe(QEvent::KeyPress, ke->key(), ke->modifiers(), ke->text(), ke->isAutoRepeat(), ke->count());
0044             QApplication::sendEvent(parent(), &newKe);
0045         }
0046 
0047         // TODO What happens when there's multiple OKMenuTitle or only OKMenuTitle in a menu
0048     }
0049 
0050     event->accept();
0051     return true;
0052 }