Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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é smile
En fait la mise à jour se fait automatiquement en renvoyant true (il me manquait une accolade hmm)

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