From 8c3b31182cbf53aad8d1979f612eefb93a548940 Mon Sep 17 00:00:00 2001 From: Gabriel de Dietrich Date: Fri, 9 Aug 2013 14:09:06 +0200 Subject: Cocoa: Allow to hide menu items in menubar Task-number: QTBUG-32899 Change-Id: I423ac2d636306303d39e973f19032c9004957095 Reviewed-by: Jens Bache-Wiig --- src/plugins/platforms/cocoa/qcocoamenu.h | 3 +++ src/plugins/platforms/cocoa/qcocoamenu.mm | 2 ++ src/plugins/platforms/cocoa/qcocoamenubar.mm | 18 ++++++++++-------- 3 files changed, 15 insertions(+), 8 deletions(-) (limited to 'src/plugins/platforms/cocoa') diff --git a/src/plugins/platforms/cocoa/qcocoamenu.h b/src/plugins/platforms/cocoa/qcocoamenu.h index 7224ee2ff8..59fda96dff 100644 --- a/src/plugins/platforms/cocoa/qcocoamenu.h +++ b/src/plugins/platforms/cocoa/qcocoamenu.h @@ -84,6 +84,8 @@ public: inline NSMenuItem *nsMenuItem() const { return m_nativeItem; } + inline bool isVisible() const { return m_visible; } + virtual QPlatformMenuItem *menuItemAt(int position) const; virtual QPlatformMenuItem *menuItemForTag(quintptr tag) const; @@ -100,6 +102,7 @@ private: NSMenuItem *m_nativeItem; NSObject *m_delegate; bool m_enabled; + bool m_visible; quintptr m_tag; QCocoaMenuBar *m_menuBar; }; diff --git a/src/plugins/platforms/cocoa/qcocoamenu.mm b/src/plugins/platforms/cocoa/qcocoamenu.mm index bd406ee176..f9e033d21b 100644 --- a/src/plugins/platforms/cocoa/qcocoamenu.mm +++ b/src/plugins/platforms/cocoa/qcocoamenu.mm @@ -216,6 +216,7 @@ QT_BEGIN_NAMESPACE QCocoaMenu::QCocoaMenu() : m_enabled(true), + m_visible(true), m_tag(0), m_menuBar(0) { @@ -421,6 +422,7 @@ void QCocoaMenu::setEnabled(bool enabled) void QCocoaMenu::setVisible(bool visible) { [m_nativeItem setSubmenu:(visible ? m_nativeMenu : nil)]; + m_visible = visible; } void QCocoaMenu::showPopup(const QWindow *parentWindow, QPoint pos, const QPlatformMenuItem *item) diff --git a/src/plugins/platforms/cocoa/qcocoamenubar.mm b/src/plugins/platforms/cocoa/qcocoamenubar.mm index 8d1ca88b8e..ddfa9fff96 100644 --- a/src/plugins/platforms/cocoa/qcocoamenubar.mm +++ b/src/plugins/platforms/cocoa/qcocoamenubar.mm @@ -149,15 +149,17 @@ void QCocoaMenuBar::syncMenu(QPlatformMenu *menu) Q_FOREACH (QCocoaMenuItem *item, cocoaMenu->items()) cocoaMenu->syncMenuItem(item); - // If the NSMenu has no visble items, or only separators, we should hide it - // on the menubar. This can happen after syncing the menu items since they - // can be moved to other menus. BOOL shouldHide = YES; - for (NSMenuItem *item in [cocoaMenu->nsMenu() itemArray]) - if (![item isSeparatorItem] && ![item isHidden]) { - shouldHide = NO; - break; - } + if (cocoaMenu->isVisible()) { + // If the NSMenu has no visble items, or only separators, we should hide it + // on the menubar. This can happen after syncing the menu items since they + // can be moved to other menus. + for (NSMenuItem *item in [cocoaMenu->nsMenu() itemArray]) + if (![item isSeparatorItem] && ![item isHidden]) { + shouldHide = NO; + break; + } + } [cocoaMenu->nsMenuItem() setHidden:shouldHide]; } -- cgit v1.2.3