10#include <QtCore/qpointer.h>
11#include <QtCore/qloggingcategory.h>
12#include <QtGui/qevent.h>
13#if QT_CONFIG(shortcut)
14# include <QtGui/private/qshortcutmap_p.h>
16#include <QtGui/private/qguiapplication_p.h>
17#include <QtQuick/private/qquickitem_p.h>
21Q_STATIC_LOGGING_CATEGORY(lcAction,
"qt.quick.controls.action")
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
69
70
71
72
73
74
75
76
77
80
81
82
83
84
85
86
87
88
90#if QT_CONFIG(shortcut)
91static QKeySequence variantToKeySequence(
const QVariant &var)
93 if (var.metaType().id() == QMetaType::Int)
94 return QKeySequence(
static_cast<QKeySequence::StandardKey>(var.toInt()));
95 return QKeySequence::fromString(var.toString());
98QQuickActionPrivate::ShortcutEntry::ShortcutEntry(QObject *target)
103QQuickActionPrivate::ShortcutEntry::~ShortcutEntry()
108QObject *QQuickActionPrivate::ShortcutEntry::target()
const
113int QQuickActionPrivate::ShortcutEntry::shortcutId()
const
118void QQuickActionPrivate::ShortcutEntry::grab(
const QKeySequence &shortcut,
bool enabled)
120 if (shortcut.isEmpty() || m_shortcutId)
123 Qt::ShortcutContext context = Qt::WindowShortcut;
124 m_shortcutId = QGuiApplicationPrivate::instance()->shortcutMap.addShortcut(m_target, shortcut, context, QQuickShortcutContext::matcher);
127 QGuiApplicationPrivate::instance()->shortcutMap.setShortcutEnabled(
false, m_shortcutId, m_target);
130void QQuickActionPrivate::ShortcutEntry::ungrab()
135 QGuiApplicationPrivate::instance()->shortcutMap.removeShortcut(m_shortcutId, m_target);
139void QQuickActionPrivate::ShortcutEntry::setEnabled(
bool enabled)
144 QGuiApplicationPrivate::instance()->shortcutMap.setShortcutEnabled(enabled, m_shortcutId, m_target);
147QVariant QQuickActionPrivate::shortcut()
const
152void QQuickActionPrivate::setShortcut(
const QVariant &var)
155 if (vshortcut == var)
158 defaultShortcutEntry->ungrab();
159 for (QQuickActionPrivate::ShortcutEntry *entry : std::as_const(shortcutEntries))
163 keySequence = variantToKeySequence(var);
165 defaultShortcutEntry->grab(keySequence, enabled);
166 for (QQuickActionPrivate::ShortcutEntry *entry : std::as_const(shortcutEntries))
167 entry->grab(keySequence, enabled);
169 emit q->shortcutChanged(keySequence);
173void QQuickActionPrivate::setEnabled(
bool enable)
176 if (enabled == enable)
181#if QT_CONFIG(shortcut)
182 defaultShortcutEntry->setEnabled(enable);
183 for (QQuickActionPrivate::ShortcutEntry *entry : std::as_const(shortcutEntries))
184 entry->setEnabled(enable);
187 emit q->enabledChanged(enable);
196 item->installEventFilter(q);
197 QQuickItemPrivate::get(item)->addItemChangeListener(
this, QQuickItemPrivate::Visibility | QQuickItemPrivate::Destroyed);
207 item->removeEventFilter(q);
208 QQuickItemPrivate::get(item)->removeItemChangeListener(
this, QQuickItemPrivate::Visibility | QQuickItemPrivate::Destroyed);
214 if (!watchItem(item))
217#if QT_CONFIG(shortcut)
218 QQuickActionPrivate::ShortcutEntry *entry =
new QQuickActionPrivate::ShortcutEntry(item);
219 if (item->isVisible())
220 entry->grab(keySequence, enabled);
221 shortcutEntries += entry;
223 updateDefaultShortcutEntry();
229#if QT_CONFIG(shortcut)
230 QQuickActionPrivate::ShortcutEntry *entry = findShortcutEntry(item);
231 if (!entry || !unwatchItem(item))
234 shortcutEntries.removeOne(entry);
237 updateDefaultShortcutEntry();
245#if QT_CONFIG(shortcut)
246 QQuickActionPrivate::ShortcutEntry *entry = findShortcutEntry(item);
250 if (item->isVisible())
251 entry->grab(keySequence, enabled);
255 updateDefaultShortcutEntry();
263 unregisterItem(item);
266#if QT_CONFIG(shortcut)
267bool QQuickActionPrivate::handleShortcutEvent(QObject *object, QShortcutEvent *event)
270 if (event->key() != keySequence)
273 QQuickActionPrivate::ShortcutEntry *entry = findShortcutEntry(object);
274 if (!entry || event->shortcutId() != entry->shortcutId())
277 q->trigger(entry->target());
281QQuickActionPrivate::ShortcutEntry *QQuickActionPrivate::findShortcutEntry(QObject *target)
const
283 Q_Q(
const QQuickAction);
285 return defaultShortcutEntry;
286 for (QQuickActionPrivate::ShortcutEntry *entry : shortcutEntries) {
287 if (entry->target() == target)
293void QQuickActionPrivate::updateDefaultShortcutEntry()
295 bool hasActiveShortcutEntries =
false;
296 for (QQuickActionPrivate::ShortcutEntry *entry : std::as_const(shortcutEntries)) {
297 if (entry->shortcutId()) {
298 hasActiveShortcutEntries =
true;
303 if (hasActiveShortcutEntries)
304 defaultShortcutEntry->ungrab();
305 else if (!defaultShortcutEntry->shortcutId())
306 defaultShortcutEntry->grab(keySequence, enabled);
310QQuickAction::QQuickAction(QObject *parent)
311 : QObject(*(
new QQuickActionPrivate), parent)
313#if QT_CONFIG(shortcut)
315 d->defaultShortcutEntry =
new QQuickActionPrivate::ShortcutEntry(
this);
319QQuickAction::~QQuickAction()
322 qCDebug(lcAction) <<
"destroying" <<
this << d->text;
324 d->group->removeAction(
this);
326#if QT_CONFIG(shortcut)
327 for (QQuickActionPrivate::ShortcutEntry *entry : std::as_const(d->shortcutEntries))
328 d->unwatchItem(qobject_cast<QQuickItem *>(entry->target()));
330 qDeleteAll(d->shortcutEntries);
331 delete d->defaultShortcutEntry;
336
337
338
339
340QString QQuickAction::text()
const
342 Q_D(
const QQuickAction);
346void QQuickAction::setText(
const QString &text)
353 emit textChanged(text);
357
358
359
360
361
362
363
364
365
366QQuickIcon QQuickAction::icon()
const
368 Q_D(
const QQuickAction);
372void QQuickAction::setIcon(
const QQuickIcon &icon)
379 d->icon.ensureRelativeSourceResolved(
this);
380 emit iconChanged(icon);
384
385
386
387
388bool QQuickAction::isEnabled()
const
390 Q_D(
const QQuickAction);
391 return d->enabled && (!d->group || d->group->isEnabled());
394void QQuickAction::setEnabled(
bool enabled)
397 d->explicitEnabled =
true;
398 d->setEnabled(enabled);
401void QQuickAction::resetEnabled()
404 if (!d->explicitEnabled)
407 d->explicitEnabled =
false;
412
413
414
415
416
417
418bool QQuickAction::isChecked()
const
420 Q_D(
const QQuickAction);
424void QQuickAction::setChecked(
bool checked)
427 if (d->checked == checked)
430 d->checked = checked;
431 emit checkedChanged(checked);
435
436
437
438
439
440
441
442
443bool QQuickAction::isCheckable()
const
445 Q_D(
const QQuickAction);
449void QQuickAction::setCheckable(
bool checkable)
452 if (d->checkable == checkable)
455 d->checkable = checkable;
456 emit checkableChanged(checkable);
459#if QT_CONFIG(shortcut)
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475QKeySequence QQuickAction::shortcut()
const
477 Q_D(
const QQuickAction);
478 return d->keySequence;
481void QQuickAction::setShortcut(
const QKeySequence &shortcut)
484 d->setShortcut(shortcut.toString());
489
490
491
492
493void QQuickAction::toggle(QObject *source)
500 setChecked(!d->checked);
502 emit toggled(source);
506
507
508
509
510void QQuickAction::trigger(QObject *source)
513 d->trigger(source,
true);
522 QPointer<QObject> guard = q;
524 if (checkable && (!checked || !group || !group->isExclusive() || group->checkedAction() != q)) {
528 emit q->toggled(source);
532 emit q->triggered(source);
535bool QQuickAction::event(QEvent *event)
537#if QT_CONFIG(shortcut)
539 if (event->type() == QEvent::Shortcut)
540 return d->handleShortcutEvent(
this,
static_cast<QShortcutEvent *>(event));
542 return QObject::event(event);
545bool QQuickAction::eventFilter(QObject *object, QEvent *event)
547#if QT_CONFIG(shortcut)
549 if (event->type() == QEvent::Shortcut)
550 return d->handleShortcutEvent(object,
static_cast<QShortcutEvent *>(event));
560#include "moc_qquickaction_p.cpp"
void itemDestroyed(QQuickItem *item) override
void registerItem(QQuickItem *item)
bool watchItem(QQuickItem *item)
void itemVisibilityChanged(QQuickItem *item) override
bool unwatchItem(QQuickItem *item)
void unregisterItem(QQuickItem *item)