Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qquickactiongroup.cpp
Go to the documentation of this file.
1// Copyright (C) 2020 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
5
6#include <QtCore/private/qobject_p.h>
7#include <QtCore/qmetaobject.h>
8#include <QtCore/qvariant.h>
9#include <QtQml/qqmlinfo.h>
10
11#include "qquickaction_p.h"
12#include "qquickaction_p_p.h"
13
14#include <QtCore/qpointer.h>
15
17
22
110{
111public:
112 Q_DECLARE_PUBLIC(QQuickActionGroup)
113
114 void clear();
115 void actionTriggered();
116 void _q_updateCurrent();
117
118 static bool changeEnabled(QQuickAction *action, bool enabled);
119
120 static void actions_append(QQmlListProperty<QQuickAction> *prop, QQuickAction *obj);
121 static qsizetype actions_count(QQmlListProperty<QQuickAction> *prop);
122 static QQuickAction *actions_at(QQmlListProperty<QQuickAction> *prop, qsizetype index);
123 static void actions_clear(QQmlListProperty<QQuickAction> *prop);
124
125 bool enabled = true;
126 bool exclusive = true;
127 QPointer<QQuickAction> checkedAction;
128 QList<QQuickAction*> actions;
129};
130
140
142{
144 QQuickAction *action = qobject_cast<QQuickAction*>(q->sender());
145 if (action)
146 emit q->triggered(action);
147}
148
150{
152 if (!exclusive)
153 return;
154 QQuickAction *action = qobject_cast<QQuickAction*>(q->sender());
155 if (action && action->isChecked())
156 q->setCheckedAction(action);
157 else if (!actions.contains(checkedAction))
158 q->setCheckedAction(nullptr);
159}
160
162{
163 return action->isEnabled() != enabled && (!enabled || !QQuickActionPrivate::get(action)->explicitEnabled);
164}
165
166void QQuickActionGroupPrivate::actions_append(QQmlListProperty<QQuickAction> *prop, QQuickAction *obj)
167{
168 QQuickActionGroup *q = static_cast<QQuickActionGroup *>(prop->object);
169 q->addAction(obj);
170}
171
172qsizetype QQuickActionGroupPrivate::actions_count(QQmlListProperty<QQuickAction> *prop)
173{
174 QQuickActionGroupPrivate *p = static_cast<QQuickActionGroupPrivate *>(prop->data);
175 return p->actions.size();
176}
177
179{
180 QQuickActionGroupPrivate *p = static_cast<QQuickActionGroupPrivate *>(prop->data);
181 return p->actions.value(index);
182}
183
184void QQuickActionGroupPrivate::actions_clear(QQmlListProperty<QQuickAction> *prop)
185{
186 QQuickActionGroupPrivate *p = static_cast<QQuickActionGroupPrivate *>(prop->data);
187 if (!p->actions.isEmpty()) {
188 p->clear();
189 QQuickActionGroup *q = static_cast<QQuickActionGroup *>(prop->object);
190 // QTBUG-52358: don't clear the checked action immediately
192 emit q->actionsChanged();
193 }
194}
195
200
206
211
223{
224 Q_D(const QQuickActionGroup);
225 return d->checkedAction;
226}
227
229{
231 if (d->checkedAction == checkedAction)
232 return;
233
234 if (d->checkedAction)
235 d->checkedAction->setChecked(false);
236 d->checkedAction = checkedAction;
237 if (checkedAction)
240}
241
250QQmlListProperty<QQuickAction> QQuickActionGroup::actions()
251{
253 return QQmlListProperty<QQuickAction>(this, d,
258}
259
277{
278 Q_D(const QQuickActionGroup);
279 return d->exclusive;
280}
281
283{
285 if (d->exclusive == exclusive)
286 return;
287
288 d->exclusive = exclusive;
290}
291
301{
302 Q_D(const QQuickActionGroup);
303 return d->enabled;
304}
305
307{
309 if (d->enabled == enabled)
310 return;
311
312 for (QQuickAction *action : std::as_const(d->actions)) {
313 if (d->changeEnabled(action, enabled))
314 emit action->enabledChanged(enabled);
315 }
316
317 d->enabled = enabled;
319}
320
333{
335 if (!action || d->actions.contains(action))
336 return;
337
338 const bool enabledChange = d->changeEnabled(action, d->enabled);
339
340 QQuickActionPrivate::get(action)->group = this;
343
344 if (d->exclusive && action->isChecked())
345 setCheckedAction(action);
346 if (enabledChange)
347 emit action->enabledChanged(action->isEnabled());
348
349 d->actions.append(action);
351}
352
365{
367 if (!action || !d->actions.contains(action))
368 return;
369
370 const bool enabledChange = d->changeEnabled(action, d->enabled);
371
372 QQuickActionPrivate::get(action)->group = nullptr;
375
376 if (d->checkedAction == action)
377 setCheckedAction(nullptr);
378 if (enabledChange)
379 emit action->enabledChanged(action->isEnabled());
380
381 d->actions.removeOne(action);
383}
384
386{
387public:
389};
390
395
419{
420 Q_D(const QQuickActionGroupAttached);
421 return d->group;
422}
423
425{
427 if (d->group == group)
428 return;
429
430 if (d->group)
431 d->group->removeAction(qobject_cast<QQuickAction*>(parent()));
432 d->group = group;
433 if (group)
434 group->addAction(qobject_cast<QQuickAction*>(parent()));
436}
437
439
440#include "moc_qquickactiongroup_p.cpp"
qsizetype size() const noexcept
Definition qlist.h:397
T value(qsizetype i) const
Definition qlist.h:664
void clear()
Definition qlist.h:434
static QMetaObject::Connection connect(const typename QtPrivate::FunctionPointer< Func1 >::Object *sender, Func1 signal, const typename QtPrivate::FunctionPointer< Func2 >::Object *receiverPrivate, Func2 slot, Qt::ConnectionType type=Qt::AutoConnection)
Definition qobject_p.h:299
static bool disconnect(const typename QtPrivate::FunctionPointer< Func1 >::Object *sender, Func1 signal, const typename QtPrivate::FunctionPointer< Func2 >::Object *receiverPrivate, Func2 slot)
Definition qobject_p.h:328
\inmodule QtCore
Definition qobject.h:103
QObject * parent() const
Returns a pointer to the parent object.
Definition qobject.h:346
QQuickActionGroupAttached(QObject *parent=nullptr)
void setGroup(QQuickActionGroup *group)
Groups actions together.
static void actions_append(QQmlListProperty< QQuickAction > *prop, QQuickAction *obj)
static QQuickAction * actions_at(QQmlListProperty< QQuickAction > *prop, qsizetype index)
static qsizetype actions_count(QQmlListProperty< QQuickAction > *prop)
QPointer< QQuickAction > checkedAction
static void actions_clear(QQmlListProperty< QQuickAction > *prop)
QList< QQuickAction * > actions
static bool changeEnabled(QQuickAction *action, bool enabled)
bool isExclusive() const
\qmlproperty bool QtQuick.Controls::ActionGroup::exclusive
void setExclusive(bool exclusive)
bool isEnabled() const
\qmlproperty bool QtQuick.Controls::ActionGroup::enabled
void setCheckedAction(QQuickAction *checkedAction)
void checkedActionChanged()
void setEnabled(bool enabled)
void addAction(QQuickAction *action)
\qmlmethod void QtQuick.Controls::ActionGroup::addAction(Action action)
QQuickActionGroup(QObject *parent=nullptr)
QQmlListProperty< QQuickAction > actions
\qmlproperty list<Action> QtQuick.Controls::ActionGroup::actions \qmldefault
void removeAction(QQuickAction *action)
\qmlmethod void QtQuick.Controls::ActionGroup::removeAction(Action action)
static QQuickActionGroupAttached * qmlAttachedProperties(QObject *object)
QQuickAction * checkedAction
static QQuickActionPrivate * get(QQuickAction *action)
void triggered(QObject *source=nullptr)
void checkedChanged(bool checked)
void enabledChanged(bool enabled)
void setChecked(bool checked)
bool isEnabled() const
\qmlproperty bool QtQuick.Controls::Action::enabled
bool isChecked() const
\qmlproperty bool QtQuick.Controls::Action::checked
Combined button and popup list for selecting options.
@ QueuedConnection
GLuint index
[2]
GLenum GLenum GLsizei const GLuint GLboolean enabled
GLboolean GLuint group
GLhandleARB obj
[2]
GLdouble GLdouble GLdouble GLdouble q
Definition qopenglext.h:259
GLfloat GLfloat p
[1]
#define emit
ptrdiff_t qsizetype
Definition qtypes.h:165
bool contains(const AT &t) const noexcept
Definition qlist.h:45
static bool invokeMethod(QObject *obj, const char *member, Qt::ConnectionType, QGenericReturnArgument ret, QGenericArgument val0=QGenericArgument(nullptr), QGenericArgument val1=QGenericArgument(), QGenericArgument val2=QGenericArgument(), QGenericArgument val3=QGenericArgument(), QGenericArgument val4=QGenericArgument(), QGenericArgument val5=QGenericArgument(), QGenericArgument val6=QGenericArgument(), QGenericArgument val7=QGenericArgument(), QGenericArgument val8=QGenericArgument(), QGenericArgument val9=QGenericArgument())
\threadsafe This is an overloaded member function, provided for convenience. It differs from the abov...