Dock + Drag&Drop

Je sais gérer le drag&drop sur l'icône ou sur la fenêtre de l'application. 


Quand l'application est ouverte, son icône est dans le dock. Je ne trouve pas  comment faire le Drag&drop sur cette icône.


De quel coté dois-je chercher ?


Réponses

  • Il m semble que c'est : application(sender: NSApplication, openFile filename: String) -> Bool qui se charge de ça. (désolé pour le Swift)


  • CéroceCéroce Membre, Modérateur

    Je confirme, méthode de NSApplicationDelegate. Il n'y a pas de différence avec double-cliquer sur le fichier depuis le Finder.


  • heu..! J'ai vérifié. C'est ce que j'avais programmé pour la réception d'un drag&drop sur l'icône de l'application.  ça ne marche que si l'application est fermée et ça ne marche plus si l'application est ouverte !  


    Je me suis peut-être mal exprimé sur ce que je cherche. L'application étant lancée, son icône apparait dans le dock. Je veux ouvrir le fichier que je drag&drop sur son icône dans le dock.


  • CéroceCéroce Membre, Modérateur

    Non, tu t'es bien exprimé.


    Tu me mets le doute, et je n'ai pas le temps de vérifier, mais la doc d'Apple de cette méthode -[application:openFile:] distingue bien le cas où l'appli n'est pas encore ouverte.


     


    Si tu utilises NSDocument, tu dois laisser faire le NSDocumentController, et ne pas implémenter cette méthode.


  • tabliertablier Membre
    décembre 2015 modifié #6

    ça ne marche toujours pas ! Je ne traite qu'un fichier à  la fois, donc je n'utilise pas NSDocument et donc pas de NSDocumentController. J'ai donc implémenté les 4 méthodes draggingEntered:prepareForDragOperation:performDragOperation: et concludeDragOperation: pour le Drag&Drop sur la fenêtre de l'application. Puis j'ai implémenté la méthode application:openFile pour le Drag&Drop sur l'icône de l'application.


  • MalaMala Membre, Modérateur
    décembre 2015 modifié #7

    Il n'y a pas besoin d'implémenter draggingEntered:, etc.


     


    Attention à  ne pas se mélanger les pinceaux. Il faut utiliser la méthode suivante...



    - (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames

    - avec un "s" à  file. -


     


    La méthode sans "s" renvoie un booléen et est juste utilisée pour savoir si une extension de fichier est supportée par l'appli. Elle ne sert en aucun cas à  initier un chargement.


  • Oui, j'ai bien vu cette méthode. Mais je n'ai pas vraiment compris la chose.


    Je vais re-essayer !

  • tabliertablier Membre
    décembre 2015 modifié #9

    Mala tu as raison mais ce n'est pas ce que je comprend dans la doc de application:openFiles:



    Identical to application:openFile: except that the receiver opens multiple files corresponding to the file names in the  filenamesArray



     


    Je n'autorise pas le drag&drop multiple, alors pourquoi application:openFile: ne fonctionne-t-il pas ? Sa doc semble pourtant autoriser l'ouverture d'un fichier unique:



    Sent directly by theApplication to the delegate. The method should open the file filename, returning YES if the file is successfully opened, and NO otherwise.



     


    Bon je vais reprendre ça pour vérifier que je fais tout correctement. (j'aime bien comprendre !)


  • tabliertablier Membre
    décembre 2015 modifié #10

    Il faut toujours conclure une suite de posts ! allons-y !


     


    J'ai trouvé mon erreur. Tout tient dans cette phrase que je n'ai pas suffisamment respecté:



    Sent directly by theApplication to the delegate. The method should open the file filename, returning YES if the file is successfully opened, and NO otherwise. If the user started up the application by double-clicking a file, the delegate receives the application:openFile: message before receiving applicationDidFinishLaunching:. (applicationWillFinishLaunching: is sent before application:openFile:.)



    Donc pour traiter le fichier reçu, les initialisations nécessaires doivent être faites soit dans awakeFromNib, soit dans applicationWillFinishLauching:.


    Et j'ai oublié une des initialisations dans applicationDidFinishLauching: !! 


    Donc application:openFile avec ou sans s marche quand on n'oublie rien !! 


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