osx - Rich, Window-like Context Menu (like Interface Builder) -
i need context menu similar in capabilities interface builder presents when right(control)-clicking on view, view controller etc.:
at first sight, looks nspanel style attribute set "hud panel", containing sort of outline view.
the window shouldn't difficult implement, usual way of presenting context menu on right(control)-click overriding method:
func menu(for event: nsevent) -> nsmenu? ...which takes nsmenu return value; can't pass nswindow / nspanel instead.
perhaps this:
override func menu(for event: nsevent) -> nsmenu? { // create our popup window (hud panel) , present // @ location of event: // (...actual code omitted...) // prevent actual menu being displayed: return nil } ...but feels hack; tricking system giving away timing of right(control)-click event pretending care presenting actual nsmenu (i.e., overriding method explicitly intended that), using timing something different.
i need place logic dismiss window when user clicks somewhere else (context menues have functionality built in).
i don't think subclassing nsmenu , nsmenuitem obtain above behaviour , appearance feasible either...
is there better way? does know (or able guess) interface builder does?
edit: pointed out in comment @willeke, conditions panel shown not same context menu, surely not one. means hijacking method above in order display window not unelegant, wrong. question stands how display window (i.e., detect static, non-dragging right click).
you'll want override rightmousedown(with:) view subclass , use trigger showing panel. nsview's implementation of method calls menu(for:) , presents returned menu, custom subclass can use show custom menu panel instead of calling super.
for full behavioral consistency both standard context menus , menus in interface builder, you'll want handle ctrl-left-clicks overriding mousedown(with:) , check if event's modifierflags includes .control.

Comments
Post a Comment