[newbie]Custom class, custom action ?

olofolof Membre
13:33 modifié dans API AppKit #1
Salut à  tous,

j'ai l'impression que ce que je veux faire est vraiment basique....

J'ai une matrice (NSMatrix) remplie de cellules (sous-class custom de NSImageCell). Je trappe les clic sur mes cellules en connectant la target de NSMatrix à  mon controlleur. Jusque là , tout va bien.
Maintenant, j'aimerais aussi détecter les clic-droit ! Et là , je bloque. Je pense faire ça : créer une sous-classe de NSMatrix et "créer une target" pour gérer ce clic-droit... Sans succès.

Je suis sur qu'il y a un truc tout con, mais je sèche !


Merci !

Réponses

  • fouffouf Membre
    13:33 modifié #2
    En effet, tu peux créer une sous-classe de NSMatrix.
    Ensuite, tu ajoutes un outlet vers ton controlleur, et tu surcharge rightMouseDown: pour récupérer le clique-droit et envoyer le message au controlleur. Normalement, ca devrait marcher, mais je suis pas totalement sûr.

    Bon codage ;)
  • olofolof Membre
    13:33 modifié #3
    C'est bien ce que je pensais (premier point positif  :)) Par contre, je ne sais pas quelle doit être la signature de mon Outlet.

    J'ai ajouté l'outlet suivant dans mon myMatrix.h :

    <br />	IBOutlet id myTest;<br />
    


    Dans IB, quand je fais une connexion de ma matrice à  mon controleur, je vois bien 'myTest' sous Target, Delegate, etc. Par contre, quand je clic dessus, il ne me propose rien pour faire ma connexion. Faut-il créer une action avec une signature spéciale dans le controleur ??
  • olofolof Membre
    13:33 modifié #4
    D'ailleurs, je crois ne pas me tromper, mais il n'y a pas d'exemple de ce genre dans le bouquin Cocoa par la pratique de Aaron Hillegass ?!?!?
  • mpergandmpergand Membre
    13:33 modifié #5

    Comme tu définis une action non standard, IB ne peut rien faire pour toi, faut tout faire à  la main comme un grand  ;)

    Dans ta sous classe de NSMatrix
    <br />- (void)rightMouseDown:(NSEvent *)theEvent<br />{<br />&nbsp; id target=[self target] // même cible que pour l&#39;action target classique<br />&nbsp; [self sendAction:@selector(actionClicDroit:) to:target];<br />}<br />
    



    et dans ton controller (défini comme target)

    <br />-(void) actionClicDroit:(id)sender<br />{<br />&nbsp; NSLog(@&quot;clic droit sur %@&quot;,sender);<br />}<br />
    
  • olofolof Membre
    13:33 modifié #6
    Ok, je comprends mieux. Les objects "cliquables" ont en général une action (qui correspond au clic) "par défaut" et si on veut trapper un évenement à  peine différent (clic-droit au lieu de clic-gauche), il faut se le tapper à  la main ? C'est bien résumé ?!?!?

    J'essaye ça ce soir !

    Merci !
  • veveveve Membre
    13:33 modifié #7
    ??? et avec les délégués (delegate) ?
  • olofolof Membre
    13:33 modifié #8
    dans 1129731405:

    ??? et avec les délégués (delegate) ?


    Si je sais lire la doc Apple (ce dont je ne suis pas sur...), NSMatrix n'a pas de methode déléguée. Et si on remonte jusqu'à  NSObject, seul NSControl en a, mais aucun n'a quelque chose à  voir avec la souris. Est-ce que je sais bien lire la doc ???
  • olofolof Membre
    13:33 modifié #9
    dans 1129723426:


    Comme tu définis une action non standard, IB ne peut rien faire pour toi, faut tout faire à  la main comme un grand  ;)

    Dans ta sous classe de NSMatrix
    <br />- (void)rightMouseDown:(NSEvent *)theEvent<br />{<br />  id target=[self target] // même cible que pour l&#39;action target classique<br />  [self sendAction:@selector(actionClicDroit:) to:target];<br />}<br />
    



    et dans ton controller (défini comme target)

    <br />-(void) actionClicDroit:(id)sender<br />{<br />  NSLog(@&quot;clic droit sur %@&quot;,sender);<br />}<br />
    



    Super, ça fonctionne, merci !
  • olofolof Membre
    13:33 modifié #10
    Caramba ! J'ai parlé trop vite !

    Le clic-droit est bien trappé, mais je n'arrive pas à  trouver sur quelle celulle le clic a été fait. [NSMatrix selectedCell] me renvoie la dernière cellule que j'ai cliquée avec un clic-gauche...

    Y'a un moyen ? Je dois passer par les coordonnées de la souris (j'espère pas...) ???

    Merci !
  • Eddy58Eddy58 Membre
    13:33 modifié #11
    Peut-être qu'il y a meilleure solution, mais voici ce que je ferais : :)
    1) Récupérer la position de la cell avec la méthode "getRow:column:forPoint:" (Et oui, il faut récupérer les coordonnées de la souris ;))
    2) Sélectionner la cell avec la méthode "selectCellAtRow:column:"
    3) Normalement, tu peux récupérer la cell sélectionnée avec "selectedCell"
  • olofolof Membre
    13:33 modifié #12
    J'ai essayé to proposition, Eddy. De la manière suivante :

    <br />- (void)rightMouseDown:(NSEvent *)theEvent<br />{<br />	int x,y;<br />	NSPoint myPoint = [theEvent locationInWindow];<br />NSLog(@&quot;Point = %f - %f&quot;,myPoint.x,myPoint.y);<br />	BOOL ok = [self getRow:&amp;x column:&amp;y forPoint:myPoint];<br />	NSLog(@&quot;x - y = %d - %d&quot;,x,y);<br />	if (ok) {<br />		[self selectCellAtRow:x column:y];<br />		id target=[self target]; // même cible que pour l&#39;action target classique<br />		[self sendAction:@selector(actionClicDroit:) to:target];<br />	}<br />}<br />
    


    Mon premier log me donne la position du curseur dans la fenêtre -> ok
    Pas contre, le deuxième me sort toujours -1,-1 !!!
  • BruBru Membre
    13:33 modifié #13
    locationInWindow de NSEvent retourne la position de la souris en coordonnées globales à  la fenêtre.
    Or getRow:column:forPoint: demande des coordonnées locales à  la matrice.

    Il te faut donc convertir ces coordonnées (de globales/fenêtre vers locales/matrice) avant de pouvoir les utiliser.

    Ceci se réalise via convertPoint:fromView: de NSView :

    <br />- (void)rightMouseDown:(NSEvent *)theEvent<br />{<br />&nbsp; &nbsp; int x,y;<br /><br />&nbsp; &nbsp; NSPoint myPoint = [theEvent locationInWindow];<br />&nbsp; &nbsp; NSLog(@&quot;Point global = %f - %f&quot;,myPoint.x,myPoint.y);<br /><br />&nbsp; &nbsp; myPoint=[self convertPoint:myPoint fromView:nil];<br />&nbsp; &nbsp; NSLog(@&quot;Point local = %f - %f&quot;,myPoint.x,myPoint.y);<br /><br />&nbsp; &nbsp; BOOL ok = [self getRow:&amp;x column:&amp;y forPoint:myPoint];<br />&nbsp; &nbsp; NSLog(@&quot;x - y = %d - %d&quot;,x,y);<br />&nbsp; &nbsp; if (ok)<br />&nbsp; &nbsp; {<br />&nbsp; &nbsp; &nbsp; &nbsp; [self selectCellAtRow:x column:y];<br />&nbsp; &nbsp; &nbsp; &nbsp; id target=[self target]; // même cible que pour l&#39;action target classique<br />&nbsp; &nbsp; &nbsp; &nbsp; [self sendAction:@selector(actionClicDroit:) to:target];<br />&nbsp; &nbsp; }<br />}<br />
    

    .
  • AntilogAntilog Membre
    13:33 modifié #14
    dans 1129736832:

    dans 1129731405:

    ??? et avec les délégués (delegate) ?


    Si je sais lire la doc Apple (ce dont je ne suis pas sur...), NSMatrix n'a pas de methode déléguée. Et si on remonte jusqu'à  NSObject, seul NSControl en a, mais aucun n'a quelque chose à  voir avec la souris. Est-ce que je sais bien lire la doc ???


    Mon conseil favori  :P

    Ne pas chercher dans les docs Apple la généalogie des objets!
    Utiliser AppKiDo http://homepage.mac.com/aglee/downloads/appkido.html
    Tout l'héritage d'un seul coup d'oeil!

    C'est tellement plus Cooooooooooooooooooooooooooooool  ;)
  • olofolof Membre
    13:33 modifié #15
    Merci Bru, ça fontionne !

    Antilog, télécharge et je test. Merci !
Connectez-vous ou Inscrivez-vous pour répondre.