[Résolu] DragAndDrop interne - partie source

berfisberfis Membre
juillet 2013 modifié dans API AppKit #1

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.


Mots clés:

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.

  • berfisberfis Membre
    juillet 2013 modifié #3

    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:



    location.x -=self.bounds.size.width/2;
    location.y +=self.bounds.size.height/2; 

    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.


  • berfisberfis Membre
    juillet 2013 modifié #4

    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.  ^_^ 


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