diff options
Diffstat (limited to 'src/plugins/platforms/cocoa/qcocoamenuitem.mm')
-rw-r--r-- | src/plugins/platforms/cocoa/qcocoamenuitem.mm | 71 |
1 files changed, 52 insertions, 19 deletions
diff --git a/src/plugins/platforms/cocoa/qcocoamenuitem.mm b/src/plugins/platforms/cocoa/qcocoamenuitem.mm index f8f9648822..30fde17abf 100644 --- a/src/plugins/platforms/cocoa/qcocoamenuitem.mm +++ b/src/plugins/platforms/cocoa/qcocoamenuitem.mm @@ -41,6 +41,7 @@ #include "qcocoamenuitem.h" +#include "qcocoansmenu.h" #include "qcocoamenu.h" #include "qcocoamenubar.h" #include "messages.h" @@ -112,7 +113,7 @@ QCocoaMenuItem::~QCocoaMenuItem() QMacAutoReleasePool pool; if (m_menu && m_menu->menuParent() == this) - m_menu->setMenuParent(0); + m_menu->setMenuParent(nullptr); if (m_merged) { [m_native setHidden:YES]; } else { @@ -140,7 +141,7 @@ void QCocoaMenuItem::setMenu(QPlatformMenu *menu) return; if (m_menu && m_menu->menuParent() == this) { - m_menu->setMenuParent(0); + m_menu->setMenuParent(nullptr); // Free the menu from its parent's influence m_menu->propagateEnabledState(true); if (m_native && m_menu->attachedItem() == m_native) @@ -218,12 +219,11 @@ void QCocoaMenuItem::setNativeContents(WId item) NSMenuItem *QCocoaMenuItem::sync() { - if (m_isSeparator != [m_native isSeparatorItem]) { + if (m_isSeparator != m_native.separatorItem) { [m_native release]; - if (m_isSeparator) { - m_native = [[NSMenuItem separatorItem] retain]; - [m_native setTag:reinterpret_cast<NSInteger>(this)]; - } else + if (m_isSeparator) + m_native = [[QCocoaNSMenuItem separatorItemWithPlatformMenuItem:this] retain]; + else m_native = nil; } @@ -232,7 +232,7 @@ NSMenuItem *QCocoaMenuItem::sync() QCocoaMenuLoader *loader = [QCocoaMenuLoader sharedMenuLoader]; switch (m_role) { case ApplicationSpecificRole: - mergeItem = [loader appSpecificMenuItem:reinterpret_cast<NSInteger>(this)]; + mergeItem = [loader appSpecificMenuItem:this]; break; case AboutRole: mergeItem = [loader aboutMenuItem]; @@ -249,7 +249,7 @@ NSMenuItem *QCocoaMenuItem::sync() case TextHeuristicRole: { QObject *p = menuParent(); int depth = 1; - QCocoaMenuBar *menubar = 0; + QCocoaMenuBar *menubar = nullptr; while (depth < 3 && p && !(menubar = qobject_cast<QCocoaMenuBar *>(p))) { ++depth; QCocoaMenuObject *menuObject = dynamic_cast<QCocoaMenuObject *>(p); @@ -292,9 +292,10 @@ NSMenuItem *QCocoaMenuItem::sync() m_textSynced = true; m_merged = true; [mergeItem retain]; + if ([mergeItem isMemberOfClass:[QCocoaNSMenuItem class]]) + static_cast<QCocoaNSMenuItem *>(mergeItem).platformMenuItem = this; [m_native release]; m_native = mergeItem; - [m_native setTag:reinterpret_cast<NSInteger>(this)]; } else if (m_merged) { // was previously merged, but no longer [m_native release]; @@ -306,12 +307,12 @@ NSMenuItem *QCocoaMenuItem::sync() } if (!m_native) { - m_native = [[NSMenuItem alloc] initWithTitle:m_text.toNSString() - action:nil - keyEquivalent:@""]; - [m_native setTag:reinterpret_cast<NSInteger>(this)]; + m_native = [[QCocoaNSMenuItem alloc] initWithPlatformMenuItem:this]; + m_native.title = m_text.toNSString(); } + resolveTargetAction(); + [m_native setHidden: !m_isVisible]; [m_native setView:m_itemView]; @@ -331,12 +332,9 @@ NSMenuItem *QCocoaMenuItem::sync() NSFont *customMenuFont = [NSFont fontWithName:m_font.family().toNSString() size:m_font.pointSize()]; if (customMenuFont) { - NSArray *keys = [NSArray arrayWithObjects:NSFontAttributeName, nil]; - NSArray *objects = [NSArray arrayWithObjects:customMenuFont, nil]; - NSDictionary *attributes = [NSDictionary dictionaryWithObjects:objects forKeys:keys]; NSAttributedString *str = [[[NSAttributedString alloc] initWithString:finalString.toNSString() - attributes:attributes] autorelease]; - [m_native setAttributedTitle: str]; + attributes:@{NSFontAttributeName: customMenuFont}] autorelease]; + [m_native setAttributedTitle:str]; useAttributedTitle = true; } } @@ -434,4 +432,39 @@ void QCocoaMenuItem::setIconSize(int size) m_iconSize = size; } +void QCocoaMenuItem::resolveTargetAction() +{ + if (m_native.separatorItem) + return; + + // Some items created by QCocoaMenuLoader are not + // instances of QCocoaNSMenuItem and have their + // target/action set as Interface Builder would. + if (![m_native isMemberOfClass:[QCocoaNSMenuItem class]]) + return; + + // Use the responder chain and ensure native modal dialogs + // continue receiving cut/copy/paste/etc. key equivalents. + SEL roleAction; + switch (effectiveRole()) { + case CutRole: + roleAction = @selector(cut:); + break; + case CopyRole: + roleAction = @selector(copy:); + break; + case PasteRole: + roleAction = @selector(paste:); + break; + case SelectAllRole: + roleAction = @selector(selectAll:); + break; + default: + roleAction = @selector(qt_itemFired:); + } + + m_native.action = roleAction; + m_native.target = nil; +} + QT_END_NAMESPACE |