[Résolu] DragAndDrop interne - partie source
berfis
Membre
Bonjour,
J'ai une classe dérivée de NSView pour laquelle j'aimerais faire du drag and drop interne à l'application.
Il s'agit de pastilles de couleurs qui doivent échanger leurs couleurs lorsque l'une est glissée/déposée sur une autre.
Comme je n'ai pas envie de créer autant d'images qu'il existe de couleurs, je crée une copie de la pastille dans une bitmap et je me sers de cette image pour figurer l'objet en déplacement.
Lors du mouseDown, je fais ceci:
// - (void)mouseDown:(NSEvent *)theEvent
// {
if (self.isDraggable)
{
[self lockFocus];
NSBitmapImageRep *bitmap = [[NSBitmapImageRep alloc] initWithFocusedViewRect:[self bounds]];
[self unlockFocus];
NSImage *im = [[NSImage alloc]initWithCGImage:[bitmap CGImage] size:self.bounds.size];
NSPasteboard *pboard;
pboard = [NSPasteboard pasteboardWithName:NSDragPboard];
[pboard declareTypes:[NSArray arrayWithObject:NSTIFFPboardType] owner:self];
[pboard setData:[[self image] TIFFRepresentation] forType:NSTIFFPboardType];
NSPoint location = [self convertPoint: [theEvent locationInWindow] fromView: nil];
[self dragImage:im at:location offset:NSMakeSize(0.0, 0.0) event:theEvent pasteboard:pboard source:self slideBack:YES];
}
else [super mouseDown:theEvent];
}
Mais... pas moyen de faire démarrer l'image "virtuelle" à l'endroit exact de la vue de départ. J'ai essayé tous les bricolages possibles sur les coordonnées de "location".
Comment fait-on? D'avance merci.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Il faut que tu prennes au compte le point du clic dans l'image source (distance par rapport au bord de l'image) et que tu décales la location de départ en conséquence.
Merci pour la réponse, mpergand.
Je m'embrouille à nouveau dans ces coordonnées: ce doit être un problème de isFlipped: je reçois des coordonnées basées sur une origine en haut à gauche (QuickDraw) mais l'image elle-même semble être positionnée selon une origine en bas à gauche (Cocoa).
Bon finalement j'ai résolu comme ça:
Saute d'humeur:
Je déteste cette origine des coordonnées Cocoa, qui semble être une décision de matheux plutôt que de programmeur: l'origine de l'écran Mac est en haut à gauche, comme le sens de la lecture, le redimensionnement de fenêtres, le déroulement des menus et... le balayage de l'écran. En bas à gauche... n'importe quoi! Il semble que iOS marque un retour au bon sens de ce point de vue.
Voilà , bon an mal an j'ai résolu le problème complet du Drag And Drop.
Attention à la lecture de la doc. Les étapes à reproduire pour le Drag And Drop peuvent donner l'impression d'être facultatives, or certaines le sont et d'autres retournent par défaut un message qui interrompt la procédure.
Si
peuvent être laissées de côté lorsqu'on n'implémente pas de signal visuel (comme un highlight de la vue de destination), en revanche
doivent être implémentées pour retourner YES (le défaut est NO).
​Bon. L'avantage, c'est comme pour tout: une fois qu'on a compris, on peut réutiliser le code ad infinitum. ^_^