NSCursor pendant un mouseDragged
AliGator
Membre, Modérateur
Bonsoir tout le monde
Alors voilà : j'ai une NSView (sous-classée en MyView) qui est encapsulée dans une NSScrollView (dans IB : Layout --> Make subviews of --> Scroll View).
Au passage : MyView sert à afficher une NSImage, donc je change sa frameSize quand je change la NSImage (juste avant mon setNeedsDisplay:YES).
J'ai rajouté une possibilité de scroller ma MyView quand je fais un cliquer-glisser dessus (surcharge de mouseDown pour mémoriser dans une v.i. la position du clic, et de mouseDragged pour faire un scrollPoint)
Maintenant j'aimerais mettre le openHandCursor dès que MyView est survolée (mouseEntered) ou au moins cliquée (mouseDown)
Mais j'ai eu beau essayer plein de trucs, j'arrive jamais à ce que je veuxÂ
Bref je commence à saturer à essayer plein de trucs alors que ça doit être tout con.
Le mieux pour l'instant c'est le "set" sur le openHandCursor, repris dans le mouseDragged... mais du coup ça "flashouille" entre la main et la flèche...
HELP ! :why?:
Alors voilà : j'ai une NSView (sous-classée en MyView) qui est encapsulée dans une NSScrollView (dans IB : Layout --> Make subviews of --> Scroll View).
Au passage : MyView sert à afficher une NSImage, donc je change sa frameSize quand je change la NSImage (juste avant mon setNeedsDisplay:YES).
J'ai rajouté une possibilité de scroller ma MyView quand je fais un cliquer-glisser dessus (surcharge de mouseDown pour mémoriser dans une v.i. la position du clic, et de mouseDragged pour faire un scrollPoint)
Maintenant j'aimerais mettre le openHandCursor dès que MyView est survolée (mouseEntered) ou au moins cliquée (mouseDown)
Mais j'ai eu beau essayer plein de trucs, j'arrive jamais à ce que je veuxÂ
- J'ai commencé par mettre [tt][[NSCursor openHandCursor] push][/tt] dans le mouseDown et le [tt][NSCursor pop][/tt] dans mouseUp, mais bien que quand je clique ça mette bien la main, dès que je bouge la souris pour commencer mon drag c'est le arrowCursor qui revient. ??? >:(
- J'ai essayé avec un [tt][[NSCursor openHandCursor] set][/tt] dans mouseDown (ou mouseEntered) et dans mouseDragged (et [tt][[NSCursor arrowCursor] set][/tt] dans mouseUp (ou mouseExited)) et c'est le mieux que j'ai réussi, ça marche pas trop mal, mais dès que j'arrête de bouger la souris, arrowCursor revient (même si je relâche pas le bouton). Et la main ne se remet que quand je recommence à bouger...
- Alors j'ai enlevé mes "set" et mes "push/pop" et j'ai essayé avec [tt]addCursorRect:[self bounds]cursor:[NSCursor openHandCursor][/tt] dans mon initWithFrame de MyView mais sans plus de succès. :-\\
- J'ai même essayé [tt]discardCursorRects[/tt] + [tt]addTrackingRect:owner:userData:assumeInside:[/tt] mais sans succès non plus. :crackboom:-
Bref je commence à saturer à essayer plein de trucs alors que ça doit être tout con.
Le mieux pour l'instant c'est le "set" sur le openHandCursor, repris dans le mouseDragged... mais du coup ça "flashouille" entre la main et la flèche...
HELP ! :why?:
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Essaie d'implanter dans ta vue la méthode draggingSourceOperationMaskForLocal: en retournant la valeur NSDragOperationNone.
.
Voila, normalement, ces méthodes sont appelées automatiquement.
Puis dans le mouseDown: il faut que tu mettes à jour les curseurs pour que la mimine soit fermée et donc, tu change _isDragging et tu invalide les curseurs, d'où :
Et enfin, pour que la main redevienne ouverte dans le mouseUp
Voila, je ne sais pas si ca répond à ta question, mais c'est ce que je fais dans Geodes
Bru, pour donner plus de précisions :
Ce n'est pas un drag&drop de mon image qui est fait et que je veux faire. Juste pouvoir déplacer ma vue dans sa scrollview par cliquer-glisserc ce qui fonctionne déjà d'ailleurs. Et ce que le curseur de la main est sensé indiquer d'un seul coup d'oeil.
A moins que tu ne veuilles insinuer que Cocoa pense que je veuille faire un drag&drop, mais que comme je n'ai pas implémenté les méthodes pour le faire, bien sûr il ne le fait pas, mais le curseur est quand même affecté ? ???
Je regarde l'exemple du Grab-Scrolling (qui correspond à ce que j'ai implémenté en effet) et le code de fouf dès que j'ai un peu de temps à consacrer à Xcode
Merci de vos pistes 8)
En fait, je fais mon petit contrôle genre poignée pour redimensionner mes vues.
J'ai la fonction resetCursor... dans laquelle je dis que le curseur doit être le curseur de redimensionnement lorsque la souris passe dessus. Ca roule.
Mais quand je drag, tant que le curseur reste dans le contrôle, ca fonctionne, mais dès qu'il en sort (par exemple, si je vais plus vite que le redimensionnement ou si j'ai atteint la taille mini), il redevient la flèche.
J'ai tenté de virer les rectangles de tracking, pas mieux.
De forcer le curseur dans MouseDragged, même phénomène qu'Ali (clignote).
En fait, on dirait que le drag reset le curseur...
Pourtant, dans RBSplitView, le curseur ne change pas mais j'ai du mal a analyser le code parce qu'il n'utilise pas mouseDragged. Au lieu de ça, il fait tout dans MouseDown avec ce genre de boucle :
J'ai même tenté un addCursorRect sur toute la fenêtre lors de la détection du drag... sans succès...
Bref, y a un truc qui m'échappe avec le mouseDragged et les curseurs... :why?: us :-)
J'ai regardé le code de Eddy58 mais il s'agit d'un drag particulier dans une ScrollView (ca répondra à Ali à mon avis)) et une fonction liée au NSCursor gère ça bien.
Le code de Fouf me semble bien aussi mais je pense que même pb si on sort de la vue...
Trouvée dans cet exemple justement. Il faut donc mettre dans mouseDown et mouseUp de la View, la ligne [tt][(NSScrollView*)[self superview] setDocumentCursor:curs];[/tt] : Ce qui modifie bien le curseur pendant le déplacement.
(J'ai mis le code du mouseDragged aussi si ça en intéresse, mais il n'y a pas besoin de toucher au curseur dedans comme vous le voyez)
Maintenant il faut aussi rajouter cette ligne magique lorsque la vue est créée.
J'ai donc mis la ligne magique dans le initWithFrame de MyView mais ça n'a pas marché... mais sans doute parce que ma vue à l'origine est vide et se redimentionne que lorsque j'ai mon image.
Donc j'ai mis la méthode qui calcule mon image avant le [tt]setNeedsDisplay[/tt] : (où mapView est un outlet vers ma vue bien sûr)
Donc 3 occurences de [tt]setDocumentCursor[/tt] et c'est fait Fallait juste trouver que c'est par setDocumentCursor qu'il faut passer
De mon côté, je ne peux utiliser cette méthode car je ne suis pas dans une NSScrollView...
J'ai trouvé une solution que je vous avais déjà donné :
while ((theEvent = [NSApp nextEventMatchingMask:NSLeftMouseDownMask|NSLeftMouseDraggedMask|NSLeftMouseUpMask untilDate:[NSDate distantFuture] inMode:NSEventTrackingRunLoopMode dequeue:YES])&&([theEvent type]!=NSLeftMouseUp)) {
// Set up a local autorelease))
Dans le mouseDown, on enclenche une boucle et on gère les évènements jusqu'au mouseup.
Dans ce cas, ça fonctionne bien et le curseur est constant et bien celui que je désire.
Une question cependant : mon appli sera multi thread plus tard. Il y aura des actions qui se dérouleront en parallèle et qui mettront à jour une autre vue.
Si je fais un drag avec une boucle de ce type, ca va tout bloquer non ? Je ne pourrai plus observer le boulot des autres thread ?
Je réouvre ce sujet car j'ai un problème parfaitement similaire à celui de LeChatNoir.
Par contre, je ne comprends pas bien ta technique .... Tu peux m'en dire plus ?
ouh la la, ca me parait loin tout ça ! J'ai pas retouché au code depuis ... pffff....
Je me rappelle vaguement de ce pb. J'avais réussi à le résoudre mais malheureusement, j'ai ensuite utilisé les possibilités de RBSplitView (qui permet de définir une poignée de drag).
Donc tu peux éventuellement chercher dans le code de Pom'F mais pas dans les dernières versions. La version juste avant celle ou j'ai revue l'utilisation de RBSplitView (j'avais des commentaires donc tu devrais t'y retrouver).
A+ et bon courage !
J'en profite pour passer un ch'tit bonjour à tous les habitués et m'excuses de ne plus participer... Vraiment désolé mais je consacre mon temps à d'autres choses... J'espère y revenir un jour mais quand je vois la vitesse ou ça va, ça me fait peur (iPhone, Leopard, Core Animation, etc...).
Continuez bien et à bientot !
Je vais quand même décrire mon problème :
J'ai une vue perso. je voudrais que lorsque je rentre dans une zone de la vue, le curseur se change en main ouverte. Pour ça c'est OK avec :
Après, et c'est là que ça se complique, je voudrais que lorsque je clique et que je fais un drag, le curseur devienne la main fermée, et que lors du mouseUp il redevienne la main ouverte.
Comme Ali à l'époque, j'ai un peu tout essayé sans réussir à trouver la bonne solution. Et pour faciliter la chose, la page traitant de ce sujet dans la doc Apple n'existe plus ...
Attention : ma vue n'est pas dans une NSScrollView ou NSClipView, donc la méthode setDocumentCursor: n'est pas utilisable ...
Fouille dans le code de RBSplitView.
A+