Cleanup QAction::visible property

Gives it its own changed signal, and simplifies setting from group,
while fixing an inconsistency in propagation.

Change-Id: I22b243210260a8878144fa4b60204df46f847f37
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
This commit is contained in:
Allan Sandfeld Jensen 2020-02-17 17:58:55 +01:00 committed by Volker Hilsheimer
parent 95056d465e
commit 030962b01c
5 changed files with 30 additions and 17 deletions

View File

@ -1050,18 +1050,30 @@ bool QAction::isEnabled() const
void QAction::setVisible(bool b) void QAction::setVisible(bool b)
{ {
Q_D(QAction); Q_D(QAction);
if (b == d->visible && b != d->forceInvisible) if (b != d->forceInvisible)
return; return;
QAPP_CHECK("setVisible");
d->forceInvisible = !b; d->forceInvisible = !b;
d->visible = b; if (b && d->group && !d->group->isVisible())
bool enabled = d->visible; return;
if (enabled && d->explicitEnabled) d->setVisible(b);
enabled = d->explicitEnabledValue;
if (!d->setEnabled(enabled, false))
d->sendDataChanged();
} }
void QActionPrivate::setVisible(bool b)
{
Q_Q(QAction);
if (b == visible)
return;
QAPP_CHECK("setVisible");
visible = b;
bool enable = visible;
if (enable && explicitEnabled)
enable = explicitEnabledValue;
QPointer guard(q);
if (!setEnabled(enable, false))
sendDataChanged();
if (guard)
emit q->visibleChanged();
}
bool QAction::isVisible() const bool QAction::isVisible() const
{ {

View File

@ -81,7 +81,7 @@ class Q_GUI_EXPORT QAction : public QObject
Q_PROPERTY(Qt::ShortcutContext shortcutContext READ shortcutContext WRITE setShortcutContext NOTIFY changed) Q_PROPERTY(Qt::ShortcutContext shortcutContext READ shortcutContext WRITE setShortcutContext NOTIFY changed)
Q_PROPERTY(bool autoRepeat READ autoRepeat WRITE setAutoRepeat NOTIFY changed) Q_PROPERTY(bool autoRepeat READ autoRepeat WRITE setAutoRepeat NOTIFY changed)
#endif // QT_CONFIG(shortcut) #endif // QT_CONFIG(shortcut)
Q_PROPERTY(bool visible READ isVisible WRITE setVisible NOTIFY changed) Q_PROPERTY(bool visible READ isVisible WRITE setVisible NOTIFY visibleChanged FINAL)
Q_PROPERTY(MenuRole menuRole READ menuRole WRITE setMenuRole NOTIFY changed) Q_PROPERTY(MenuRole menuRole READ menuRole WRITE setMenuRole NOTIFY changed)
Q_PROPERTY(bool iconVisibleInMenu READ isIconVisibleInMenu WRITE setIconVisibleInMenu NOTIFY changed) Q_PROPERTY(bool iconVisibleInMenu READ isIconVisibleInMenu WRITE setIconVisibleInMenu NOTIFY changed)
Q_PROPERTY(bool shortcutVisibleInContextMenu READ isShortcutVisibleInContextMenu WRITE setShortcutVisibleInContextMenu NOTIFY changed) Q_PROPERTY(bool shortcutVisibleInContextMenu READ isShortcutVisibleInContextMenu WRITE setShortcutVisibleInContextMenu NOTIFY changed)
@ -250,6 +250,7 @@ Q_SIGNALS:
void changed(); void changed();
void enabledChanged(bool enabled); void enabledChanged(bool enabled);
void checkableChanged(bool checkable); void checkableChanged(bool checkable);
void visibleChanged();
void triggered(bool checked = false); void triggered(bool checked = false);
void hovered(); void hovered();
void toggled(bool); void toggled(bool);

View File

@ -84,6 +84,7 @@ public:
} }
bool setEnabled(bool enable, bool byGroup); bool setEnabled(bool enable, bool byGroup);
void setVisible(bool b);
QPointer<QActionGroup> group; QPointer<QActionGroup> group;
QString text; QString text;

View File

@ -169,10 +169,8 @@ QAction *QActionGroup::addAction(QAction* a)
QObject::connect(a, &QAction::hovered, this, &QActionGroup::_q_actionHovered); QObject::connect(a, &QAction::hovered, this, &QActionGroup::_q_actionHovered);
} }
a->d_func()->setEnabled(d->enabled, true); a->d_func()->setEnabled(d->enabled, true);
if (!a->d_func()->forceInvisible) { if (!a->d_func()->forceInvisible)
a->setVisible(d->visible); a->d_func()->setVisible(d->visible);
a->d_func()->forceInvisible = false;
}
if (a->isChecked()) if (a->isChecked())
d->current = a; d->current = a;
QActionGroup *oldGroup = a->d_func()->group; QActionGroup *oldGroup = a->d_func()->group;
@ -350,10 +348,8 @@ void QActionGroup::setVisible(bool b)
Q_D(QActionGroup); Q_D(QActionGroup);
d->visible = b; d->visible = b;
for (auto action : qAsConst(d->actions)) { for (auto action : qAsConst(d->actions)) {
if (!action->d_func()->forceInvisible) { if (!action->d_func()->forceInvisible)
action->setVisible(b); action->d_func()->setVisible(b);
action->d_func()->forceInvisible = false;
}
} }
} }

View File

@ -100,6 +100,9 @@ void tst_QActionGroup::visiblePropagation()
QVERIFY( !childAction->isVisible() ); QVERIFY( !childAction->isVisible() );
QVERIFY( !anotherChildAction->isVisible() ); QVERIFY( !anotherChildAction->isVisible() );
childAction->setVisible(true);
QVERIFY( !childAction->isVisible() );
anotherChildAction->setVisible(false); anotherChildAction->setVisible(false);
testActionGroup.setVisible( true ); testActionGroup.setVisible( true );