IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GTK+ avec C & C++ Discussion :

drag and drop eventbox


Sujet :

GTK+ avec C & C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3
    Par défaut drag and drop eventbox
    bonjour,

    premierement je tiens à feliciter ce site ainsi que le forum.

    apres avoir bien cherché( des heures ), je n'arrive pas à utiliser le drag and drop.

    ce que je cherche a faire :

    l'utilisateur appuye sur la souris à l'endroit ou il y a un eventbox, je cherche a recevoir le pointeur du eventbox concerné, et lorsque il lache la souris à l'endroit d'un autre eventbox, il envoie le pointeur de ce eventbox.

    je n'arrive vraiment pas, aidé moi s'il vous plait :p


    merci,

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 16
    Par défaut
    Bonjour,

    J'ai besoin de faire exactement le même système que toi ...

    Au click récupération du pointeur de l'eventbox sur laquelle est la souris.

    Au release récupération du pointeur de l'eventbox sur laquelle est la souris.

    En le faisant avec des button-press & release notify, on obtient le pointeur vers la même event box pour le click et le release, même si l'on est au dessus d'une autre event box ...

    Il semble donc obligatoire d'utiliser le drag & drop ... Mais très peu, voir pas d'exemple ne traire du drag & drop tel que l'on veut l'utiliser.

    Dans gtk-demo il y a un exemple de drag & drop semblable à ce que l'on veut faire, mais pas moyen de mettre la main sur le code !!!


    Si quelqu'un peut nous aider, ou tout du moins nous indiquer où trouver le code de gtk-demo.


    Dans l'attente d'une réponse, je vous félicité pour le forum !

    A bientot.

    Charl

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3
    Par défaut
    OOOooh, je suis pas le seul :p

  4. #4
    Membre averti

    Inscrit en
    Avril 2002
    Messages
    49
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 49
    Par défaut
    Votre probleme concerne uniquement le drag and drop avec l,eventbox ou bien c'est le drag and drop que vous n'aarrivez pas a faire fonctionner du tout ?

    Cela ne change rien d'effectuer du drag and drop sur une eventbox ou un autre widget. C'est le meme principe.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 16
    Par défaut
    Effectivement, c'est le drag&drop que je n'arrive pas à faire fonctionner.

    Pour effectuer un drag&drop, il faudrait que je sélectionne la source avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    gtk_drag_source_set( GtkWidget *widget, 
    GdkModifierType start_button_mask, 
    const GtkTargetEntry *targets, 
    gint n_targets, 
    GdkDragAction actions );
    Puis la cible avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void gtk_drag_dest_set( GtkWidget *widget, 
    GtkDestDefaults flags, 
    const GtkTargetEntry *targets, 
    gint n_targets, 
    GdkDragAction actions );

    Le 1er problème est que je n'arrive pas à utiliser ces fonctions, à part le paramètre widget, sinon je ne sais pas quoi saisir comme argument.

    Le 2ème problème est que je réalise en fait un jeu de type damier ... Avec 10*10 event box, et que je veux que le drag&drop puisse s'opérer entre les différentes cases. Or si j'ai bien compris un widget ne peut pas être source et dest en même temps ?


    En espérant que tu puisse répondre à mes intérrogations, je re remercie déjà d'avoir répondu à notre problème !


    Charl

  6. #6
    Membre averti

    Inscrit en
    Avril 2002
    Messages
    49
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 49
    Par défaut
    Alors premièrement un widget peut etre sources et destination en meme temps sans aucun probleme.

    Concernant le drag and drop le plus facile c'est déja que tu aille lire le tutorial disponible sur le site officiel de GTK. Une fois que tu l'aura lu tu aura déja compris des points essentiel et notamment la valeur des paramètres des arguments pour declarer un widget comme source et/ou destination.

    Si il y a encore des incomprehensions par rapport au drag and drop je te réponderais points par points a ce que tu ne comprend pas. Mais d'abord va me lire tout ca .

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 16
    Par défaut
    Alors, j'ai bien potassé le tuto de gtk.org ... Et j'ai bidouillé ...

    Y a du nouveau, mais c'est pas encore ca ...

    Mon drag commence avec le curseur qui change, et je peux le déplacer vers où je veux.

    Mon sous programme de vérification déplacement est bien appelé avec le signal drag-begin.

    Le problème, c'est qu'avec le signal drag-end, je recois le pointeur vers la même event-box (logique vu que c'est la source qui l'émet) ... Mais qu'avec les signaux drag-drop ou drag_data_received, mon sous programme n'est pas appelé.

    Ceci est peut être dû au fait que j'ai mis certains arguments à NULL du fait que je ne savait comment les utiliser.

    Voici le code que j'ai utilisé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    gtk_drag_source_set(pApp->pJeu->pDamier->pCase[n]->pEventBox,GDK_BUTTON1_MASK, NULL,99,GDK_ACTION_LINK);
     
    gtk_drag_dest_set(pApp->pJeu->pDamier->pCase[n]->pEventBox,GTK_DEST_DEFAULT_DROP,NULL,99,GDK_ACTION_LINK);
     
    g_signal_connect(G_OBJECT(pApp->pJeu->pDamier->pCase[n]->pEventBox), "drag-begin", G_CALLBACK(event_press), pApp);
     
    g_signal_connect(G_OBJECT(pApp->pJeu->pDamier->pCase[n]->pEventBox), "drag-end", G_CALLBACK(event_press), pApp);
    Ceci étant dans une boucle afin de "configurer" les 100 eventbox.


    Au niveau des arguments des fonctions, voilà ce que j'ai compris. Merci de me corriger si je me trompe :



    - Pour gtk_drag_source_set :

    GdkModifierType start_button_mask : Masque qui va déterminer ce qui fait commencer le drag (en l'occurence dans mon code, click gauche de la souris)

    const GtkTargetEntry *targets : Je suppose qu'il s'agit de la liste de toutes les destinations possibles ... Mais je ne sais pas comment l'établir, ni comment lui passer. Donc dans mon code c'est mis à NULL.

    gint n_targets : Le nombre de destinations ... Donc ici 100 - la source : 99.

    GdkDragAction actions : L'action que provoque le drag&drop ?
    Il y a GDK_ACTION_LINK, GDK_ACTION_COPY, GDK_ACTION_MOVE. Comme je souhaite juste obtenir un signal sur l'eventbox de départ, et sur celle d'arriver, je pense que je souhaite juste établir un "link" d'où le choix de GDK_ACTION_LINK.


    - Pour gtk_drag_dest_set :

    Pareil que pour source sauf GtkDestDefaults flags : Là j'avoue que je ne sais pas trop à quoi ca correspond ... J'ai trouvé plusieurs valeure possible sur le net, donc j'ai choisi celle qui me semblait la plus probable : GTK_DEST_DEFAULT_DROP




    Voilà, comme tu le vois c'est encore assez flou ... Je pense pu être très loin de la solution, mais je crois que j'ai besoin d'un sacré coup de pouce. J'espère que tu pourras m'aider.

    Charles

  8. #8
    Membre averti

    Inscrit en
    Avril 2002
    Messages
    49
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 49
    Par défaut
    Alors je vais deja commencer a corriger ce que tu a compris car tu as mal compris et apres je te dis pourquoi ca ne marche pas....

    - Pour gtk_drag_source_set :

    const GtkTargetEntry *targets : ce parametre permet de specificier ce que tu accepte comme objet pour le drag and drop et n_targets c'est simplement le nombre d'objets de ce meme tableau.

    GdkDragAction actions : il s'agit en faite tu type du drag and drop que tu realise. un "MOVE" , une "COPY" ou un "LINK". la difference ce joue au nivea udes signaux emis. Pour tel ou tel type d'action tu a des signaux supplementaire qui sont emis. Les deux type generalement utilise sont GDK_ACTION_COPY, GDK_ACTION_MOVE. Ca change vraiment pas grand chose dans ton cas mais utilise plutot GDK_ACTION_MOVE pour etre dans la majorite :-).


    - Pour gtk_drag_dest_set :

    GtkDestDefaults flags : plus d'info ici
    Generalement on utilise GTK_DEST_DEFAULT_ALL. Je te conseil dans ton cas de l'utilise aussi. Choisir le flags ca permet de specifier si on veut ou pas "hilghter" ses destinations , c'est a dire laisser GTK dessiner automatiquement un cadre noir en fonction de l'endroit ou pointe pas souris etc... La encore ce n'est que du detail.


    Voila pour l'eclaicissement. Alors pourquoi ton drag and drop ne marche pas ? Ben tout simplement tu a specifier comme "targets" NULL , c'es ta dire rien. Tu dis donc a GTK que rien ne peux faire du drag-and-drop. C'est un peu bete.
    Pour corriger ca il te suffit juste de creer un tablea de targets

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    static GtkTargetEntry target_list[] = {
      { "INTEGER",    0, 0},
      { "STRING",     0, 1},
      { "text/plain", 0, 2}
    };
    A la place de ton 99 tu met un 3 et sa marchera beaucoup mieux. Alors pourquoi ca va marcher , je te le dis j'en sais rien du tout. Si ton tableau est vide ou si specifie un NULL tu aura ou un SEGMENTATION FAULT ou rien ne fonctionnera comme dans ton cas. Donc on specifier des type mimes possible pour le drag-and-drop. Dans mon code 3 sont specifies ce sont les plus courant. Il n'y a que tres peu de documentation sur ca donc je pourrait pas vraiment te dire le pourquoi du comment. Il suffit juste de specifier un type mime correct pour que ton drag-and-drop fonctionne. Ici j'ai definit les 3 type standarts.

    Voila donc il te suffit juste de remplacer ton NULL , specifier le bon nombre et ca devrait marcher...;-)

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 16
    Par défaut
    Merci beaucoup !

    Déjà tes petites explications m'ont fait beaucoup de bien niveau compréhension !
    En tout cas la dernière partie de ton explication, je pense que je ne l'aurai jamais trouvé seul !

    Bref, je viens de faire les modifications en conséquence dans mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    static GtkTargetEntry target_list[] = { { "INTEGER",    0, 0},  { "STRING",     0, 1},  { "text/plain", 0, 2}  };
     
    [...]
     
    gtk_drag_source_set(pApp->pJeu->pDamier->pCase[n]->pEventBox,GDK_BUTTON1_MASK, target_list,3,GDK_ACTION_MOVE);
    gtk_drag_dest_set(pApp->pJeu->pDamier->pCase[n]->pEventBox,GTK_DEST_DEFAULT_ALL,target_list,3,GDK_ACTION_MOVE);
     
    g_signal_connect(G_OBJECT(pApp->pJeu->pDamier->pCase[n]->pEventBox), "drag-begin", G_CALLBACK(event_press), pApp);
    g_signal_connect(G_OBJECT(pApp->pJeu->pDamier->pCase[n]->pEventBox), "drag_data_received", G_CALLBACK(event_press), pApp);

    Il faut reconnaitre que le petit contour noir autour du widget destinataire est du plus belle effet ... Toutefois, ca ne marche toujours pas !

    Lorsque que je relache la souris, mon sous programme n'est toujours pas appelé ... Comme ci le signal de la fonction callback n'était pas bon.

    C'est pourtant bien celui la qu'il faut utiliser ?

    Charl

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 16
    Par défaut
    Et bien j'ai trouvé ... Il fallait en fait utiliser un autre signal !

    Et là ca marche !!! C'est génial !!! Merci beaucoup !

    D'après ce que j'ai vu on peux changer l'icone qui apparait lors du drag.

    Tu l'as fait ? Tu peux m'en dire plus à ce sujet ?


    Encore merci !! Et merci beaucoup à developpez.com et à toute l'équipe et les membres !

    Charl

  11. #11
    Membre averti

    Inscrit en
    Avril 2002
    Messages
    49
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 49
    Par défaut
    Non comme je te l'a idit par pm pour chamger l'icone je sais aps vraiment comment faire , j'ai jamais essaye...:-)

Discussions similaires

  1. Drag and drop "de l'extérieur"
    Par Invité dans le forum C++Builder
    Réponses: 12
    Dernier message: 31/03/2020, 10h10
  2. "Drag and drop" avec directinput
    Par batosai dans le forum DirectX
    Réponses: 1
    Dernier message: 16/06/2004, 16h48
  3. [VB.NET] Microsoft TreeView drag and drop ?
    Par bigtoof dans le forum ASP.NET
    Réponses: 7
    Dernier message: 24/05/2004, 14h50
  4. [JSP][DRAG AND DROP]
    Par hamed dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 23/01/2004, 17h36
  5. drag and drop
    Par jujuesteban dans le forum Composants VCL
    Réponses: 5
    Dernier message: 20/06/2003, 09h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo