#1 Le 29/05/2008, à 13:49
- Anium
[Résolu][Gtkmm ou Gtk au pire] Complétion d'une Gtk::Entry
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 :
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);
}
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;
}
Merci d'avance.
Dernière modification par Anium (Le 09/06/2008, à 13:22)
Hors ligne
#2 Le 04/06/2008, à 21:11
- rniamo
Re : [Résolu][Gtkmm ou Gtk au pire] Complétion d'une Gtk::Entry
Je connais pas gtk-- mais gtk+ mais je pense que c'est kif kif.
T'as un callback (ou tu peux en avoir un) qui s'éxécute quand tu tapes dans l'entry. Dedans tu n'as qu'à rechercher les mot contenant la châine tapée (un strstr() en C) et tu réactualise ta combobox (enfin les choix possibles).
La méthode bourrin est de la détruire puis la refaire mais c'est lourd, sinon tu dois pouvoir la modifier via une fonction de gtk--.
< Quelques un des mes programmes | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
\ ^__^
\ (o o)\_______
(___)\ )\
Hors ligne
#3 Le 06/06/2008, à 18:49
- Anium
Re : [Résolu][Gtkmm ou Gtk au pire] Complétion d'une Gtk::Entry
Merci pour ta réponse, c'est justement l'étape de ré actualisation qui bloque chez moi, as-tu des pistes pour modifier la combobox ?
Hors ligne
#4 Le 06/06/2008, à 22:05
- rniamo
Re : [Résolu][Gtkmm ou Gtk au pire] Complétion d'une Gtk::Entry
j'ai recherché vite fait et j'ai vu qu'il y a des méthodes du type (désolé, encore une fois je ne connais pas (encore) gtk--) :
combobox.append_text(text)
combobox.prepend_text(text)
combobox.insert_text(position, text)
combobox.remove_text(position)
il suffit de tout enlever puis de rajouter les bonnse valeurs, non ? (ça doit s'optimiser mais il faut déjà que ça marche).
POste un peu de code aussi (le callback au hazard) pour voir ce que tu as pour le moment.
Dernière modification par rniamo (Le 06/06/2008, à 22:07)
< Quelques un des mes programmes | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
\ ^__^
\ (o o)\_______
(___)\ )\
Hors ligne
#5 Le 07/06/2008, à 14:01
- rniamo
Re : [Résolu][Gtkmm ou Gtk au pire] Complétion d'une Gtk::Entry
Dans le .h j'ai trouvé :
To add and remove strings from the list, just modify @a model
* using its data manipulation API.
et la fonction :
set_text_column()
edit : tu peux me donner une adresse pour apprendre à utiliser les widget de gtkmm (style les frame, combobox, pixbuf ... )
Dernière modification par rniamo (Le 07/06/2008, à 14:05)
< Quelques un des mes programmes | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
\ ^__^
\ (o o)\_______
(___)\ )\
Hors ligne
#6 Le 09/06/2008, à 10:25
- Anium
Re : [Résolu][Gtkmm ou Gtk au pire] Complétion d'une Gtk::Entry
Merci de te pencher sur mon problème.
Pour le moment, j'arrive à ajouter les bon choix dans la complétion. Il me manque la suppression.
Un peu de code :
- la création de la complétion
//File
Glib::RefPtr<Gtk::EntryCompletion> completion = Gtk::EntryCompletion::create();
m_combo_entry_file.get_entry()->set_completion(completion);
//Create and fill the completion's filter model
Glib::RefPtr<Gtk::ListStore> refCompletionModel = Gtk::ListStore::create(m_columns);
completion->set_model(refCompletionModel);
completion->set_match_func( sigc::mem_fun(*this,&CallBox::on_completion_match) );
//Fill the TreeView's model
Gtk::TreeModel::Row row;
int index = 1;
// Query
m_vector_file = map.get_files();
for(std::vector<File *>::iterator iter = m_vector_file.begin(); iter != m_vector_file.end(); ++iter){
row = *(refCompletionModel->append());
row[m_columns.m_col_id] = index;
row[m_columns.m_col_string] = (*iter)->get_code() + " - " + (*iter)->get_name();
m_combo_entry_file.append_text((*iter)->get_code() + " - " + (*iter)->get_name());
index++;
}
m_CompletionActions[0] = EMPTY;
completion->set_text_column(m_columns.m_col_string);
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);
}
- le callback
bool CallBox::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_string]; // dans quelle colonne chercher
filter_string = filter_string.lowercase();
if(filter_string.find(key)!=-1){
std::cout << filter_string << std::endl;
Glib::RefPtr<Gtk::EntryCompletion> completion = m_combo_entry_file.get_entry()->get_completion();
completion->prepend_action_text(filter_string);
return true; //A match was found.
}
}
return false; //No match.
}
Ces méthodes
combobox.append_text(text)
combobox.prepend_text(text)
combobox.insert_text(position, text)
combobox.remove_text(position)
concerne l'ajout, suppression dans une combobox. Ce n'est donc pas la bonne piste. La complétion concerne l'entry dans la combobox (ComboBoxEntryText pour être plus précis)
Dans la doc, il y a ça :
When the user selects a completion, the content of the entry is updated. By default, the content of the entry is replaced by the text column of the model, but this can be overridden by connecting to the match_selected signal and updating the entry in the signal handler. Note that you should return true from the signal handler to suppress the default behaviour.
Tu peux télécharger le pdf "Getting Started with gtkmm" ici http://www.gtkmm.org/documentation.shtml
Il y a pas mal d'exemples, très bien pour commencer.
Hors ligne
#7 Le 09/06/2008, à 13:21
- Anium
Re : [Résolu][Gtkmm ou Gtk au pire] Complétion d'une Gtk::Entry
Ça y est, j'ai trouvé
En fait la mise à jour se fait automatiquement en renvoyant true (il me manquait une accolade )
Voila le callback :
bool CallBox::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_string];
filter_string = filter_string.lowercase();
if(filter_string.find(key)!=-1){
return true;
}
}
return false;
}
Hors ligne
#8 Le 09/06/2008, à 16:05
- rniamo
Re : [Résolu][Gtkmm ou Gtk au pire] Complétion d'une Gtk::Entry
merci.
< Quelques un des mes programmes | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
\ ^__^
\ (o o)\_______
(___)\ )\
Hors ligne