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 return QKeySequence::fromString(var.toString());
100QQuickActionPrivate::ShortcutEntry::ShortcutEntry(QObject *target)
105QQuickActionPrivate::ShortcutEntry::~ShortcutEntry()
110QObject *QQuickActionPrivate::ShortcutEntry::target()
const
115int QQuickActionPrivate::ShortcutEntry::shortcutId()
const
120void QQuickActionPrivate::ShortcutEntry::grab(
const QKeySequence &shortcut,
bool enabled)
122 qCDebug(lcShortcutEntry) <<
"- grab called with" << shortcut <<
"enabled" << enabled
123 <<
"for" << m_target;
124 if (shortcut.isEmpty() || m_shortcutId)
127 Qt::ShortcutContext context = Qt::WindowShortcut;
128 m_shortcutId = QGuiApplicationPrivate::instance()->shortcutMap.addShortcut(m_target, shortcut, context, QQuickShortcutContext::matcher);
131 QGuiApplicationPrivate::instance()->shortcutMap.setShortcutEnabled(
false, m_shortcutId, m_target);
134void QQuickActionPrivate::ShortcutEntry::ungrab()
136 qCDebug(lcShortcutEntry).nospace() <<
"- ungrab called for " << m_target <<
", m_shortcutId is "
141 QGuiApplicationPrivate::instance()->shortcutMap.removeShortcut(m_shortcutId, m_target);
145void QQuickActionPrivate::ShortcutEntry::setEnabled(
bool enabled)
150 QGuiApplicationPrivate::instance()->shortcutMap.setShortcutEnabled(enabled, m_shortcutId, m_target);
153QVariant QQuickActionPrivate::shortcut()
const
158void QQuickActionPrivate::setShortcut(
const QVariant &var)
161 if (vshortcut == var)
164 qCDebug(lcAction) << q <<
"setShortcut called with" << var;
165 defaultShortcutEntry->ungrab();
166 for (QQuickActionPrivate::ShortcutEntry *entry : std::as_const(shortcutEntries))
170 keySequence = variantToKeySequence(var);
172 defaultShortcutEntry->grab(keySequence, enabled);
173 for (QQuickActionPrivate::ShortcutEntry *entry : std::as_const(shortcutEntries))
174 entry->grab(keySequence, enabled);
176 emit q->shortcutChanged(keySequence);
180void QQuickActionPrivate::setEnabled(
bool enable)
183 if (enabled == enable)
188#if QT_CONFIG(shortcut)
189 defaultShortcutEntry->setEnabled(enable);
190 for (QQuickActionPrivate::ShortcutEntry *entry : std::as_const(shortcutEntries))
191 entry->setEnabled(enable);
194 emit q->enabledChanged(enable);
203 item->installEventFilter(q);
204 QQuickItemPrivate::get(item)->addItemChangeListener(
this, QQuickItemPrivate::Visibility | QQuickItemPrivate::Destroyed);
214 item->removeEventFilter(q);
215 QQuickItemPrivate::get(item)->removeItemChangeListener(
this, QQuickItemPrivate::Visibility | QQuickItemPrivate::Destroyed);
221 if (!watchItem(item))
224#if QT_CONFIG(shortcut)
225 qCDebug(lcAction) << q_func() <<
"registerItem called with" << item;
226 QQuickActionPrivate::ShortcutEntry *entry =
new QQuickActionPrivate::ShortcutEntry(item);
227 if (item->isVisible())
228 entry->grab(keySequence, enabled);
229 shortcutEntries += entry;
231 updateDefaultShortcutEntry();
237#if QT_CONFIG(shortcut)
238 QQuickActionPrivate::ShortcutEntry *entry = findShortcutEntry(item);
239 if (!entry || !unwatchItem(item))
242 qCDebug(lcAction) << q_func() <<
"unregisterItem called with" << item;
243 shortcutEntries.removeOne(entry);
246 updateDefaultShortcutEntry();
254#if QT_CONFIG(shortcut)
255 QQuickActionPrivate::ShortcutEntry *entry = findShortcutEntry(item);
259 qCDebug(lcAction) << q_func() <<
"visibility of" << item <<
"changed to" << item->isVisible()
260 <<
"- grabbing/ungrabbing shortcut";
261 if (item->isVisible())
262 entry->grab(keySequence, enabled);
266 updateDefaultShortcutEntry();
274 unregisterItem(item);
277#if QT_CONFIG(shortcut)
278bool QQuickActionPrivate::handleShortcutEvent(QObject *object, QShortcutEvent *event)
281 if (event->key() != keySequence)
284 QQuickActionPrivate::ShortcutEntry *entry = findShortcutEntry(object);
285 if (!entry || event->shortcutId() != entry->shortcutId())
288 q->trigger(entry->target());
292QQuickActionPrivate::ShortcutEntry *QQuickActionPrivate::findShortcutEntry(QObject *target)
const
294 Q_Q(
const QQuickAction);
296 return defaultShortcutEntry;
297 for (QQuickActionPrivate::ShortcutEntry *entry : shortcutEntries) {
298 if (entry->target() == target)
304void QQuickActionPrivate::updateDefaultShortcutEntry()
306 bool hasActiveShortcutEntries =
false;
307 for (QQuickActionPrivate::ShortcutEntry *entry : std::as_const(shortcutEntries)) {
308 if (entry->shortcutId()) {
309 hasActiveShortcutEntries =
true;
314 if (hasActiveShortcutEntries) {
316 defaultShortcutEntry->ungrab();
317 }
else if (!defaultShortcutEntry->shortcutId()) {
320 defaultShortcutEntry->grab(keySequence, enabled);
325QQuickAction::QQuickAction(QObject *parent)
326 : QObject(*(
new QQuickActionPrivate), parent)
328#if QT_CONFIG(shortcut)
330 d->defaultShortcutEntry =
new QQuickActionPrivate::ShortcutEntry(
this);
334QQuickAction::~QQuickAction()
337 qCDebug(lcAction) <<
"destroying" <<
this << d->text;
339 d->group->removeAction(
this);
341#if QT_CONFIG(shortcut)
342 for (QQuickActionPrivate::ShortcutEntry *entry : std::as_const(d->shortcutEntries))
343 d->unwatchItem(qobject_cast<QQuickItem *>(entry->target()));
345 qDeleteAll(d->shortcutEntries);
346 delete d->defaultShortcutEntry;
351
352
353
354
355QString QQuickAction::text()
const
357 Q_D(
const QQuickAction);
361void QQuickAction::setText(
const QString &text)
368 emit textChanged(text);
372
373
374
375
376
377
378
379
380
381QQuickIcon QQuickAction::icon()
const
383 Q_D(
const QQuickAction);
387void QQuickAction::setIcon(
const QQuickIcon &icon)
395 const bool oldColorResolved = QQuickIconPrivate::isResolved(d->icon, QQuickIconPrivate::ColorResolved);
396 const bool newColorResolved = QQuickIconPrivate::isResolved(icon, QQuickIconPrivate::ColorResolved);
397 const bool unchanged = d->icon == icon && oldColorResolved && !newColorResolved;
404 d->icon.ensureRelativeSourceResolved(
this);
405 emit iconChanged(icon);
409
410
411
412
413bool QQuickAction::isEnabled()
const
415 Q_D(
const QQuickAction);
416 return d->enabled && (!d->group || d->group->isEnabled());
419void QQuickAction::setEnabled(
bool enabled)
422 d->explicitEnabled =
true;
423 d->setEnabled(enabled);
426void QQuickAction::resetEnabled()
429 if (!d->explicitEnabled)
432 d->explicitEnabled =
false;
437
438
439
440
441
442
443bool QQuickAction::isChecked()
const
445 Q_D(
const QQuickAction);
449void QQuickAction::setChecked(
bool checked)
452 if (d->checked == checked)
455 d->checked = checked;
456 emit checkedChanged(checked);
460
461
462
463
464
465
466
467
468bool QQuickAction::isCheckable()
const
470 Q_D(
const QQuickAction);
474void QQuickAction::setCheckable(
bool checkable)
477 if (d->checkable == checkable)
480 d->checkable = checkable;
481 emit checkableChanged(checkable);
484#if QT_CONFIG(shortcut)
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501QKeySequence QQuickAction::shortcut()
const
503 Q_D(
const QQuickAction);
504 return d->keySequence;
507void QQuickAction::setShortcut(
const QKeySequence &shortcut)
510 d->setShortcut(shortcut.toString());
515
516
517
518
519void QQuickAction::toggle(QObject *source)
526 setChecked(!d->checked);
528 emit toggled(source);
532
533
534
535
536void QQuickAction::trigger(QObject *source)
539 d->trigger(source,
true);
548 QPointer<QObject> guard = q;
550 if (checkable && (!checked || !group || !group->isExclusive() || group->checkedAction() != q)) {
554 emit q->toggled(source);
558 emit q->triggered(source);
561bool QQuickAction::event(QEvent *event)
563#if QT_CONFIG(shortcut)
565 if (event->type() == QEvent::Shortcut)
566 return d->handleShortcutEvent(
this,
static_cast<QShortcutEvent *>(event));
568 return QObject::event(event);
571bool QQuickAction::eventFilter(QObject *object, QEvent *event)
573#if QT_CONFIG(shortcut)
575 if (event->type() == QEvent::Shortcut)
576 return d->handleShortcutEvent(object,
static_cast<QShortcutEvent *>(event));
586#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.