13@implementation QNSView (Menus)
27- (id)supplementalTargetForAction:(SEL)action sender:(id)sender
29 qCDebug(lcQpaMenus) <<
"Resolving action target for" << action <<
"from" << sender <<
"via" << self;
31 if (qt_objc_cast<QCocoaNSMenuItem *>(sender)) {
34 if ([self.menuHelper respondsToSelector:action])
35 return self.menuHelper;
37 qCDebug(lcQpaMenus) <<
"Ignoring action for menu item we didn't create";
40 return [super supplementalTargetForAction:action sender:sender];
43#if QT_MACOS_PLATFORM_SDK_EQUAL_OR_ABOVE(150000
)
44- (
void)showContextMenuForSelection:(id)sender
48 [self convertFromScreen:[NSEvent mouseLocation]
49 toWindowPoint:&windowPoint andScreenPoint:&screenPoint];
51 auto *keyMapper = QCocoaIntegration::instance()->keyMapper();
52 auto keyboardModifiers = keyMapper->queryKeyboardModifiers();
59 const bool mouseTriggered =
false;
61 qCDebug(lcQpaMenus) <<
"Initiating context menu at"
62 << windowPoint.toPoint() <<
"in" << m_platformWindow
63 <<
"with" << keyboardModifiers;
65 bool accepted = QWindowSystemInterface::handleContextMenuEvent<
66 QWindowSystemInterface::SynchronousDelivery>(
67 m_platformWindow->window(), mouseTriggered,
68 windowPoint.toPoint(), screenPoint.toPoint(),
71 qCDebug(lcQpaMenus) <<
"Context menu event accepted =" << accepted;
76 [[self nextResponder] tryToPerform:_cmd with:sender];
82@interface QNSViewMenuHelper ()
83@property (assign) QNSView* view;
86@implementation QNSViewMenuHelper
88- (instancetype)initWithView:(QNSView *)theView
90 if ((self = [super init]))
96- (BOOL)validateMenuItem:(NSMenuItem*)item
98 qCDebug(lcQpaMenus) <<
"Validating" << item <<
"for" << self.view;
100 auto *nativeItem = qt_objc_cast<QCocoaNSMenuItem *>(item);
104 auto *platformItem = nativeItem.platformMenuItem;
109 if (platformItem->menu())
114 if (QGuiApplication::modalWindow() && QGuiApplication::modalWindow()->isActive()) {
115 QCocoaMenuBar *menubar =
nullptr;
116 QCocoaWindow *menuWindow =
nullptr;
118 QObject *menuParent = platformItem->menuParent();
119 while (menuParent && !(menubar = qobject_cast<QCocoaMenuBar *>(menuParent))) {
120 menuWindow = qobject_cast<QCocoaWindow *>(menuParent);
121 auto *menuObject =
dynamic_cast<QCocoaMenuObject *>(menuParent);
122 menuParent = menuObject ? menuObject->menuParent() :
nullptr;
125 if ((!menuWindow || menuWindow->window() != QGuiApplication::modalWindow())
126 && (!menubar || menubar->cocoaWindow() != self.view.platformWindow))
130 return platformItem->isEnabled();
133- (BOOL)respondsToSelector:(SEL)selector
137 if (selector == @selector(cut:)
138 || selector == @selector(copy:)
139 || selector == @selector(paste:)
140 || selector == @selector(selectAll:)) {
142 return NSApp.keyWindow == self.view.window
143 && self.view.window.firstResponder == self.view;
146 if (selector == @selector(qt_itemFired:))
149 return [super respondsToSelector:selector];
152- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector
156 if (![self respondsToSelector:selector])
159 auto *appDelegate = [QCocoaApplicationDelegate sharedDelegate];
160 return [appDelegate methodSignatureForSelector:@selector(qt_itemFired:)];
163- (
void)forwardInvocation:(NSInvocation *)invocation
166 [invocation getArgument:&sender atIndex:2];
167 qCDebug(lcQpaMenus) <<
"Forwarding" << invocation.selector <<
"from" << sender;
168 Q_ASSERT(qt_objc_cast<QCocoaNSMenuItem *>(sender));
169 invocation.selector = @selector(qt_itemFired:);
170 [invocation invokeWithTarget:[QCocoaApplicationDelegate sharedDelegate]];