modiffier l'apparence de drang and drop

wiskywisky Membre
17:47 modifié dans API AppKit #1
salut tout le monde.

Dans mon appli j'ai ajouté le drang and drop. j'aimerait modifier son apparence. ;)

Je m'explique dans ma première TableView ont peut selectioner une ou plusieurs lignes. Dans le cas ou il n'y en a qu'une seul je veut ajouter un bord à  "l'image visible de la ligne en cours de glissement" et si il en a plus d'une, je veut ajouter un chiffre dans un rond rouge (style mail). :D

Quelqu'un à  une idée? :o

Réponses

  • fouffouf Membre
    17:47 modifié #2
    Je n'ai jamais fait de drag and drop mais je crois qu'il y a une méthode de NSView ou de NSImage du genre dragImage:atPoint: . Comme ca, tu utilises un BOOL pour savoir combien d'items tu as sélectionné, et tu utilises cette méthodes pour afficher le "rond" rouge. ;)
  • ChachaChacha Membre
    août 2005 modifié #3
    dans 1124702573:

    Je n'ai jamais fait de drag and drop mais je crois qu'il y a une méthode de NSView ou de NSImage du genre dragImage:atPoint: . Comme ca, tu utilises un BOOL pour savoir combien d'items tu as sélectionné, et tu utilises cette méthodes pour afficher le "rond" rouge. ;)


    Fouf a raison, tu peux surcharger dans ta vue la méthode :
    <br />-(void) dragImage:(NSImage*)image at:(NSPoint)at offset:(NSSize)offset event:(NSEvent*)event<br />       pasteboard:(NSPasteboard*)pasteboard source:(id)object slideBack:(BOOL)slideBack<br />
    


    Je te conseille un truc du genre :
    <br />-(void) dragImage:(NSImage*)image at:(NSPoint)at offset:(NSSize)offset event:(NSEvent*)event<br />       pasteboard:(NSPasteboard*)pasteboard source:(id)object slideBack:(BOOL)slideBack<br />{<br />  //tu peux carrément redessiner dans l&#39;image (mais rien ne t&#39;empêche d&#39;en créer une nouvelle)<br />  [image lockFocus]<br /><br />  //je te file un exemple de tracé de rond rouge avec le texte<br />  NSString* numberToDraw = @&quot;123&quot;;<br />  CGContextRef cgContext = [[NSGraphicsContext currentContext] graphicsPort];<br />  CGContextSetRGBFillColor(cgContext, 1, 0, 0, 1);<br />  CGContextFillEllipseInRect(cgContext, CGRectMake(0, 0, 10*[numberToDraw length], 20));<br />  CGContextSetTextPosition(cgContext, 5, 5);<br />  CGContextSetTextDrawingMode(cgContext, kCGTextStroke);<br />  CGContextSelectFont(cgContext, &quot;Monaco&quot;, 10, kCGEncodingMacRoman);<br />  CGContextSetRGBStrokeColor(cgContext, 1, 1, 1, 1);<br />  CGContextShowText(cgContext, [numberToDraw UTF8String], [numberToDraw length]);<br />  CGContextFlush(cgContext);<br /><br />  [image unlockFocus];<br />  [super dragImage:image at:at offset:offset event:event pasteboard:pasteboard source:object slideBack:slideBack];<br />}<br />
    

  • ChachaChacha Membre
    17:47 modifié #4
    Oh, je viens de penser, ta vue est une table view, non ?
    Dans ce cas, ce n'est pas dragImage, qu'il faut surcharger, c'est

    <br />dragImageForRows:event:dragImageOffset: //pour Panther<br />
    


    ou

    <br />dragImageForRowsWithIndexes:tableColumns:event:offset: //pour Tiger<br />
    


    Mon conseil, tu surcharges les deux, comme ça :
    <br />- (NSImage *)dragImageForRows:(NSArray *)dragRows event:(NSEvent *)dragEvent dragImageOffset:(NSPointPointer) dragImageOffset<br />{<br />  NSMutableIndexSet* indexSet = [NSMutableIndexSet indexSet];<br />  NSEnumerator* enumerator = [dragRows objectEnumerator];<br />  NSNumber* row = [enumerator nextObject];<br />  while(row)<br />  {<br />    [indexSet addIndex:[row unsignedIntValue]];<br />    row = [enumerator nextObject];<br />  }<br /><br />  NSArray* tableColumns = [self tableColumns];<br /><br />  [self dragImageForRowsWithIndexes:indexSet<br />         tableColumns:tableColumns event:dragEvent<br />         offset: dragImageOffset];<br />}<br /><br />- (NSImage *)dragImageForRowsWithIndexes:(NSIndexSet *)dragRows tableColumns:(NSArray *)tableColumns event:(NSEvent*)dragEvent offset:(NSPointPointer)dragImageOffset<br />{<br />  //... le code<br />}<br />
    


    De cette façon, ça marche pareil sous Panther et Tiger, sans dupliquer le code

    +
    Chacha
  • wiskywisky Membre
    17:47 modifié #5
    Merci,

    Ca marche nikel. Sauf que CoreGraphic n'est pas sur Mac OS X.3.
    Et je croit que je vait tout re-dessiner.
    Je vair faire des recherches sur le forums pour trouver comment créer une NSImage ;)
  • BruBru Membre
    17:47 modifié #6
    dans 1124861930:

    Ca marche nikel. Sauf que CoreGraphic n'est pas sur Mac OS X.3.


    Si, CoreGraphics est sur tous les MAC OS X depuis la 10.0 (c'est l'API fondamentale qui gére le graphisme).

    Peut-être confonds-tu avec CoreImage, présent que depuis 10.4 seulement...
  • wiskywisky Membre
    17:47 modifié #7
    En effet je confond. Merci pour tes lumières.
    Je suis telement crevé en ce moment que je ne sais plus où j'habite ;)


    PS: C'est une expression!
  • ChachaChacha Membre
    août 2005 modifié #8
    dans 1124861930:

    Je vair faire des recherches sur le forums pour trouver comment créer une NSImage ;)

    Tu peux faire une copie de l'image originale :
    NSImage* newImage = [image copy];
    Ou bien créer une nouvelle image
    NSImage* newImage = [[NSImage alloc] initWithSize:...];

    Dans les deux cas, penser au release !

    +
    Chacha
  • wiskywisky Membre
    17:47 modifié #9
    dans 1124871578:

    dans 1124861930:

    Je vair faire des recherches sur le forums pour trouver comment créer une NSImage ;)

    Tu peux faire une copie de l'image originale :
    NSImage* newImage = [image copy];
    Ou bien créer une nouvelle image
    NSImage* newImage = [[NSImage alloc] initWithSize:...];

    Dans les deux cas, penser au release !

    +
    Chacha

    Un "autorelease"! Si je "release" avant de faire le "return" il n'y aura aucune image et ça plantera.

    Il y a un autre truc que je veux faire avec un drag-and-drop. Comment re-déssiner la mise en évidence de la destination dans une NSTableView. C.à .d mettre un fond de couleur sur la ligne qui reçoit le "drag-and-drop"?

    J'ai déjà  ça mais ça ne marche que quand il entre dans la NSTableView:
    <br />- (NSDragOperation)draggingEntered:(id &lt;NSDraggingInfo&gt;)sender<br />
    


    J'ai déjà  sous-classé ma NSTableView  :)beta:
  • ChachaChacha Membre
    17:47 modifié #10
    dans 1124872836:
    Il y a un autre truc que je veux faire avec un drag-and-drop. Comment re-déssiner la mise en évidence de la destination dans une NSTableView. C.à .d mettre un fond de couleur sur la ligne qui reçoit le "drag-and-drop"?


    Il ya déjà  un surlignage, normalement, un cadre noir un peu épais qui entoure la ligne de destination. Cependant, si tu veux encore plus personnaliser, je pense que c'est dans les surcharges de

    -(NSDragOperation)tableView:(NSTableView *)tableView validateDrop:(id <NSDraggingInfo>)info
                    proposedRow:(int)row proposedDropOperation:(NSTableViewDropOperation)operation

    et

    -(BOOL)tableView:(NSTableView *)tableView acceptDrop:(id <NSDraggingInfo>)info row:(int)row
                                            dropOperation:(NSTableViewDropOperation)operation

    Mais normalement, tu les as déjà  surchargées, non ?
    Le problème que je vois, c'est qu'il doit être facile de modifier la couleur d'une ligne, mais je ne vois pas quand la restaurer...

    À méditer.

    +
    Chacha
  • wiskywisky Membre
    17:47 modifié #11
    En effet elle sont déjà  surchargées.
    Justement je ne veut pas de ce cadre noir moche.

    Je n'est encore rien trouvé.  :why?:
Connectez-vous ou Inscrivez-vous pour répondre.