63 case Qt::ApplicationShortcut:
65 case Qt::WindowShortcut: {
66 while (obj && !obj->isWindowType()) {
68 if (QQuickItem *item = qobject_cast<QQuickItem *>(obj))
71 const QWindow *focusWindow = QGuiApplication::focusWindow();
72 if (!obj || !focusWindow)
74 if (obj == focusWindow)
76 return QQuickRenderControlPrivate::isFocusWindowFor(
77 qobject_cast<QQuickWindow *>(obj), focusWindow);
101 if (value.userType() == QMetaType::Int) {
102 const QList<QKeySequence> s =
103 QKeySequence::keyBindings(
static_cast<QKeySequence::StandardKey>(value.toInt()));
105 const QString templateString = QString::fromUtf16(
106 u"Shortcut: Only binding to one of multiple key bindings associated with %1. "
107 u"Use 'sequences: [ <key> ]' to bind to all of them.");
109 << templateString.arg(
static_cast<QKeySequence::StandardKey>(value.toInt()));
111 return s.size() > 0 ? s[0] : QKeySequence {};
112 }
else if (value.userType() == QMetaType::QKeySequence) {
113 return value.value<QKeySequence>();
116 return QKeySequence::fromString(value.toString());
121 if (value.userType() == QMetaType::Int) {
122 return QKeySequence::keyBindings(
static_cast<QKeySequence::StandardKey>(value.toInt()));
124 QList<QKeySequence> result;
125 if (value.userType() == QMetaType::QKeySequence)
126 result.push_back(value.value<QKeySequence>());
128 result.push_back(QKeySequence::fromString(value.toString()));
173void QQuickShortcut::setSequence(
const QVariant &value)
175 if (value == m_shortcut.userValue)
178 QKeySequence keySequence = valueToKeySequence(value,
this);
180 ungrabShortcut(m_shortcut);
181 m_shortcut.userValue = value;
182 m_shortcut.keySequence = keySequence;
183 grabShortcut(m_shortcut, m_context);
184 emit sequenceChanged();
185 if (m_shortcuts.isEmpty()) {
188 emit nativeTextChanged();
189 emit portableTextChanged();
217void QQuickShortcut::setSequences(
const QVariantList &values)
220 QList<Shortcut> requestedShortcuts;
221 for (
const QVariant &v : values) {
222 const QList<QKeySequence> list = valueToKeySequences(v);
223 for (
const QKeySequence &s : list) {
227 requestedShortcuts.push_back(sc);
232 if (m_shortcuts.size() == requestedShortcuts.size()) {
233 bool changed =
false;
234 for (
int i = 0; i < requestedShortcuts.size(); ++i) {
235 const Shortcut &requestedShortcut = requestedShortcuts[i];
236 const Shortcut &shortcut = m_shortcuts[i];
237 if (!(requestedShortcut.userValue == shortcut.userValue
238 && requestedShortcut.keySequence == shortcut.keySequence)) {
248 const Shortcut oldUsedShortcut = m_shortcuts.isEmpty() ? m_shortcut
249 : m_shortcuts.first();
251 for (Shortcut &s : m_shortcuts)
253 m_shortcuts = requestedShortcuts;
254 for (Shortcut &s : m_shortcuts)
255 grabShortcut(s, m_context);
257 const Shortcut currentUsedShortcut = m_shortcuts.isEmpty() ? m_shortcut
258 : m_shortcuts.first();
260 emit sequencesChanged();
261 if (oldUsedShortcut.keySequence != currentUsedShortcut.keySequence) {
262 emit nativeTextChanged();
263 emit portableTextChanged();
318void QQuickShortcut::setEnabled(
bool enabled)
320 if (enabled == m_enabled)
323 setEnabled(m_shortcut, enabled);
324 for (Shortcut &shortcut : m_shortcuts)
325 setEnabled(shortcut, enabled);
328 emit enabledChanged();
343void QQuickShortcut::setAutoRepeat(
bool repeat)
345 if (repeat == m_autorepeat)
348 setAutoRepeat(m_shortcut, repeat);
349 for (Shortcut &shortcut : m_shortcuts)
350 setAutoRepeat(shortcut, repeat);
352 m_autorepeat = repeat;
353 emit autoRepeatChanged();
381void QQuickShortcut::setContext(Qt::ShortcutContext context)
383 if (context == m_context)
386 ungrabShortcut(m_shortcut);
387 for (
auto &s : m_shortcuts)
392 grabShortcut(m_shortcut, context);
393 for (
auto &s : m_shortcuts)
394 grabShortcut(s, context);
396 emit contextChanged();
403void QQuickShortcut::componentComplete()
406 grabShortcut(m_shortcut, m_context);
407 for (Shortcut &shortcut : m_shortcuts)
408 grabShortcut(shortcut, m_context);
411bool QQuickShortcut::event(QEvent *event)
413 if (m_enabled && event->type() == QEvent::Shortcut) {
414 QShortcutEvent *se =
static_cast<QShortcutEvent *>(event);
415 bool match = m_shortcut.matches(se);
417 while (!match && i < m_shortcuts.size())
418 match |= m_shortcuts.at(i++).matches(se);
420 if (se->isAmbiguous())
421 emit activatedAmbiguously();
447void QQuickShortcut::grabShortcut(Shortcut &shortcut, Qt::ShortcutContext context)
449 if (m_completed && !shortcut.keySequence.isEmpty()) {
450 QGuiApplicationPrivate *pApp = QGuiApplicationPrivate::instance();
451 shortcut.id = pApp->shortcutMap.addShortcut(
this, shortcut.keySequence, context, *ctxMatcher());
453 pApp->shortcutMap.setShortcutEnabled(
false, shortcut.id,
this);
455 pApp->shortcutMap.setShortcutAutoRepeat(
false, shortcut.id,
this);