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] Complétion optimisée


Sujet :

GTK+

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 151
    Points : 83
    Points
    83
    Par défaut [Gtkmm] Complétion optimisée
    Bonjour,

    J'ai ajouté des complétions sur des Entry et ComboBoxEntryText, tout marche pour le mieux. Ce que je souhaite est que lorsque je rentre une chaîne dans l'entry, les choix possibles correspondent à la sous chaîne saisie (et non le début comme par défaut).

    Un exemple pour être plus clair. Les complétions possibles sont "maison", "arbre", "zebre".
    Lorsque je tape "re", je voudrais que les choix proposés soient "arbre" et "zebre" ou si je met "son", j'ai comme choix "maison".

    Pour le moment, j'arrive à récupérer les bons choix possibles (en affichant avec cout) mais la complétion de l'entry ne se met pas à jour et m'affiche toujours tous les choix possibles.

    Voici mon code :

    constructeur :
    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
     
      Glib::RefPtr<Gtk::EntryCompletion> completion =
          Gtk::EntryCompletion::create();
      m_Entry.set_completion(completion);
     
      Glib::RefPtr<Gtk::ListStore> refCompletionModel =
          Gtk::ListStore::create(m_Columns);
      completion->set_model(refCompletionModel);
     
      // Permet la completion affinée
      completion->set_match_func( sigc::mem_fun(*this, &ExampleWindow::on_completion_match) );
     
      //Fill the TreeView's model
      Gtk::TreeModel::Row row = *(refCompletionModel->append());
      row[m_Columns.m_col_id] = 1;
      row[m_Columns.m_col_name] = "maison";
     
      row = *(refCompletionModel->append());
      row[m_Columns.m_col_id] = 2;
      row[m_Columns.m_col_name] = "arbre";
     
      row = *(refCompletionModel->append());
      row[m_Columns.m_col_id] = 3;
      row[m_Columns.m_col_name] = "zebre";
     
      completion->set_text_column(m_Columns.m_col_name);
     
      for(type_actions_map::iterator iter = m_CompletionActions.begin();
              iter != m_CompletionActions.end(); ++iter)
      {
        int position = iter->first;
        Glib::ustring title = iter->second;
        completion->insert_action_text(title, position);
      }
    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
    bool ExampleWindow::on_completion_match(const Glib::ustring& key, const
            Gtk::TreeModel::const_iterator& iter)
    {
      if(iter)
      {
        Gtk::TreeModel::Row row = *iter;
        Glib::ustring filter_string = row[m_Columns.m_col_name]; // dans quelle colonne chercher
     
        // insensible a la casse
        filter_string = filter_string.lowercase();
     
        if(filter_string.find(key)!=-1)
    	  std::cout << filter_string << std::endl; // m affiche les bonnes valeurs
          return true;
      }
     
      return false;
    }

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 151
    Points : 83
    Points
    83
    Par défaut
    J'avance petit à petit. J'ajoute dans la complétion les bonnes valeurs. Mais je n'arrive pas à supprimer les anciennes.

    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
    bool ExampleWindow::on_completion_match(const Glib::ustring& key, const
            Gtk::TreeModel::const_iterator& iter)
    {
      if(iter)
      {
        Gtk::TreeModel::Row row = *iter;
        Glib::ustring filter_string = row[m_Columns.m_col_name]; // dans quelle colonne chercher
     
        // insensible a la casse
        filter_string = filter_string.lowercase();
     
        if(filter_string.find(key)!=-1){
          Glib::RefPtr<Gtk::EntryCompletion> completion =  m_Entry.get_completion();
          completion->prepend_action_text(filter_string);
          return true;
       }
      }

  3. #3
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    gcc/g++ doit se plaindre que ta fonction est censée renvoyer un bool mais qu'elle peut se terminer sans return true/false;

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 151
    Points : 83
    Points
    83
    Par défaut
    Ca y est, j'y arrive. Par contre, lorsque je sélectionne la dernière valeur, ça ne complète pas automatiquement.

    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
    bool ExampleWindow::on_completion_match(const Glib::ustring& key, const
            Gtk::TreeModel::const_iterator& iter)
    {
      if(iter)
      {
        Gtk::TreeModel::Row row = *iter;
        Glib::ustring filter_string = row[m_Columns.m_col_name]; // dans quelle colonne chercher
     
        // insensible a la casse
        filter_string = filter_string.lowercase();
     
        if(filter_string.find(key)!=-1){
          Glib::RefPtr<Gtk::EntryCompletion> completion =  m_Entry.get_completion();
          completion->delete_action();
          completion>prepend_action_text(filter_string);
          return true;
       }]

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 151
    Points : 83
    Points
    83
    Par défaut
    En fait, il ne fallait pas supprimer l'action.
    Ça marche bien sauf que j'ai des assertion failed
    (test:20852): Gtk-CRITICAL **: gtk_list_store_remove: assertion `VALID_ITER (iter, list_store)' failed

    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
    bool ExampleWindow::on_completion_match(const Glib::ustring& key, const
            Gtk::TreeModel::const_iterator& iter)
    {
      if(iter)
      {
        Gtk::TreeModel::Row row = *iter;
        Glib::ustring filter_string = row[m_Columns.m_col_name]; // dans quelle colonne chercher
     
        // insensible a la casse
        filter_string = filter_string.lowercase();
     
        if(filter_string.find(key)!=-1){
          Glib::RefPtr<Gtk::EntryCompletion> completion =  m_Entry.get_completion();
          completion->delete_action();
          return true;
       }
       return false;
    }

  6. #6
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    Ton completion->delete_action(); me paraît bizarre.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 151
    Points : 83
    Points
    83
    Par défaut
    Et bien oui, c'est ça qui pose problème.

    En fait, il suffit de retourner vrai. Il me manquait une accolade dans mon premier code

  8. #8
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    Ouep, j'ai vu l'accolade manquante, mais dans les autres codes c'était bon donc j'ai rien dit

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

Discussions similaires

  1. Optimisation de votre SGBDR et de vos requêtes...
    Par SQLpro dans le forum Langage SQL
    Réponses: 35
    Dernier message: 11/01/2013, 11h49
  2. [langage] Optimiser la lecture d'un fichier
    Par And_the_problem_is dans le forum Langage
    Réponses: 4
    Dernier message: 05/02/2003, 08h54
  3. [VB6] [BDD] Optimisation de l'accès aux données
    Par LadyArwen dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 30/01/2003, 13h27
  4. [langage]Problème de temps de lecture, optimisation
    Par And_the_problem_is dans le forum Langage
    Réponses: 2
    Dernier message: 08/01/2003, 08h47
  5. [langage] Optimiser la lecture d'un fichier
    Par And_the_problem_is dans le forum Langage
    Réponses: 2
    Dernier message: 11/06/2002, 10h24

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