macOS: fix separator actions not showing in menus
Amends a3f3af8a8fb8f8b09d1685df5ab836244f850a62, which resulted in the last visible separator always getting hidden. Don't abuse QCocoaMenuItem::visible property to store whether the native NSMenuItem is shown, only store whether it should be shown. Rename the local variables to simplify the logic. Fixes: QTBUG-94802 Change-Id: I56e8c99a2a46d8cbdf75c4ad6cb714961f28a6a3 Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io> Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> (cherry picked from commit 6832789bbd1a19499bffd05b1cac400db2bdd948) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
parent
c44cd4097f
commit
664b368ace
@ -299,31 +299,26 @@ void QCocoaMenu::syncSeparatorsCollapsible(bool enable)
|
|||||||
QMacAutoReleasePool pool;
|
QMacAutoReleasePool pool;
|
||||||
if (enable) {
|
if (enable) {
|
||||||
bool previousIsSeparator = true; // setting to true kills all the separators placed at the top.
|
bool previousIsSeparator = true; // setting to true kills all the separators placed at the top.
|
||||||
NSMenuItem *previousItem = nil;
|
NSMenuItem *lastVisibleItem = nil;
|
||||||
|
|
||||||
for (NSMenuItem *item in m_nativeMenu.itemArray) {
|
for (NSMenuItem *item in m_nativeMenu.itemArray) {
|
||||||
if (item.separatorItem) {
|
if (item.separatorItem) {
|
||||||
// hide item if previous was a separator, or if it's explicitly hidden
|
// hide item if previous was a separator, or if it's explicitly hidden
|
||||||
bool itemVisible = !previousIsSeparator;
|
bool hideItem = previousIsSeparator;
|
||||||
if (auto *cocoaItem = qt_objc_cast<QCocoaNSMenuItem *>(item).platformMenuItem) {
|
if (auto *cocoaItem = qt_objc_cast<QCocoaNSMenuItem *>(item).platformMenuItem)
|
||||||
cocoaItem->setVisible(!previousIsSeparator && cocoaItem->isVisible());
|
hideItem = previousIsSeparator || !cocoaItem->isVisible();
|
||||||
itemVisible = cocoaItem->isVisible();
|
item.hidden = hideItem;
|
||||||
}
|
|
||||||
item.hidden = !itemVisible;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!item.hidden) {
|
if (!item.hidden) {
|
||||||
previousItem = item;
|
lastVisibleItem = item;
|
||||||
previousIsSeparator = previousItem.separatorItem;
|
previousIsSeparator = lastVisibleItem.separatorItem;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// We now need to check the final item since we don't want any separators at the end of the list.
|
// We now need to check the final item since we don't want any separators at the end of the list.
|
||||||
if (previousItem && previousIsSeparator) {
|
if (lastVisibleItem && lastVisibleItem.separatorItem)
|
||||||
if (auto *cocoaItem = qt_objc_cast<QCocoaNSMenuItem *>(previousItem).platformMenuItem)
|
lastVisibleItem.hidden = YES;
|
||||||
cocoaItem->setVisible(false);
|
|
||||||
previousItem.hidden = YES;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
for (auto *item : qAsConst(m_menuItems)) {
|
for (auto *item : qAsConst(m_menuItems)) {
|
||||||
if (!item->isSeparator())
|
if (!item->isSeparator())
|
||||||
|
Loading…
x
Reference in New Issue
Block a user