63 case Qt::ApplicationShortcut:
65 case Qt::WindowShortcut:
66 while (obj && !obj->isWindowType()) {
68 if (QQuickItem *item = qobject_cast<QQuickItem *>(obj))
71 if (QWindow *renderWindow = QQuickRenderControl::renderWindowFor(qobject_cast<QQuickWindow *>(obj)))
73 return obj && obj == QGuiApplication::focusWindow();
96 if (value.userType() == QMetaType::Int) {
97 const QVector<QKeySequence> s =
98 QKeySequence::keyBindings(
static_cast<QKeySequence::StandardKey>(value.toInt()));
100 const QString templateString = QString::fromUtf16(
101 u"Shortcut: Only binding to one of multiple key bindings associated with %1. "
102 u"Use 'sequences: [ <key> ]' to bind to all of them.");
104 << templateString.arg(
static_cast<QKeySequence::StandardKey>(value.toInt()));
106 return s.size() > 0 ? s[0] : QKeySequence {};
109 return QKeySequence::fromString(value.toString());
163void QQuickShortcut::setSequence(
const QVariant &value)
165 if (value == m_shortcut.userValue)
168 QKeySequence keySequence = valueToKeySequence(value,
this);
170 ungrabShortcut(m_shortcut);
171 m_shortcut.userValue = value;
172 m_shortcut.keySequence = keySequence;
173 grabShortcut(m_shortcut, m_context);
174 emit sequenceChanged();
175 if (m_shortcuts.isEmpty()) {
178 emit nativeTextChanged();
179 emit portableTextChanged();
207void QQuickShortcut::setSequences(
const QVariantList &values)
210 QVector<Shortcut> requestedShortcuts;
211 for (
const QVariant &v : values) {
212 const QVector<QKeySequence> list = valueToKeySequences(v);
213 for (
const QKeySequence &s : list) {
217 requestedShortcuts.push_back(sc);
222 if (m_shortcuts.size() == requestedShortcuts.size()) {
223 bool changed =
false;
224 for (
int i = 0; i < requestedShortcuts.size(); ++i) {
225 const Shortcut &requestedShortcut = requestedShortcuts[i];
226 const Shortcut &shortcut = m_shortcuts[i];
227 if (!(requestedShortcut.userValue == shortcut.userValue
228 && requestedShortcut.keySequence == shortcut.keySequence)) {
238 const Shortcut oldUsedShortcut = m_shortcuts.isEmpty() ? m_shortcut
239 : m_shortcuts.first();
241 for (Shortcut &s : m_shortcuts)
243 m_shortcuts = requestedShortcuts;
244 for (Shortcut &s : m_shortcuts)
245 grabShortcut(s, m_context);
247 const Shortcut currentUsedShortcut = m_shortcuts.isEmpty() ? m_shortcut
248 : m_shortcuts.first();
250 emit sequencesChanged();
251 if (oldUsedShortcut.keySequence != currentUsedShortcut.keySequence) {
252 emit nativeTextChanged();
253 emit portableTextChanged();
308void QQuickShortcut::setEnabled(
bool enabled)
310 if (enabled == m_enabled)
313 setEnabled(m_shortcut, enabled);
314 for (Shortcut &shortcut : m_shortcuts)
315 setEnabled(shortcut, enabled);
318 emit enabledChanged();
333void QQuickShortcut::setAutoRepeat(
bool repeat)
335 if (repeat == m_autorepeat)
338 setAutoRepeat(m_shortcut, repeat);
339 for (Shortcut &shortcut : m_shortcuts)
340 setAutoRepeat(shortcut, repeat);
342 m_autorepeat = repeat;
343 emit autoRepeatChanged();
371void QQuickShortcut::setContext(Qt::ShortcutContext context)
373 if (context == m_context)
376 ungrabShortcut(m_shortcut);
377 for (
auto &s : m_shortcuts)
382 grabShortcut(m_shortcut, context);
383 for (
auto &s : m_shortcuts)
384 grabShortcut(s, context);
386 emit contextChanged();
393void QQuickShortcut::componentComplete()
396 grabShortcut(m_shortcut, m_context);
397 for (Shortcut &shortcut : m_shortcuts)
398 grabShortcut(shortcut, m_context);
401bool QQuickShortcut::event(QEvent *event)
403 if (m_enabled && event->type() == QEvent::Shortcut) {
404 QShortcutEvent *se =
static_cast<QShortcutEvent *>(event);
405 bool match = m_shortcut.matches(se);
407 while (!match && i < m_shortcuts.size())
408 match |= m_shortcuts.at(i++).matches(se);
410 if (se->isAmbiguous())
411 emit activatedAmbiguously();
437void QQuickShortcut::grabShortcut(Shortcut &shortcut, Qt::ShortcutContext context)
439 if (m_completed && !shortcut.keySequence.isEmpty()) {
440 QGuiApplicationPrivate *pApp = QGuiApplicationPrivate::instance();
441 shortcut.id = pApp->shortcutMap.addShortcut(
this, shortcut.keySequence, context, *ctxMatcher());
443 pApp->shortcutMap.setShortcutEnabled(
false, shortcut.id,
this);
445 pApp->shortcutMap.setShortcutAutoRepeat(
false, shortcut.id,
this);