Capture du mouse event dans NSOutlineView avec des views custom

manu57manu57 Membre
15:49 modifié dans API AppKit #1
Salut,

J'ai un petit soucis sur lequel je viens de passer l'apres midi et la soirée sans trop de succès.
Dans un NSOutlineView dont les lignes sont des instances de NSView, je cherche à  afficher un menu contextuel lors d'un click droit sur une ligne.  Evidemment les NSView contiennent quelques contrôles. Lorsque je click droit sur la cellule, le mouse event est capturé par la première vue trouvée sous le pointeur de souris, souvent un des sous contrôles de la vue, du coup l'event n'arrive jamais jusqu'à  l'outline view et donc pas de menu. Le comportement parait correct, mais dans mon cas, il est génant puisqu'il faut viser juste entre les contrôles pour voir le menu (pas intérêt à  trembler de la souris  :P.
Existe t il un truc pour éviter ça ?  J'ai plusieurs pistes un peu capilotractées comme une vue overlay ou subclasser tous les contrôles mais bon avant de me lancer dans ce genre de chantier je voudrais savoir si j'ai pas loupé un truc...

Merci de votre aide
Manu

Réponses

  • CéroceCéroce Membre, Modérateur
    15:49 modifié #2
    D'après ce document, tu pourrais fixer le même menu pour chaque contrôle, par code ou par IB.
    ça vaut le coup d'essayer.
  • manu57manu57 Membre
    15:49 modifié #3
    Oui j'avais reperé cette partie de la doc. C'etait aussi une des pistes que j'avais en tête, envoyer un setMenu à  toute la hierarchie avec mon menu mais ca impose le meme pour tout le monde. Or certaines lignes n'ont pas le même menu en fonction d'etats présents dans le modele.

    Je cherchais un moyen de dire a une vue de ne pas consommer l'event et donc de laisser faire superview mais j'ai rien trouvé. Il y avait encore un solution en modifiant le comportement de NSWindow hitPoint  pour lui faire remonter une vue spécialement taggée par exemple plutôt que la "top most" avec un gros risque d'effet de bord

    J'ai donc suivi une autre piste, j'ai réduit le contenu de la sous vue aux seuls contrôles justifiant la vue, il en reste plus qu'un et le reste est dessiné par le vue elle-meme. Du coup le problème est circonscrit au contrôle restant que j'ai très légèrement subclassé. Un peu d'huile à  gauche ou à  droite notemment pour gérer la selection lors du click droit et tout fonctionne correctement.

    merci
    manu


     
  • CéroceCéroce Membre, Modérateur
    15:49 modifié #4
    dans 1264593267:

    Oui j'avais reperé cette partie de la doc. C'etait aussi une des pistes que j'avais en tête, envoyer un setMenu à  toute la hierarchie avec mon menu mais ca impose le meme pour tout le monde.

    Non, pourquoi ? Tu passerais le même menu (que tu as déjà ) aux contrôles de la même ligne. Ce menu peut très bien être différent pour chaque ligne, non ?


    En tout cas, si ça fonctionne maintenant, ça n'a plus trop d'importance.
  • mybofymybofy Membre
    janvier 2014 modifié #5

    Bonjour


     


    Puis-je réactiver cette discussion ?


     


    J'ai réussi à  utiliser NSOutline qui affiche bien les items de mon arborescence.


     


    Maintenant, je voudrais  comme manu57 récupérer un évènement souris sur un item, un clic droit par exemple.


    Quand je sélectionne un item et que je fais un clic droit, un menu contextuel par défaut apparaà®t.


    Je voudrais changer les items de ce menu contextuel.


     


    Mais je ne vois vraiment pas comment faire. Je ne comprends pas bien la solution de manu57.


     


    Essai :


    J'ai créé une sous-classe MYTextField de NSTextField avec une méthode mouseRightDown.


    Je l'ai utilisée à  la place de NSTextField via l'Identité Inspector.


    Idem pour MYTextFieldCell.


    Tout est OK, sauf que le clic droit affiche toujours le menu contextuel par défaut.


     


    J'avais fait ça très bien sur une NSImageView.


     


    Une piste, SVP.


Connectez-vous ou Inscrivez-vous pour répondre.