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>
18#include <QtQuickTemplates2/private/qquickicon_p_p.h>
22Q_STATIC_LOGGING_CATEGORY(lcAction,
"qt.quick.controls.action")
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
67
70
71
72
73
74
75
76
77
78
81
82
83
84
85
86
87
88
89
91#if QT_CONFIG(shortcut)
92static QKeySequence variantToKeySequence(
const QVariant &var)
94 if (var.metaType().id() == QMetaType::Int)
95 return QKeySequence(
static_cast<QKeySequence::StandardKey>(var.toInt()));
96 return QKeySequence::fromString(var.toString());
99QQuickActionPrivate::ShortcutEntry::ShortcutEntry(QObject *target)
104QQuickActionPrivate::ShortcutEntry::~ShortcutEntry()
109QObject *QQuickActionPrivate::ShortcutEntry::target()
const
114int QQuickActionPrivate::ShortcutEntry::shortcutId()
const
119void QQuickActionPrivate::ShortcutEntry::grab(
const QKeySequence &shortcut,
bool enabled)
121 if (shortcut.isEmpty() || m_shortcutId)
124 Qt::ShortcutContext context = Qt::WindowShortcut;
125 m_shortcutId = QGuiApplicationPrivate::instance()->shortcutMap.addShortcut(m_target, shortcut, context, QQuickShortcutContext::matcher);
128 QGuiApplicationPrivate::instance()->shortcutMap.setShortcutEnabled(
false, m_shortcutId, m_target);
131void QQuickActionPrivate::ShortcutEntry::ungrab()
136 QGuiApplicationPrivate::instance()->shortcutMap.removeShortcut(m_shortcutId, m_target);
140void QQuickActionPrivate::ShortcutEntry::setEnabled(
bool enabled)
145 QGuiApplicationPrivate::instance()->shortcutMap.setShortcutEnabled(enabled, m_shortcutId, m_target);
148QVariant QQuickActionPrivate::shortcut()
const
153void QQuickActionPrivate::setShortcut(
const QVariant &var)
156 if (vshortcut == var)
159 defaultShortcutEntry->ungrab();
160 for (QQuickActionPrivate::ShortcutEntry *entry : std::as_const(shortcutEntries))
164 keySequence = variantToKeySequence(var);
166 defaultShortcutEntry->grab(keySequence, enabled);
167 for (QQuickActionPrivate::ShortcutEntry *entry : std::as_const(shortcutEntries))
168 entry->grab(keySequence, enabled);
170 emit q->shortcutChanged(keySequence);
174void QQuickActionPrivate::setEnabled(
bool enable)
177 if (enabled == enable)
182#if QT_CONFIG(shortcut)
183 defaultShortcutEntry->setEnabled(enable);
184 for (QQuickActionPrivate::ShortcutEntry *entry : std::as_const(shortcutEntries))
185 entry->setEnabled(enable);
188 emit q->enabledChanged(enable);
197 item->installEventFilter(q);
198 QQuickItemPrivate::get(item)->addItemChangeListener(
this, QQuickItemPrivate::Visibility | QQuickItemPrivate::Destroyed);
208 item->removeEventFilter(q);
209 QQuickItemPrivate::get(item)->removeItemChangeListener(
this, QQuickItemPrivate::Visibility | QQuickItemPrivate::Destroyed);
215 if (!watchItem(item))
218#if QT_CONFIG(shortcut)
219 QQuickActionPrivate::ShortcutEntry *entry =
new QQuickActionPrivate::ShortcutEntry(item);
220 if (item->isVisible())
221 entry->grab(keySequence, enabled);
222 shortcutEntries += entry;
224 updateDefaultShortcutEntry();
230#if QT_CONFIG(shortcut)
231 QQuickActionPrivate::ShortcutEntry *entry = findShortcutEntry(item);
232 if (!entry || !unwatchItem(item))
235 shortcutEntries.removeOne(entry);
238 updateDefaultShortcutEntry();
246#if QT_CONFIG(shortcut)
247 QQuickActionPrivate::ShortcutEntry *entry = findShortcutEntry(item);
251 if (item->isVisible())
252 entry->grab(keySequence, enabled);
256 updateDefaultShortcutEntry();
264 unregisterItem(item);
267#if QT_CONFIG(shortcut)
268bool QQuickActionPrivate::handleShortcutEvent(QObject *object, QShortcutEvent *event)
271 if (event->key() != keySequence)
274 QQuickActionPrivate::ShortcutEntry *entry = findShortcutEntry(object);
275 if (!entry || event->shortcutId() != entry->shortcutId())
278 q->trigger(entry->target());
282QQuickActionPrivate::ShortcutEntry *QQuickActionPrivate::findShortcutEntry(QObject *target)
const
284 Q_Q(
const QQuickAction);
286 return defaultShortcutEntry;
287 for (QQuickActionPrivate::ShortcutEntry *entry : shortcutEntries) {
288 if (entry->target() == target)
294void QQuickActionPrivate::updateDefaultShortcutEntry()
296 bool hasActiveShortcutEntries =
false;
297 for (QQuickActionPrivate::ShortcutEntry *entry : std::as_const(shortcutEntries)) {
298 if (entry->shortcutId()) {
299 hasActiveShortcutEntries =
true;
304 if (hasActiveShortcutEntries)
305 defaultShortcutEntry->ungrab();
306 else if (!defaultShortcutEntry->shortcutId())
307 defaultShortcutEntry->grab(keySequence, enabled);
311QQuickAction::QQuickAction(QObject *parent)
312 : QObject(*(
new QQuickActionPrivate), parent)
314#if QT_CONFIG(shortcut)
316 d->defaultShortcutEntry =
new QQuickActionPrivate::ShortcutEntry(
this);
320QQuickAction::~QQuickAction()
323 qCDebug(lcAction) <<
"destroying" <<
this << d->text;
325 d->group->removeAction(
this);
327#if QT_CONFIG(shortcut)
328 for (QQuickActionPrivate::ShortcutEntry *entry : std::as_const(d->shortcutEntries))
329 d->unwatchItem(qobject_cast<QQuickItem *>(entry->target()));
331 qDeleteAll(d->shortcutEntries);
332 delete d->defaultShortcutEntry;
337
338
339
340
341QString QQuickAction::text()
const
343 Q_D(
const QQuickAction);
347void QQuickAction::setText(
const QString &text)
354 emit textChanged(text);
358
359
360
361
362
363
364
365
366
367QQuickIcon QQuickAction::icon()
const
369 Q_D(
const QQuickAction);
373void QQuickAction::setIcon(
const QQuickIcon &icon)
381 const bool oldColorResolved = QQuickIconPrivate::isResolved(d->icon, QQuickIconPrivate::ColorResolved);
382 const bool newColorResolved = QQuickIconPrivate::isResolved(icon, QQuickIconPrivate::ColorResolved);
383 const bool unchanged = d->icon == icon && oldColorResolved && !newColorResolved;
390 d->icon.ensureRelativeSourceResolved(
this);
391 emit iconChanged(icon);
395
396
397
398
399bool QQuickAction::isEnabled()
const
401 Q_D(
const QQuickAction);
402 return d->enabled && (!d->group || d->group->isEnabled());
405void QQuickAction::setEnabled(
bool enabled)
408 d->explicitEnabled =
true;
409 d->setEnabled(enabled);
412void QQuickAction::resetEnabled()
415 if (!d->explicitEnabled)
418 d->explicitEnabled =
false;
423
424
425
426
427
428
429bool QQuickAction::isChecked()
const
431 Q_D(
const QQuickAction);
435void QQuickAction::setChecked(
bool checked)
438 if (d->checked == checked)
441 d->checked = checked;
442 emit checkedChanged(checked);
446
447
448
449
450
451
452
453
454bool QQuickAction::isCheckable()
const
456 Q_D(
const QQuickAction);
460void QQuickAction::setCheckable(
bool checkable)
463 if (d->checkable == checkable)
466 d->checkable = checkable;
467 emit checkableChanged(checkable);
470#if QT_CONFIG(shortcut)
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486QKeySequence QQuickAction::shortcut()
const
488 Q_D(
const QQuickAction);
489 return d->keySequence;
492void QQuickAction::setShortcut(
const QKeySequence &shortcut)
495 d->setShortcut(shortcut.toString());
500
501
502
503
504void QQuickAction::toggle(QObject *source)
511 setChecked(!d->checked);
513 emit toggled(source);
517
518
519
520
521void QQuickAction::trigger(QObject *source)
524 d->trigger(source,
true);
533 QPointer<QObject> guard = q;
535 if (checkable && (!checked || !group || !group->isExclusive() || group->checkedAction() != q)) {
539 emit q->toggled(source);
543 emit q->triggered(source);
546bool QQuickAction::event(QEvent *event)
548#if QT_CONFIG(shortcut)
550 if (event->type() == QEvent::Shortcut)
551 return d->handleShortcutEvent(
this,
static_cast<QShortcutEvent *>(event));
553 return QObject::event(event);
556bool QQuickAction::eventFilter(QObject *object, QEvent *event)
558#if QT_CONFIG(shortcut)
560 if (event->type() == QEvent::Shortcut)
561 return d->handleShortcutEvent(object,
static_cast<QShortcutEvent *>(event));
571#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)
Combined button and popup list for selecting options.