BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
CustomEventFilters.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file GUI/coregui/utils/CustomEventFilters.cpp
6 //! @brief Defines classes releted to event filtering
7 //!
8 //! @homepage http://www.bornagainproject.org
9 //! @license GNU General Public License v3 or higher (see COPYING)
10 //! @copyright Forschungszentrum Jülich GmbH 2018
11 //! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS)
12 //
13 // ************************************************************************************************
14 
16 #include <QApplication>
17 #include <QComboBox>
18 #include <QKeyEvent>
19 #include <QString>
20 
21 SpaceKeyEater::SpaceKeyEater(QObject* parent) : QObject(parent) {}
22 
23 bool SpaceKeyEater::eventFilter(QObject* obj, QEvent* event)
24 {
25  if (event->type() == QEvent::KeyPress) {
26  QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
27  bool res = QObject::eventFilter(obj, event);
28 
29  if (keyEvent->key() == Qt::Key_Space) {
30  return true; /* Always accept space bar */
31  } else {
32  return res;
33  }
34  } else {
35  // standard event processing
36  return QObject::eventFilter(obj, event);
37  }
38 }
39 
40 // ----------------------------------------------------------------------------
41 
42 WheelEventEater::WheelEventEater(QObject* parent) : QObject(parent) {}
43 
44 bool WheelEventEater::eventFilter(QObject* obj, QEvent* event)
45 {
46  if (QAbstractSpinBox* spinBox = qobject_cast<QAbstractSpinBox*>(obj)) {
47 
48  if (event->type() == QEvent::Wheel) {
49  if (spinBox->focusPolicy() == Qt::WheelFocus) {
50  event->accept();
51  return false;
52  } else {
53  event->ignore();
54  return true;
55  }
56  } else if (event->type() == QEvent::FocusIn) {
57  spinBox->setFocusPolicy(Qt::WheelFocus);
58  } else if (event->type() == QEvent::FocusOut) {
59  spinBox->setFocusPolicy(Qt::StrongFocus);
60  }
61  } else if (qobject_cast<QComboBox*>(obj)) {
62  if (event->type() == QEvent::Wheel) {
63  event->ignore();
64  return true;
65  } else {
66  event->accept();
67  return false;
68  }
69  }
70  return QObject::eventFilter(obj, event);
71 }
72 
73 // ----------------------------------------------------------------------------
74 
75 bool DeleteEventFilter::eventFilter(QObject* dist, QEvent* event)
76 {
77  Q_UNUSED(dist);
78  if (event->type() == QEvent::KeyPress) {
79  QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
80  if (keyEvent->key() == Qt::Key_Delete)
81  emit removeItem();
82  }
83  return QObject::eventFilter(dist, event);
84 }
85 
86 // ----------------------------------------------------------------------------
87 
88 LostFocusFilter::LostFocusFilter(QObject* parent) : QObject(parent) {}
89 
90 bool LostFocusFilter::eventFilter(QObject* obj, QEvent* event)
91 {
92  if (event->type() == QEvent::FocusOut)
93  return true;
94 
95  return QObject::eventFilter(obj, event);
96 }
97 
98 // ----------------------------------------------------------------------------
99 
100 ShortcodeFilter::ShortcodeFilter(const QString& shortcode, QObject* parent)
101  : QObject(parent), m_shortcode(shortcode), m_index(0)
102 {
103 }
104 
105 bool ShortcodeFilter::eventFilter(QObject* obj, QEvent* event)
106 {
107  Q_UNUSED(obj);
108  if (event->type() == QEvent::KeyPress) {
109  QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
110  if (m_shortcode.at(m_index) == keyEvent->text()) {
111  m_index++;
112  if (m_index == m_shortcode.length()) {
113  emit found();
114  m_index = 0;
115  }
116  } else {
117  int right = m_index;
118  while (m_index > 0) {
119  if (m_shortcode.at(m_index - 1) == keyEvent->text()
120  && m_shortcode.left(m_index - 1)
121  == m_shortcode.mid(right - m_index + 1, m_index - 1))
122  break;
123  m_index--;
124  }
125  }
126  }
127  return false;
128 }
129 
130 RightMouseButtonEater::RightMouseButtonEater(QObject* parent) : QObject(parent) {}
131 
132 bool RightMouseButtonEater::eventFilter(QObject* obj, QEvent* event)
133 {
134  if (event->type() == QEvent::MouseButtonPress) {
135  QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event);
136  if (mouseEvent->button() == Qt::RightButton) {
137  event->ignore();
138  return true;
139  } else {
140  event->accept();
141  return false;
142  }
143  } else {
144  // standard event processing
145  return QObject::eventFilter(obj, event);
146  }
147 }
148 
149 //! Passing focus-related events from child widget (e.g. QSpinBox) to parent (e.g. IntEditor)
150 //! to trigger QTreeView delegate's mechanism to switch editors on "tab" press key.
151 //! https://stackoverflow.com/questions/12145522/why-pressing-of-tab-key-emits-only-qeventshortcutoverride-event
152 
153 TabFromFocusProxy::TabFromFocusProxy(QWidget* parent) : QObject(parent), m_parent(parent)
154 {
155  if (parent->focusProxy())
156  parent->focusProxy()->installEventFilter(this);
157 }
158 
159 bool TabFromFocusProxy::eventFilter(QObject* obj, QEvent* event)
160 {
161  if (event->type() == QEvent::KeyPress) {
162  QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
163  if (keyEvent->key() == Qt::Key_Tab || keyEvent->key() == Qt::Key_Backtab) {
164  // we are posting event as if m_parent had "tab" key
165  QApplication::postEvent(
166  m_parent, new QKeyEvent(keyEvent->type(), keyEvent->key(), keyEvent->modifiers()));
167 
168  // but still let the origin (QSpinBox) to process it
169  return false; // process
170  }
171  }
172 
173  else if (event->type() == QEvent::FocusOut) {
174  QFocusEvent* focusEvent = static_cast<QFocusEvent*>(event);
175  QApplication::postEvent(this, new QFocusEvent(focusEvent->type(), focusEvent->reason()));
176 
177  // Don't filter because focus can be changed internally in editor
178  return false;
179  }
180 
181  return QObject::eventFilter(obj, event);
182 }
Defines classes releted to event filtering.
bool eventFilter(QObject *dist, QEvent *event)
LostFocusFilter(QObject *parent=0)
bool eventFilter(QObject *obj, QEvent *event)
bool eventFilter(QObject *obj, QEvent *event)
RightMouseButtonEater(QObject *parent=0)
bool eventFilter(QObject *obj, QEvent *event)
ShortcodeFilter(const QString &shortcode, QObject *parent=0)
SpaceKeyEater(QObject *parent=0)
bool eventFilter(QObject *obj, QEvent *event)
bool eventFilter(QObject *obj, QEvent *event)
TabFromFocusProxy(QWidget *parent=0)
Passing focus-related events from child widget (e.g.
WheelEventEater(QObject *parent=0)
bool eventFilter(QObject *obj, QEvent *event)