-
Notifications
You must be signed in to change notification settings - Fork 14
/
pqMenuEventTranslator.cxx
152 lines (142 loc) · 3.97 KB
/
pqMenuEventTranslator.cxx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
// SPDX-FileCopyrightText: Copyright (c) Kitware Inc.
// SPDX-FileCopyrightText: Copyright (c) Sandia Corporation
// SPDX-License-Identifier: BSD-3-Clause
#include "pqMenuEventTranslator.h"
#include <QAction>
#include <QEvent>
#include <QKeyEvent>
#include <QMenu>
#include <QMenuBar>
#include <QMouseEvent>
pqMenuEventTranslator::pqMenuEventTranslator(QObject* p)
: pqWidgetEventTranslator(p)
{
}
pqMenuEventTranslator::~pqMenuEventTranslator() {}
bool pqMenuEventTranslator::translateEvent(QObject* Object, QEvent* Event, bool& Error)
{
QMenu* const menu = qobject_cast<QMenu*>(Object);
QMenuBar* const menubar = qobject_cast<QMenuBar*>(Object);
if (!menu && !menubar)
{
return false;
}
if (menubar)
{
QMouseEvent* e = dynamic_cast<QMouseEvent*>(Event);
if (e && e->button() == Qt::LeftButton)
{
QAction* action = menubar->actionAt(e->pos());
if (action && action->menu())
{
QString which = action->menu()->objectName();
if (which.isEmpty())
{
which = action->text();
}
Q_EMIT recordEvent(menubar, "activate", which);
}
}
return true;
}
const auto actionArgument = [](QAction* action) -> QString {
QString argument = action->objectName();
if (argument.isNull())
{
argument = action->text();
}
return argument;
};
if (Event->type() == QEvent::Show)
{
// If this menu has any sub-menu's record this menu as the parent for subsequent enter event.
for (auto action : menu->actions())
{
if (action->menu())
{
this->SubMenuParent[action] = menu;
}
}
return true;
}
else if (Event->type() == QEvent::Enter)
{
// Note: Using QEvent::Enter instead of QEvent::FocusIn here because the menu
// can be activated without first getting focus.
if (this->SubMenuParent.find(menu->menuAction()) != this->SubMenuParent.end())
{ // Then a previous menu has recorded this action as a sub-menu
Q_EMIT recordEvent(
this->SubMenuParent[menu->menuAction()], "activate", actionArgument(menu->menuAction()));
}
}
else if (Event->type() == QEvent::Close || Event->type() == QEvent::Hide)
{
// Clean up sub-menu mapping
for (auto it = this->SubMenuParent.begin(); it != this->SubMenuParent.end();)
{
if (it->second == menu)
{
it = this->SubMenuParent.erase(it);
}
else
{
++it;
}
}
return true;
}
else if (Event->type() == QEvent::KeyPress)
{
QKeyEvent* e = static_cast<QKeyEvent*>(Event);
if (e->key() == Qt::Key_Enter || e->key() == Qt::Key_Return)
{
QAction* action = menu->activeAction();
if (action)
{
Q_EMIT recordEvent(menu, "activate", actionArgument(action));
}
}
else if (e->key() == Qt::Key_Right)
{
QAction* action = menu->activeAction();
if (action && action->menu())
{
Q_EMIT recordEvent(menu, "activate", actionArgument(action));
}
}
else
{
for (auto action : menu->actions())
{
const QKeySequence mnemonic = QKeySequence::mnemonic(action->text());
if (!mnemonic.isEmpty())
{ // Then the action has a keyboard accelerator
#if QT_VERSION >= 0x060000
if (mnemonic ==
QKeySequence(QKeyCombination(e->modifiers(), static_cast<Qt::Key>(e->key()))))
#else
if (mnemonic == QKeySequence(e->modifiers() + e->key()))
#endif
{
Q_EMIT recordEvent(menu, "activate", actionArgument(action));
}
}
}
}
return true;
}
else if (Event->type() == QEvent::MouseButtonRelease)
{
QMouseEvent* e = static_cast<QMouseEvent*>(Event);
if (e->button() == Qt::LeftButton)
{
QAction* action = menu->actionAt(e->pos());
if (action && !action->menu())
{
Q_EMIT recordEvent(menu, "activate", actionArgument(action));
}
}
return true;
}
return this->Superclass::translateEvent(Object, Event, Error);
}