macOS: fix separator actions not showing in menus
Amends a3f3af8a8f, 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
Pick-to: 5.15 6.2 6.1
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>
bb10
parent
478f5fcde6
commit
6832789bbd
|
|
@ -299,31 +299,26 @@ void QCocoaMenu::syncSeparatorsCollapsible(bool enable)
|
|||
QMacAutoReleasePool pool;
|
||||
if (enable) {
|
||||
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) {
|
||||
if (item.separatorItem) {
|
||||
// hide item if previous was a separator, or if it's explicitly hidden
|
||||
bool itemVisible = !previousIsSeparator;
|
||||
if (auto *cocoaItem = qt_objc_cast<QCocoaNSMenuItem *>(item).platformMenuItem) {
|
||||
cocoaItem->setVisible(!previousIsSeparator && cocoaItem->isVisible());
|
||||
itemVisible = cocoaItem->isVisible();
|
||||
}
|
||||
item.hidden = !itemVisible;
|
||||
bool hideItem = previousIsSeparator;
|
||||
if (auto *cocoaItem = qt_objc_cast<QCocoaNSMenuItem *>(item).platformMenuItem)
|
||||
hideItem = previousIsSeparator || !cocoaItem->isVisible();
|
||||
item.hidden = hideItem;
|
||||
}
|
||||
|
||||
if (!item.hidden) {
|
||||
previousItem = item;
|
||||
previousIsSeparator = previousItem.separatorItem;
|
||||
lastVisibleItem = item;
|
||||
previousIsSeparator = lastVisibleItem.separatorItem;
|
||||
}
|
||||
}
|
||||
|
||||
// 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 (auto *cocoaItem = qt_objc_cast<QCocoaNSMenuItem *>(previousItem).platformMenuItem)
|
||||
cocoaItem->setVisible(false);
|
||||
previousItem.hidden = YES;
|
||||
}
|
||||
if (lastVisibleItem && lastVisibleItem.separatorItem)
|
||||
lastVisibleItem.hidden = YES;
|
||||
} else {
|
||||
for (auto *item : qAsConst(m_menuItems)) {
|
||||
if (!item->isSeparator())
|
||||
|
|
|
|||
Loading…
Reference in New Issue