[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:
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:
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;
} |