Implémentation du drag sous Cocoa

  • Créateur du sujet Créateur du sujet Membre supprimé 2
  • Date de début Date de début
M

Membre supprimé 2

Invité
Je suis en train d'essayer d'implémenter le drag à partir d'une NSTableView... et je peine, et surtout je me rends compte que Learning Cocoa est assez minimal une fois que l'on sort des tutoriaux proposés.

Premier truc que je ne comprends pas, Cocoa/Java implémente les NSRect, NSPoint, etc. sous forme d'objet derivé de NSObject, ça semble logique et propre... mais pourtant côté Cocoa/Objectiv-C tout cela est implémenté par un tas de fonctions assez "moches" et surtout dont je ne vois pas trop l'intérêt (par rapport à l'approche objet de Cocoa/Java)... En fait si j'ai bien compris, NSRect en Cocoa/Objectiv-C est une structure C ...??
Comment se gère alors l'allocation et la désallocation (de la mémoire) de variables NSRect ? Je précise que mes connaissances en C sont limités.

Donc maintenant venons en au fait...
J'ai donc fait une sous-classe de NSTableView dans IB appelé MyTableView et je l'ai assigné comme classe de laa TableView à l'intérieur de ma fenêtre principal.
Ensuite j'ai modifié MyTableView en surchargeant la méthode mouseDown :
* dans un premier temps, je l'ai surchargée en utilisant la méthode :

- (BOOL)dragFile
frown.gif
NSString *)fullPath
fromRect
frown.gif
NSRect)aRect
slideBack
frown.gif
BOOL)slideBack
event
frown.gif
NSEvent *)theEvent

ça marchait, mais y avait un problème, quand je droppais le fichier dans un dossier, ou sur le bureau, j'obtenais un alias et non pas un déplacement, et la seconde chose qui m'ennuyait, je n'avais pas l'image de la rangée selectionnée qui était déplacée lors du drag mais l'icône du fichier concerné...

j'ai donc essayé de modifier ça en implémentant...

* dans un deuxième temps
@implementation MyTableView

- (void)mouseDown
frown.gif
NSEvent *)event
{
NSArray *rows = [NSArray arrayWithObject:[NSNumber numberWithInt:[self selectedRow]]];
NSImage *rowsImage = [self dragImageForRows:rows
event:event
dragImageOffset:NSZeroPoint];
NSRect *rowsFrame = [self frame];

/* Or je n'arrive pas à compiler à cause de la ligne précédente : le type renvoyé par [self frame] ne concorde pas avec NSRect ... ? */

NSPasteboard *pboard = [NSPasteboard pasteboardWithName:NSDragPboard];

[pboard declareTypes:[NSArray arrayWithObject:NSFilenamesPboardType] owner:self];
[pboard setPropertyList:[NSArray arrayWithObject:@"/Users/qmathe/Test debug/"] forType:NSFilenamesPboardType];

[self dragImage:rowsImage
at: NSMakePoint(NSMinX(rowsFrame), NSMaxY(rowsFrame))
offset:NSMakeSize(0.0, 0.0)
event:event
pasteboard
tongue.gif
board
source:self
slideBack:YES];

[rows release];
[rowsImage release];
[pboard release];
}

@end

Je me demande donc si je suis à côté de la plaque, même une fois le problème de compilation avec NSRect résolu ?

D'autre part, j'ai essayé de comprendre le protocole NSDraggingSource, mais apparament ce protocole ne s'implémente pas comme les autres parce qu'il est "informal protocol" ???
Et je ne comprends pas en quoi il est nécessaire étant donné que ma première solution se passait de lui...
Et surtout je ne comprends rien à la méthode

- (unsigned int)draggingSourceOperationMaskForLocal
frown.gif
BOOL)flag

et notamment les valeurs de retour possibles :
NSDragOperationCopy The data represented by the image can be copied.
NSDragOperationLink The data can be shared.
NSDragOperationGeneric The operation can be defined by the destination.
NSDragOperationPrivate The operation is negotiated privately between the source and the destination.
NSDragOperationEvery Combines all the above.

voilà, c'est long, mais Cocoa est plus aride que je ne le pensais ou peut-être est-ce plutôt Learning Cocoa et la doc d'Apple qui son très spartiates...