2011-04-23 15 views
12

Estoy trabajando en los detalles de un botón emergente de símbolos, similar a lo que Xcode 3 en la parte superior de la ventana del editor.¿Hay alguna manera de controlar el elemento NSMenuItem que se resalta inicialmente al abrir un menú?

Mi objeto controlador es el delegado del NSMenu que se muestra cuando se muestra NSPopUpButton. Implemento los dos métodos numberOfItemsInMenu: y menu:updateItem:atIndex:shouldCancel: para completar el menú justo antes de que se muestre.

Sin embargo, el título y la imagen del NSMenuItem seleccionado tienen que cambiar cada vez que el usuario cambia la selección en el editor NSTextView, o realiza cambios en el texto; como es el caso con Xcode.

El problema que estoy teniendo es cuando el usuario va a hacer clic en el NSPopUpButton para mostrar la NSMenu, el seleccionado NSMenuItem y el elemento que debe ser seleccionado no coinciden, ya que el menú no tiene el número adecuado de artículos todavía

Me pregunto si hay una forma de controlar qué NSMenuItem se resalta inicialmente y se hace un seguimiento cuando el usuario hace clic para abrir el menú. Tal como está, el primer elemento siempre resaltado y rastreado o, si el usuario había seleccionado previamente un elemento, ese elemento se resalta y se rastrea.

he intentado explicar lo mejor que pude, pero aquí es una imagen que ilustra mi problema:

http://imgur.com/izGvh

Quiero que el elemento resaltado a ser el mismo que el elemento seleccionado cuando el usuario abre el menú. ¿Algunas ideas?

+0

El motivo por el que inicialmente se "rastrea" el elemento seleccionado es que está directamente debajo del puntero del mouse, por lo que si solo abre el menú y lo cierra de nuevo, la selección no cambiará. Si desea cambiar este comportamiento, deberá subclase NSPopUpButton. –

Respuesta

0

Has probado esto NSMenuDelegate método: Manipulación Destacando

– menu:willHighlightItem: 

NSMenuDelegate Protocol Reference

También puede almacenar el índice NSMenuItem de alguna var para no perder de vista el elemento seleccionado para su uso posterior.

+1

este método no le permite cambiar qué elemento se resaltará, por lo que no se aplicará en mi situación particular. – willbur1984

0

Solo una pista, no es una solución completa.

Intenta publicar un evento de NSMouseMoved en tu aplicación justo después del menú que se muestra. El problema principal está aquí para detectar la posición del elemento que desea resaltar. Solo un punto de partida.

+0

incluso podría funcionar pero suena a hakisch - y necesitaría carbono para obtener los marcos IIRC –

+0

* nunca * mueva el mouse. Tampoco intente falsificar la aplicación para pensar que el mouse está en una ubicación diferente de la que está. Rompe la asociación de que "el ratón es una extensión de mi mano" y confunde a los usuarios. – uliwitness

1

Usaría un botón NSPopup - puede hacer lo que quiera. tal vez incluso lo escondes?

1

No estoy muy seguro de haber entendido su problema, pero si podemos agregar etiquetas a estos elementos del menú. p.

[mMenuItemOne setTag : 1]; 
[mMenuItemTwo setTag : 2]; 
[mMenuItemThree setTag : 3]; 
[mMenuItemFour setTag : 4];} 

podemos seleccionar cualquier elemento de menú con [_popUp selectItemWithTag: _selectedItem];

+1

Puede establecer estas etiquetas directamente en Interface Builder, por cierto. –

+0

Sí e incluso usando setTag también como ya lo hice –

0

No estoy seguro, ¿desea mover el resaltado de selección del mouse (las cosas azules) o la marca de verificación?

En general, la marca de verificación es lo que desea cambiar.Puede hacerlo desde su método validateMenuItem: (o en cualquier otro momento si su artículo está configurado para no participar en la validación) utilizando el método -setState:.

El resaltado azul es un indicador de la entrada del teclado del usuario o de la ubicación del mouse, y no debe meterse con él. Cambiarlo no tiene ningún sentido, ya que se cambiaría en el momento en que el usuario mueva el mouse incluso un solo píxel.

Dicho esto, se puede establecer el selectedItem del NSPopUpButton, lo que hará que todo el menú a ser movido por lo que el selectedItem es bajo el ratón (suponiendo que el ratón acaba de hacer clic en el botón desplegable).

Si se llama al método delegado de menú después de que el botón emergente haya decidido qué elemento seleccionar, no puede usarlo. En su lugar, probablemente podría configurar el selectedItem y el menú del botón emergente desde un controlador NSPopUpButtonWillPopUpNotification.

Si también se llama demasiado tarde, probablemente tendrá que subclase NSPopupButtonCell y hacerlo en una modificación de -attachPopUpWithFrame:inView: (creo que ese es el lugar que también debería funcionar cuando no hace clic y simplemente presiona la tecla espacio mientras el botón emergente está seleccionado).

Cuestiones relacionadas