Programaticamente instanciando um NSpopupButtonCell em cacau osx
-
20-09-2019 - |
Pergunta
Eu tenho uma interface OpenGL GUI e preciso ter um menu pop -up que será chamado quando este um determinado botão for pressionado na minha tela OpenGL. Quero exibir um menu semelhante ao que aparece quando você pressiona um NSPOPUPBTOTON, mas não posso usar o próprio botão de cacau. Parece que a melhor maneira de conseguir isso é usar o NSpopupButtonCell. Não posso postar meu código aqui porque estou escrevendo o código em Lisp e acessando o cacau através de uma ponte C objetiva, mas só queria ver se o código PSEDUO seguinte parece que deve exibir o menu ou se há uma falha óbvia no meu lógica:
• Pseudo Code for function that is called when button is pressed:
• Initialize an NSPopUpButtonCell Using initTextCell: "test" pullsDown: NO
• allocate an NSMenu using alloc
• add two menu items using addItem:
• set the menu of the popUpButtonCell to be the menu that was just allocated using setMenu:
• Next I tried two methods to try and get the menu to actually be displayed,
first I tried using drawWithFrame:inView: and when that did not work I also tried
using drawBezelWithFrame:inView: eventhough the docs said not to use but I just
tried it out of desperation.
• finally, when the draw methods did not work I tried using performClick: on the
popupButtonCell to try and simulate the click.
Nenhum desses métodos foi bem -sucedido em obter qualquer tipo de menu a ser exibido. Existe outra maneira de aparecer programaticamente o menu contido na célula?
Solução
Eu acho que você está procurando o trackMouse:inRect:ofView:untilMouseUp:
método de NSCell
[theCell trackMouse:[NSApp currentEvent] inRect:NSZeroRect ofView:theView untilMouseUp:YES];
Outras dicas
Eu acho que você seria melhor usando uma planície NSMenu
e chamando +[NSMenu popUpContextMenu:withEvent:forView:]
. Se você está atingindo apenas 10,6 e mais tarde, também pode conferir -[NSMenu popUpMenuPositioningItem:atLocation:inView:]
, o que oferece um pouco mais de controle sobre o posicionamento do menu. Apenas implemente mouseDown:
Na sua visualização, construa um menu (ou carregue -o de um arquivo de ponta) e exiba -o, e NSMenu
deve cuidar de todos os detalhes a partir daí. Apenas certifique -se de que o alvo e a ação para cada NSMenuItem
está definido para que o método de ação seja chamado corretamente quando um item é selecionado.