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 QList<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 {};
107 }
else if (value.userType() == QMetaType::QKeySequence) {
108 return value.value<QKeySequence>();
111 return QKeySequence::fromString(value.toString());
116 if (value.userType() == QMetaType::Int) {
117 return QKeySequence::keyBindings(
static_cast<QKeySequence::StandardKey>(value.toInt()));
119 QList<QKeySequence> result;
120 if (value.userType() == QMetaType::QKeySequence)
121 result.push_back(value.value<QKeySequence>());
123 result.push_back(QKeySequence::fromString(value.toString()));
168void QQuickShortcut::setSequence(
const QVariant &value)
170 if (value == m_shortcut.userValue)
173 QKeySequence keySequence = valueToKeySequence(value,
this);
175 ungrabShortcut(m_shortcut);
176 m_shortcut.userValue = value;
177 m_shortcut.keySequence = keySequence;
178 grabShortcut(m_shortcut, m_context);
179 emit sequenceChanged();
180 if (m_shortcuts.isEmpty()) {
183 emit nativeTextChanged();
184 emit portableTextChanged();
212void QQuickShortcut::setSequences(
const QVariantList &values)
215 QList<Shortcut> requestedShortcuts;
216 for (
const QVariant &v : values) {
217 const QList<QKeySequence> list = valueToKeySequences(v);
218 for (
const QKeySequence &s : list) {
222 requestedShortcuts.push_back(sc);
227 if (m_shortcuts.size() == requestedShortcuts.size()) {
228 bool changed =
false;
229 for (
int i = 0; i < requestedShortcuts.size(); ++i) {
230 const Shortcut &requestedShortcut = requestedShortcuts[i];
231 const Shortcut &shortcut = m_shortcuts[i];
232 if (!(requestedShortcut.userValue == shortcut.userValue
233 && requestedShortcut.keySequence == shortcut.keySequence)) {
243 const Shortcut oldUsedShortcut = m_shortcuts.isEmpty() ? m_shortcut
244 : m_shortcuts.first();
246 for (Shortcut &s : m_shortcuts)
248 m_shortcuts = requestedShortcuts;
249 for (Shortcut &s : m_shortcuts)
250 grabShortcut(s, m_context);
252 const Shortcut currentUsedShortcut = m_shortcuts.isEmpty() ? m_shortcut
253 : m_shortcuts.first();
255 emit sequencesChanged();
256 if (oldUsedShortcut.keySequence != currentUsedShortcut.keySequence) {
257 emit nativeTextChanged();
258 emit portableTextChanged();
313void QQuickShortcut::setEnabled(
bool enabled)
315 if (enabled == m_enabled)
318 setEnabled(m_shortcut, enabled);
319 for (Shortcut &shortcut : m_shortcuts)
320 setEnabled(shortcut, enabled);
323 emit enabledChanged();
338void QQuickShortcut::setAutoRepeat(
bool repeat)
340 if (repeat == m_autorepeat)
343 setAutoRepeat(m_shortcut, repeat);
344 for (Shortcut &shortcut : m_shortcuts)
345 setAutoRepeat(shortcut, repeat);
347 m_autorepeat = repeat;
348 emit autoRepeatChanged();
376void QQuickShortcut::setContext(Qt::ShortcutContext context)
378 if (context == m_context)
381 ungrabShortcut(m_shortcut);
382 for (
auto &s : m_shortcuts)
387 grabShortcut(m_shortcut, context);
388 for (
auto &s : m_shortcuts)
389 grabShortcut(s, context);
391 emit contextChanged();
398void QQuickShortcut::componentComplete()
401 grabShortcut(m_shortcut, m_context);
402 for (Shortcut &shortcut : m_shortcuts)
403 grabShortcut(shortcut, m_context);
406bool QQuickShortcut::event(QEvent *event)
408 if (m_enabled && event->type() == QEvent::Shortcut) {
409 QShortcutEvent *se =
static_cast<QShortcutEvent *>(event);
410 bool match = m_shortcut.matches(se);
412 while (!match && i < m_shortcuts.size())
413 match |= m_shortcuts.at(i++).matches(se);
415 if (se->isAmbiguous())
416 emit activatedAmbiguously();
442void QQuickShortcut::grabShortcut(Shortcut &shortcut, Qt::ShortcutContext context)
444 if (m_completed && !shortcut.keySequence.isEmpty()) {
445 QGuiApplicationPrivate *pApp = QGuiApplicationPrivate::instance();
446 shortcut.id = pApp->shortcutMap.addShortcut(
this, shortcut.keySequence, context, *ctxMatcher());
448 pApp->shortcutMap.setShortcutEnabled(
false, shortcut.id,
this);
450 pApp->shortcutMap.setShortcutAutoRepeat(
false, shortcut.id,
this);