Les TreeSelection sont des objets qui gèrent les sélections dans un
TreeView. Quand on crée un TreeView, un
TreeSelection est automatiquement créé en même temps. Le
TreeSelection peut être obtenu à partir du TreeView
par la méthode :
treeselection = treeview.get_selection()
On peut retrouver le TreeView associé au
TreeSelection par la méthode :
treeview = treeselection.get_treeview()
Le TreeSelection dispose des modes
de sélection suivants :
gtk.SELECTION_NONE |
Aucune sélection n'est permise. |
gtk.SELECTION_SINGLE |
Permet une sélection unique par un clic. |
gtk.SELECTION_BROWSE |
Permet une sélection unique par un survol du pointeur. |
gtk.SELECTION_MULTIPLE |
Plusieurs items peuvent être sélectionnés ensemble. |
On peut récupérer le mode de sélection en cours par la méthode :
mode = treeselection.get_mode()
Ce mode peut être fixé en utilisant :
treeselection.set_mode(mode)
... où mode est l'un des modes de sélection
ci-dessus.
La méthode à utiliser pour retrouver la sélection est fonction du mode
de sélection en cours. Si le mode de sélection est
gtk.SELECTION_SINGLE ou
gtk.SELECTION_BROWSE, il faut utiliser la méthode
suivante :
(modele, iter) = treeselection.get_selected()
... qui renvoie un 2-tuple contenant modele, le
TreeModel utilisé par le TreeView
associé au treeselection et iter,
un TreeIter pointant sur la ligne sélectionnée. S'il n'y
a pas de ligne sélectionnée, alors iter vaut
None. Si le mode de sélection est
gtk.SELECTION_MULTIPLE, une exception TypeError est
déclenchée.
Pour un TreeView utilisant le mode de sélection
gtk.SELECTION_MULTIPLE, il faut utiliser la méthode :
(modele, listechemins) = treeselection.get_selected_rows()
... qui renvoie un 2-tuple contenant le modèle et une liste des chemins des lignes sélectionnées dans l'arborescence. Cette méthode n'est pas disponible en PyGTK 2.0 ; pour retrouver cette liste, il faut passer par une fonction intermédiaire en utilisant :
treeselection.selected_foreach(fonct,donnees=None)
... où fonct est une fonction appelée
pour chaque ligne sélectionnée avec les données
donnees. La fonction a la signature suivante :
def fonct(modele,chemin,iter,donnees)
... où modele est le TreeModel,
chemin est le chemin de la ligne
sélectionnée dans l'arborescence et iter est un
TreeIter pointant sur la ligne sélectionnée.
Cette méthode peut être utilisée pour simuler la méthode
get_selected_row() de la manière suivante :
...
def rappel_chacune(modele, chemin, iter, listechemins) :
liste.append(chemin)
...
def ma_recup_selection(treeselection) :
listechemins = []
treeselection.selected_foreach(rappel_chacune, listechemins)
modele = choix.get_treeview().get_model()
return(modele, listechemins)
...
La méthode selected_foreach() ne peut servir à
modifier le treemodel ou la sélection, mais peut permettre de modifier les
données des lignes.
Si on souhaite avoir un contrôle total sur la sélection de ligne, on peut définir une fonction à appeler avant qu'une ligne soit sélectionnée ou déselectionnée grâce à la méthode :
treeselection.set_select_function(fonct,donnees)
... où fonct est une fonction de rappel et
donnees sont les données utilisateur qui sont
transmises à fonct quand celle-ci est appelée.
La méthode fonct a pour signature :
def fonct(selection,modele,chemin,est_choisi,donnees_utilisateur)
... où selection est le TreeSelection,
modele est le TreeModel utilisé avec
le TreeView associé à la selection,
chemin est le chemin dans l'arbre de la ligne sélectionnée,
est_choisi vaut TRUE si la ligne est
actuellement sélectionnée et donnees_utilisateur est donnees.
fonct renvoie TRUE si l'état de
sélection de la ligne peut être modifié.
Établir une fonction de sélection est utile si :
MessageDialog contextuel.
Il est possible de modifier la sélection par programme en employant les méthodes suivantes :
treeselection.select_path(path) treeselection.unselect_path(path) treeselection.select_iter(iter) treeselection.unselect_iter(iter)
Ces méthodes sélectionnent ou déselectionnent une ligne unique indiquée, soit
par le path, un chemin de l'arbre, soit par
iter, un TreeIter pointant
sur la ligne. Les méthodes qui suivent sélectionnent ou déselectionnent
plusieurs lignes à la fois :
treeselection.select_all() treeselection.unselect_all() treeselection.select_range(start_path,end_path) treeselection.unselect_range(start_path,end_path)
Les méthodes select_all() et
select_range() nécessitent que le mode de
sélection soit gtk.SELECTION_MULTIPLE. Les méthodes
unselect_all() et
unselect_range() fonctionnent quel que soit
le mode de sélection. A noter que la méthode
unselect_all() n'est pas disponible en PyGTK 2.0.
On peut vérifier si une ligne est sélectionnée en utilisant l'une de ces méthodes :
resultat = treeselection.path_is_selected(chemin) resultat = treeselection.iter_is_selected(iter)
qui renvoie TRUE si la ligne indiquée par
chemin ou iter est
actuellement sélectionnée. On peut connaître le nombre de lignes
sélectionnées avec la méthode :
compte = treeselection.count_selected_rows()
Cette méthode n'est pas disponible en PyGTK 2.0 ; il faut donc la simuler
en utilisant la méthode selected_foreach()
semblable à l'émulation de la méthode get_selected_rows()
dans
Section 21.2, « Retrieving the Selection » (pas encore traduit). Par exemple :
...
def rappel_chacune(modele, chemin, iter, compteur) :
compteur[0] += 1
...
def mon_compte_lignes_choisies(treeselection) :
compteur = [0]
treeselection.selected_foreach(rappel_chacune, compteur)
return compteur[0]
...