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+ Discussion :

[gtkmm] Drag n drop dans une Gtk::Grid


Sujet :

GTK+

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2012
    Messages : 2
    Points : 3
    Points
    3
    Par défaut [gtkmm] Drag n drop dans une Gtk::Grid
    Salut à tous !

    Dans le cadre de mon stage, j'utilise gtkmm pour créer un petit programme permettant de modifier le lanceur d'applications Apwal. J'ai reservé un cadre dans le lanceur pour des applications web, et je voudrais pouvoir en ajouter/déplacer/supprimer sans passer par l'éditeur lourd d'Apwal. Mon idée est donc d'afficher son contenu dans une Gtk::Grid et d'utiliser du drag and drop pour les déplacer.

    Mon souci, c'est que même en m'inspirant très fortement du tutoriel présent dans le livre Programming with gtkmm, rien ne fonctionne (alors que l'exemple compilé sur ma machine fonctionne à merveille).

    Je place des objets WebApp (hérités de Gtk::Image) dans une Gtk::Grid de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    WebApp* app; 
     
     // Je boucle pour tous les noeuds XML correspondant à des webapps
    for(xmlpp::NodeSet::iterator i=result.begin(); i!=result.end(); i++) {
     
            app = Gtk::manage(new WebApp());
     
            // Je vous fais grâce du parsing XML pour récupérer le contenu de la webapp ^^
            // Bref, quand mon objet app est prêt :
     
    	app->drag_source_set(listTargets); 
            // duh est une fonction test pour voir si j'émet des signaux
    	app->signal_drag_begin().connect(sigc::mem_fun(*this,&BobEditor::duh));
    	app->signal_drag_data_get().connect(sigc::mem_fun(*this,&BobEditor::on_drag_data_get) );
    	app->drag_dest_set(listTargets);
    	app->signal_drag_data_received().connect(sigc::mem_fun(*this,&BobEditor::on_drag_data_received) );
     
    	appGrid.attach(*app,app->GetX(),app->GetY(),1,1);
    }
    listTargets correspond au vector suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    std::vector<Gtk::TargetEntry> listTargets;
    listTargets.push_back( Gtk::TargetEntry("APP") );
    listTargets.push_back( Gtk::TargetEntry("text/plain") );
    Mes fonctions on_drag_data_get() et on_drag_data_recieved() sont les copies de celles du tutoriel, duh() affiche "duh".

    Et strictement rien ne se passe ! Ma grille s'affiche mais ne réagit absolument pas au drag and drop.

    Si quelqu'un a une idée du problème, je suis tout ouïe !

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Avril 2010
    Messages : 85
    Points : 61
    Points
    61
    Par défaut
    Salut !

    on ne peut pas tester avec ce que tu fournis comme code.
    mais vérifie si dans la fonction liée à signal_drag_data_get()
    tu modifie bien (set_text) le selectiondata&
    pour le récupérer (get_data_as_string())

    ensuite si tu as bien drag_source_set pour les widgets source
    et drag_dest_set pour les widgets destinations

    ce sont les mêmes chez toi ?

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2012
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Voila la totalité du fichier BobEditor.cpp dans lequel on trouve les méthodes de drag&drop. Je joins également les autres fichiers utiles.

    J'utilise bien drag_source_set() et drag_dest_set() sur mes objets, je me demande si le problème ne vient pas du fait que je manipule des pointeurs obtenus par la méthode Gtk::manage(), mais je ne peux pas faire autrement vu que je ne peux pas savoir à l'avance combien d'apps il va falloir afficher.

    Quand à la méthode reliée à signal_drag_data_get(), elle est la copie de celle de l'exemple du livre Programming with gtkmm, que je parviens à compiler et qui fonctionne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
     
    #include "BobEditor.hpp"
     
    using namespace std;
     
    BobEditor::BobEditor() : appGrid()
    {
    	set_events(Gdk::ALL_EVENTS_MASK);
     
    	add(appGrid);
     
      listTargets.push_back( Gtk::TargetEntry("APP") );
      listTargets.push_back( Gtk::TargetEntry("text/plain") );
     
    	GetAppGrid();
     
    	show_all_children();
    }
     
    void BobEditor::GetAppGrid()
    {
    	// Parsing du fichier de configuration apwal
    	string filepath = "/home/";
    	filepath += getenv("USER");
    	filepath += "/.apwalrc.xml";
    	xmlpp::DomParser parser(filepath);
    	xmlpp::Document* doc = parser.get_document();
     
    	// Recherche des webapps
    	string request = "//app[(starts-with(cmdline/text(),'chromium-browser') and x>='"
    												+ boost::lexical_cast<std::string>(XMIN)
    												+ "' and x<='"
    												+ boost::lexical_cast<std::string>(XMAX)
    												+ "') or starts-with(cmdline/text(),'bobedit')]";
    	xmlpp::NodeSet result;
    	xmlpp::Element* root = doc->get_root_node();
    	result = root->find(request);
     
    	cout << result.size() << " apps trouvées" << endl;
     
    	// Construction des objets WebApp et de la grille
    	WebApp* app; 
     
    	for(xmlpp::NodeSet::iterator i=result.begin(); i!=result.end(); i++) {
    		app = Gtk::manage(new WebApp());
    		xmlpp::Node::NodeList ic = dynamic_cast<xmlpp::Node*>(*i)->get_children();
     
    		for(xmlpp::Node::NodeList::iterator j=ic.begin(); j!=ic.end(); j++) {
     
    			if(dynamic_cast<xmlpp::Node*>(*j)->get_name().compare("cmdline")==0) {
    				xmlpp::Element* cmdNode = dynamic_cast<xmlpp::Element*>(*j);
    				app->SetIcon( cmdNode->get_child_text()->get_content() );
    			}
     
    			if(dynamic_cast<xmlpp::Node*>(*j)->get_name().compare("icon")==0) {
    				xmlpp::Element* iconNode = dynamic_cast<xmlpp::Element*>(*j);
    				app->SetIcon( "/home/k/" + iconNode->get_child_text()->get_content() );
    			}
     
    			if(dynamic_cast<xmlpp::Node*>(*j)->get_name().compare("x")==0) {
    				xmlpp::Element* xNode = dynamic_cast<xmlpp::Element*>(*j);
    				app->SetX( boost::lexical_cast<int>(xNode->get_child_text()->get_content())-XMIN );
    			}
     
    			if(dynamic_cast<xmlpp::Node*>(*j)->get_name().compare("y")==0) {
    				xmlpp::Element* xNode = dynamic_cast<xmlpp::Element*>(*j);
    				app->SetY( boost::lexical_cast<int>(xNode->get_child_text()->get_content())-YMIN );
    			}
    		}
    		app->drag_source_set(listTargets);
    		app->signal_drag_begin().connect(sigc::mem_fun(*this,&BobEditor::duh));
    		app->signal_drag_data_get().connect(sigc::mem_fun(*this,&BobEditor::on_drag_data_get) );
    		app->drag_dest_set(listTargets);
    		app->signal_drag_data_received().connect(sigc::mem_fun(*this,&BobEditor::on_drag_data_received) );
     
    		appGrid.attach(*app,app->GetX(),app->GetY(),1,1);
    	}
     
    	// Remplissage de la grille avec des WebApps vides
    	request = "//app[starts-with(cmdline/text(),'bobedit')]/y/text()";
    	cout << root << endl;
    	result = root->find(request);
     
    	for(xmlpp::NodeSet::iterator i=result.begin(); i!=result.end(); i++) {
    		YMAX = boost::lexical_cast<int>( dynamic_cast<xmlpp::TextNode*>(*i)->get_content() ) - YMIN;
    	}
     
    	cout << "Dernière ligne = " << YMAX << endl;
     
    	string blankIcon = "/home/";
    	blankIcon += getenv("USER");
    	blankIcon += "/.icons/apwal/theme/5.png";
    	for(int i=0; i<=XMAX-XMIN; i++) {
    		for(int j=0; j<=YMAX; j++) {
    			if( !appGrid.get_child_at(i,j) ) {
    				app = Gtk::manage(new WebApp("open","",blankIcon,i,j));
    				appGrid.attach(*app,i,j,1,1);
    			}
    		}
    	}
    }
     
    void BobEditor::duh(const Glib::RefPtr<Gdk::DragContext>& context)
    {
    	cout << "dah" << endl;
    }
     
    void BobEditor::on_drag_data_get(const Glib::RefPtr<Gdk::DragContext>& context,
    											Gtk::SelectionData& selection_data, guint info,
    											guint time)
    {
      selection_data.set(selection_data.get_target(), 8 /* 8 bits format */,
              (const guchar*)"I'm Data!",
              9 /* the length of I'm Data! in bytes */);
    }
     
    void BobEditor::on_drag_data_received(const Glib::RefPtr<Gdk::DragContext>& context,
    														int x, int y,const Gtk::SelectionData& selection_data,
    														guint info, guint time)
    {
      const int length = selection_data.get_length();
      if((length >= 0) && (selection_data.get_format() == 8))
      {
        std::cout << "Received \"" << selection_data.get_data_as_string()
            << "\" in label " << std::endl;
      }
     
      context->drag_finish(false, false, time);
    }
     
    BobEditor::~BobEditor()
    {
    }
    --------
    EDIT
    --------

    Entre temps j'ai trouvé une solution : faire hériter mes WebApp de Gtk::Button au lieu de Gtk::Image... En soi ce n'est pas gênant, même si je ne comprend pas pourquoi les méthodes de drag&drop, héritées de Widget, marchent avec les Button et pas avec les Image... problème de détection de l'évènement clic pour commencer le drag ?

    Bref, c'est résolu ! Merci
    Fichiers attachés Fichiers attachés

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Avril 2010
    Messages : 85
    Points : 61
    Points
    61
    Par défaut
    Oui c'est etonnant. j'ai déjà fait des DnD avec des drobjets héritant de drawingarea, ça marche. Peut être faut il ajouter un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    add_events(BUTTON_MOTION_MASK | BUTTON_PRESS_MASK | BUTTON_RELEASE_MASK);
    aux Images par rapport aux drawing areas

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Drag And Drop dans une Grid
    Par amandinerenard dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 13/05/2013, 17h41
  2. Drag and drop dans une seul listview
    Par jacko842 dans le forum VB.NET
    Réponses: 0
    Dernier message: 21/04/2010, 13h42
  3. [script.aculo.us] Drag and drop dans une div avec un scroll horizontal
    Par ridan dans le forum Bibliothèques & Frameworks
    Réponses: 7
    Dernier message: 21/07/2009, 19h14
  4. [VB.net] Drag and drop dans une Treeview
    Par gégécap dans le forum Windows Forms
    Réponses: 2
    Dernier message: 19/10/2006, 10h05
  5. [VB.NET]Drag and Drop dans une Listview
    Par gégécap dans le forum Windows Forms
    Réponses: 5
    Dernier message: 23/08/2006, 18h41

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