Chacun sa row, chacun son info

16:35 modifié dans API AppKit #1
Bonsoir à  tous,

Je cherche à  faire une sorte de "view" à  moitié transparente comme ds iChat ou Adium lorsqu'on pose la souris un certain moment sur un contact (on voit les infos etc..)
La view, je saurai me débrouillé pour la faire... Le problème est comment l'afficher à  la manière d'iChat ?

Merci d'avance

Réponses

  • fouffouf Membre
    16:35 modifié #2
    Tu peux créer une NSWindow avec un NSBorderlessWindowMask et mettre la vue comme content view. Aprés, tu l'affiche avec orderOut: et tu la déplaces avec setFrame: ;)
  • 16:35 modifié #3
    Bon ben j'ai fouillé NSTableView et trouvé
    (NSRect)rectOfRow:(int)rowIndex
    


    Donc voilà  ce que j'ai fait :
    <br />- (void)awakeFromNib<br />{<br />	rectOfRow = [tableView rectOfRow:[tableView selectedRow]];<br />	[tableView addTrackingRect:rectOfRow owner:self userData:(NSEvent *)NSMouseExited assumeInside:YES];<br />}<br /><br />- (void)mouseEntered:(NSEvent *)event<br />{<br />NSLog(@&quot;Entered&quot;);<br />}<br /><br />- (void)mouseExited:(NSEvent *)event<br />{<br />NSLog(@&quot;Exited&quot;);<br />}
    


    Voilà  tout baigne, après je n'aurai pas de mal à  affiché la fenêtre en récupérant simplement le NSPoint de la souris puis initializer une view avec comme origine le NSPoint de la souris

    Voili
  • AliGatorAliGator Membre, Modérateur
    septembre 2005 modifié #4
    Oui mais avec cette méthode tu vas afficher le ToolTip (fenêtre sur fond jaune, puisque c'est ce genre de truc que tu veux) dès que la row est survolée... Un vrai ToolTip n'apparait que si on reste qques secondes au dessus de la row

    Je suppose que les trucs genre "- (NSToolTipTag)addToolTipRect:(NSRect)aRect owner:(id)anObject userData:(void *)userData" (classe NSView) ne te vont pas car tu ne veux pas te contenter que du texte, tu veux aussi des images, etc, bref une view personnalisée pour ton ToolTip.

    Mais y'a pas des notifications envoyées ou des conneries comme ça, ou même une méthode à  surcharger dans NSView qd il affiche le ToolTip ? Pour au lieu de le laisser afficher le ToolTip textual, mettre ton code à  toi pour afficher ta NSView jaune perso, quoi...

    Heu remarque si ça se trouve tu n'avais même pas connaissance des ToolTips et si tu veux ne mettre que du texte dedans, ça peut suffire aussi ;)
  • 16:35 modifié #5
    Je comprend pas trop ce que tu veux dire vers la fin
    Je connaissais ToolTip (vu que le fond jaune comme ça je connais bien, réglabe sur un bouton ou n'importe quoi depuis IB ds la fenêtre attributes : help) sauf que moi je veux effectivement une image en plus.. Bien dommage.
    Ce que je comprend pas c'est que tu dis qu'on pourrait foutre une NSView ds le toolTip?
  • 16:35 modifié #6
    Si tu prends l'exemple d'adium, leur 'tooltip' dans la liste de contacts est beaucoup plus complexe qu'une simple NSString (texte mis en forme + image)
  • AliGatorAliGator Membre, Modérateur
    16:35 modifié #7
    dans 1125775782:
    Ce que je comprend pas c'est que tu dis qu'on pourrait foutre une NSView ds le toolTip?
    Nan pas vraiment, j'ai pas dit ça.
    J'ai dit qu'il y a peut-être moyen de remplacer la méthode du framework Cocoa qui gère les tooltips par la tienne.
    Plus précisément de sous-classer NSView et de surcharger une méthode "showTooltipWithData:(NSData*)userData" (ce n'est qu'un exemple bâteau qui ne doit pas exister c'est pour te donner l'idée)

    Je ne sais pas si c'est possible, dans le sens ou je ne sais pas si ce genre de méthode (celle qui gère l'affichage des Tooltips donc qui crée le rectangle jaune avec le texte dedans) est disponible etqu'on peut donc alors la surchargée... j'ai pas cherché à  fond, mais c'est pas forcément clairement exprimé dans la doc (une méthode undocumented ? bru ? <3 :)) mais bon<br />
    L'idée est exactement la même que lorsque tu surcharges des méthodes en Cocoa, chose fréquente (genre quand tu surcharges le init ou le dealloc ou même plein d'autres méthodes, où justement d'habitude tu mets un [super nomDeLaMethodeSurchargee] pour appeler la méthode de la classe mère dans ta version modifier, etc...
    Je vois mal comment je pourrais essayer d'être plus clair... surcharger une méthode quoi.

    Bref, la question que je pose (et je n'ai en aucun cas la réponse) c'est est-ce qu'il ne serait pas possible de surcharger la méthode Cocoa qui se charge d'afficher la Tooltip (qui normalement est une Tooltip textuelle) ? Et dans ce cas à  la place tu mets ton propre code (celui que tu avais prévu de mettre qui t'affiche ta NSView qui te sert de fenêtre d'info, en lui mettant éventuellement un fond jaune pour rester dans l'idée comme le Tooltip, enfin à  la Adium comme dit Renaud)
    Tu surcharges pour qu'au lieu d'avoir le comportement par défaut (affichage de la Tooltip Cocoa textuelle) tu aies ton propre comportement (affichage d'une NSView [ou d'une fenêtre frameless ou quoi, enfin ce que tu avais prévu d'afficher] à  toi qui aurait un fond jaune, ton image, etc)

    Voilà  après je sais pas si c'est faisable et si on y a accès (et sinon ça sent le "bru power") mais l'idée est là . Et plus comme ça ça reste dans l'idée du Tooltip, avec l'affichage uniquement si tu es au dessus de ta row depuis un certain temps etc
  • BruBru Membre
    16:35 modifié #8
    L'idée de se baser sur les tooltips pour faire ce que veut faire Eaglelouk n'est pas la bonne idée.

    Je m'en vais vous conter l'histoire fabuleuse des tooltips sour OS X :

    Il était une fois une classe (partiellement undocumented) nommée NSToolTipManager.

    Cette classe est une singleton, donc il n'existe qu'une instance par application. Le rôle de cette classe est de contrôler l'affichage des tooltips (on peut y régler les délais des timers d'apparition/disparition, récupérer l'id de la fenêtre affichant le texte du tooltip, ajouter/retirer les views affichant des tooltips, etc.).

    Cette classe est secondée par NSToolTipPanel, qui est la fenêtre qui affiche le texte du tooltip. Il n'existe qu'une fenêtre pour l'application (elle est créée au premier tooltip à  afficher, puis ensuite, tout au long de la vie de l'application, elle est masquée -orderOut- ou non -orderFront-).

    Chaque tooltip déclaré dans chaque view (via la méthode setToolTip: ) créé une instance d'une classe NSToolTip dont le rôle est de stocker la NSString à  afficher, ainsi qu'un pointeur sur une structure de donnée.

    Enfin, une dernière classe NSToolTipStringDrawingLayoutManager (une singleton elle aussi) permet de stocker les attributs d'affichage de la NSString du tooltip.

    On peut toujours surcharger (par une catégorie) telle ou telle méthode de chacune de ces classes. Le problème est que cela affecte l'application entière, ce qui peut être génant.

    Le plus simple (et croyez moi, c'est simple) est de gérer sa propre fenêtre tooltip pour le cas particulier dont à  besoin notre ami.

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