Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Alternative Menu Items in NSMenu

I have an NSMenu that contains NSMenuItems with custom views. I want it so that when the alt button is pressed, the menu items would change part of their look (through their view). I found setAlternative in the NSMenuItem docs, however, in practice I could only get it to work with NSMenuItems without custom views. As soon as I set a custom view, all of the menu items would be displayed. Also, I tried getting keypress events while the menu was open. Due to the other run loop, NSApplication's sendEvent: doesn't receive events until after the menu is closed. Therefore, I can't just intercept the event coming in.

Does anyone know how I can get notified, whether through delegation or subclassing, of when the alt key is pressed when a menu is opened?

like image 609
Nick Paulson Avatar asked Apr 09 '10 10:04

Nick Paulson


1 Answers

You should set an object as the delegate of your menu and then implement the delegate method -menu:updateItem:atIndex:shouldCancel:.

This will allow you to change the state of your custom view before the menu item is displayed, based on the current modifier state.

You can get the current modifiers by asking for [[NSApp currentEvent] modifierFlags].

If you need to be notified if the modifier flags change while your menu is open, implement the -flagsChanged: method in your custom view:

- (void)flagsChanged:(NSEvent*)event
{
    if ([event modifierFlags] & NSAlternateKeyMask)  // check for option key
    {
        //do something
    }
    else
    {
        //do something else
    }
}
like image 103
Rob Keniger Avatar answered Oct 18 '22 03:10

Rob Keniger