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")
23Q_STATIC_LOGGING_CATEGORY(lcShortcutEntry,
"qt.quick.controls.action.shortcutEntry")
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
68
71
72
73
74
75
76
77
78
79
82
83
84
85
86
87
88
89
90
92#if QT_CONFIG(shortcut)
93static QKeySequence variantToKeySequence(
const QVariant &var)
95 if (var.metaType().id() == QMetaType::Int)
96 return QKeySequence(
static_cast<QKeySequence::StandardKey>(var.toInt()));
97 else if (var.metaType().id() == QMetaType::QKeySequence)
98 return var.value<QKeySequence>();
99 return QKeySequence::fromString(var.toString());
102QQuickActionPrivate::ShortcutEntry::ShortcutEntry(QObject *target)
107QQuickActionPrivate::ShortcutEntry::~ShortcutEntry()
112QObject *QQuickActionPrivate::ShortcutEntry::target()
const
117int QQuickActionPrivate::ShortcutEntry::shortcutId()
const
122void QQuickActionPrivate::ShortcutEntry::grab(
const QKeySequence &shortcut,
bool enabled)
124 qCDebug(lcShortcutEntry) <<
"- grab called with" << shortcut <<
"enabled" << enabled
125 <<
"for" << m_target;
126 if (shortcut.isEmpty() || m_shortcutId)
129 Qt::ShortcutContext context = Qt::WindowShortcut;
130 m_shortcutId = QGuiApplicationPrivate::instance()->shortcutMap.addShortcut(m_target, shortcut, context, QQuickShortcutContext::matcher);
133 QGuiApplicationPrivate::instance()->shortcutMap.setShortcutEnabled(
false, m_shortcutId, m_target);
136void QQuickActionPrivate::ShortcutEntry::ungrab()
138 qCDebug(lcShortcutEntry).nospace() <<
"- ungrab called for " << m_target <<
", m_shortcutId is "
143 QGuiApplicationPrivate::instance()->shortcutMap.removeShortcut(m_shortcutId, m_target);
147void QQuickActionPrivate::ShortcutEntry::setEnabled(
bool enabled)
152 QGuiApplicationPrivate::instance()->shortcutMap.setShortcutEnabled(enabled, m_shortcutId, m_target);
155QVariant QQuickActionPrivate::shortcut()
const
160void QQuickActionPrivate::setShortcut(
const QVariant &var)
163 if (vshortcut == var)
166 qCDebug(lcAction) << q <<
"setShortcut called with" << var;
167 defaultShortcutEntry->ungrab();
168 for (QQuickActionPrivate::ShortcutEntry *entry : std::as_const(shortcutEntries))
172 keySequence = variantToKeySequence(var);
174 defaultShortcutEntry->grab(keySequence, enabled);
175 for (QQuickActionPrivate::ShortcutEntry *entry : std::as_const(shortcutEntries))
176 entry->grab(keySequence, enabled);
178 emit q->shortcutChanged(keySequence);
182void QQuickActionPrivate::setEnabled(
bool enable)
185 if (enabled == enable)
190#if QT_CONFIG(shortcut)
191 defaultShortcutEntry->setEnabled(enable);
192 for (QQuickActionPrivate::ShortcutEntry *entry : std::as_const(shortcutEntries))
193 entry->setEnabled(enable);
196 emit q->enabledChanged(enable);
205 item->installEventFilter(q);
206 QQuickItemPrivate::get(item)->addItemChangeListener(
this, QQuickItemPrivate::Visibility | QQuickItemPrivate::Destroyed);
216 item->removeEventFilter(q);
217 QQuickItemPrivate::get(item)->removeItemChangeListener(
this, QQuickItemPrivate::Visibility | QQuickItemPrivate::Destroyed);
223 if (!watchItem(item))
226#if QT_CONFIG(shortcut)
227 qCDebug(lcAction) << q_func() <<
"registerItem called with" << item;
228 QQuickActionPrivate::ShortcutEntry *entry =
new QQuickActionPrivate::ShortcutEntry(item);
229 if (item->isVisible())
230 entry->grab(keySequence, enabled);
231 shortcutEntries += entry;
233 updateDefaultShortcutEntry();
239#if QT_CONFIG(shortcut)
240 QQuickActionPrivate::ShortcutEntry *entry = findShortcutEntry(item);
241 if (!entry || !unwatchItem(item))
244 qCDebug(lcAction) << q_func() <<
"unregisterItem called with" << item;
245 shortcutEntries.removeOne(entry);
248 updateDefaultShortcutEntry();
256#if QT_CONFIG(shortcut)
257 QQuickActionPrivate::ShortcutEntry *entry = findShortcutEntry(item);
261 qCDebug(lcAction) << q_func() <<
"visibility of" << item <<
"changed to" << item->isVisible()
262 <<
"- grabbing/ungrabbing shortcut";
263 if (item->isVisible())
264 entry->grab(keySequence, enabled);
268 updateDefaultShortcutEntry();
276 unregisterItem(item);
279#if QT_CONFIG(shortcut)
280bool QQuickActionPrivate::handleShortcutEvent(QObject *object, QShortcutEvent *event)
283 if (event->key() != keySequence)
286 QQuickActionPrivate::ShortcutEntry *entry = findShortcutEntry(object);
287 if (!entry || event->shortcutId() != entry->shortcutId())
290 q->trigger(entry->target());
294QQuickActionPrivate::ShortcutEntry *QQuickActionPrivate::findShortcutEntry(QObject *target)
const
296 Q_Q(
const QQuickAction);
298 return defaultShortcutEntry;
299 for (QQuickActionPrivate::ShortcutEntry *entry : shortcutEntries) {
300 if (entry->target() == target)
306void QQuickActionPrivate::updateDefaultShortcutEntry()
308 bool hasActiveShortcutEntries =
false;
309 for (QQuickActionPrivate::ShortcutEntry *entry : std::as_const(shortcutEntries)) {
310 if (entry->shortcutId()) {
311 hasActiveShortcutEntries =
true;
316 if (hasActiveShortcutEntries) {
318 defaultShortcutEntry->ungrab();
319 }
else if (!defaultShortcutEntry->shortcutId()) {
322 defaultShortcutEntry->grab(keySequence, enabled);
327QQuickAction::QQuickAction(QObject *parent)
328 : QObject(*(
new QQuickActionPrivate), parent)
330#if QT_CONFIG(shortcut)
332 d->defaultShortcutEntry =
new QQuickActionPrivate::ShortcutEntry(
this);
336QQuickAction::~QQuickAction()
339 qCDebug(lcAction) <<
"destroying" <<
this << d->text;
341 d->group->removeAction(
this);
343#if QT_CONFIG(shortcut)
344 for (QQuickActionPrivate::ShortcutEntry *entry : std::as_const(d->shortcutEntries))
345 d->unwatchItem(qobject_cast<QQuickItem *>(entry->target()));
347 qDeleteAll(d->shortcutEntries);
348 delete d->defaultShortcutEntry;
353
354
355
356
357QString QQuickAction::text()
const
359 Q_D(
const QQuickAction);
363void QQuickAction::setText(
const QString &text)
370 emit textChanged(text);
374
375
376
377
378
379
380
381
382
383QQuickIcon QQuickAction::icon()
const
385 Q_D(
const QQuickAction);
389void QQuickAction::setIcon(
const QQuickIcon &icon)
397 const bool oldColorResolved = QQuickIconPrivate::isResolved(d->icon, QQuickIconPrivate::ColorResolved);
398 const bool newColorResolved = QQuickIconPrivate::isResolved(icon, QQuickIconPrivate::ColorResolved);
399 const bool unchanged = d->icon == icon && oldColorResolved && !newColorResolved;
406 d->icon.ensureRelativeSourceResolved(
this);
407 emit iconChanged(icon);
411
412
413
414
415bool QQuickAction::isEnabled()
const
417 Q_D(
const QQuickAction);
418 return d->enabled && (!d->group || d->group->isEnabled());
421void QQuickAction::setEnabled(
bool enabled)
424 d->explicitEnabled =
true;
425 d->setEnabled(enabled);
428void QQuickAction::resetEnabled()
431 if (!d->explicitEnabled)
434 d->explicitEnabled =
false;
439
440
441
442
443
444
445bool QQuickAction::isChecked()
const
447 Q_D(
const QQuickAction);
451void QQuickAction::setChecked(
bool checked)
454 if (d->checked == checked)
457 d->checked = checked;
458 emit checkedChanged(checked);
462
463
464
465
466
467
468
469
470bool QQuickAction::isCheckable()
const
472 Q_D(
const QQuickAction);
476void QQuickAction::setCheckable(
bool checkable)
479 if (d->checkable == checkable)
482 d->checkable = checkable;
483 emit checkableChanged(checkable);
486#if QT_CONFIG(shortcut)
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503QKeySequence QQuickAction::shortcut()
const
505 Q_D(
const QQuickAction);
506 return d->keySequence;
509void QQuickAction::setShortcut(
const QKeySequence &shortcut)
512 d->setShortcut(shortcut.toString());
517
518
519
520
521void QQuickAction::toggle(QObject *source)
528 setChecked(!d->checked);
530 emit toggled(source);
534
535
536
537
538void QQuickAction::trigger(QObject *source)
541 d->trigger(source,
true);
545
546
547
548
555 QPointer<QObject> guard = q;
557 if (checkable && (!checked || !group || !group->isExclusive() || group->checkedAction() != q)) {
561 emit q->toggled(source);
567 emit q->triggered(source);
571bool QQuickAction::event(QEvent *event)
573#if QT_CONFIG(shortcut)
575 if (event->type() == QEvent::Shortcut)
576 return d->handleShortcutEvent(
this,
static_cast<QShortcutEvent *>(event));
578 return QObject::event(event);
581bool QQuickAction::eventFilter(QObject *object, QEvent *event)
583#if QT_CONFIG(shortcut)
585 if (event->type() == QEvent::Shortcut)
586 return d->handleShortcutEvent(object,
static_cast<QShortcutEvent *>(event));
596#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.