Avis de non-responsabilité: je ne savais rien sur rapidement jusqu'à ce que j'ai lu votre message, ou sur la programmation gui en général d'ailleurs. Par conséquent, je n'ai honnêtement aucune entreprise tentant de répondre à cette question :)
Cela dit, rapidement est un projet soigné. J'ai analysé brièvement la source passe-partout et identifié les approches potentielles suivantes pour ajouter une préférence de style liste soutenue par ListStore:
- 'Monkey-patch' récupère et définit widget_methods sur un widget TreeView stock (avec le modèle ListStore) comme défini dans data / ui / Preferences $ PROJECTNAME $ Dialog.ui avec glade.
- Implémentez
set_widget_from_preference
et set_preference
dans la sous-classe du projet de PreferencesDialog (la sous-classe est Preferences $ PROJECTNAME $ Dialog), et faites quelque chose de différent lorsque key
ou widget
est votre widget TreeView soutenu par ListStore.
- Écrivez une sous-classe personnalisée de gtk.TreeView avec un widget personnalisé correspondant pour clairière .
Pour les tester, j'ai mis en œuvre ces trois idées - chacune fonctionnait comme prévu, et AFAICT, à l'identique. Au final, le troisième (en particulier) m'a paru le plus propre, et le plus proche des conventions utilisées tout au long du passe-partout, malgré l'attente initiale du contraire.
Voici les étapes que j'ai suivies pour le numéro trois ...
En utilisant glade via quickly design
(rapidement 11.10, btw) et en suivant ce tutoriel (partie 2) , ajoutez un widget ScrolledWindow aux Préférences $ PROJECTNAME $ Dialog.ui, déposez un TreeView dessus, nommez le TreeView language_treeview
. Créez un nouveau modèle ListStore pour TreeView lorsque vous y êtes invité, et nommez-le language_liststore, etc ... finalement, je me suis retrouvé avec quelque chose comme ceci:
Ensuite, ajoutez un catalogue de clairières (data / ui / preferences_ $ PROJECTNAME $ _treeview.xml) avec le contenu suivant:
<glade-catalog name="preferences_$PROJECTNAME$_treeview" domain="glade-3"
depends="gtk+" version="1.0">
<glade-widget-classes>
<glade-widget-class title="$PROJECTNAME$ Preferences TreeView" name="Preferences$PROJECTNAME$TreeView"
generic-name="Preference$PROJECTNAME$TreeView" parent="GtkTreeView"
icon-name="widget-gtk-treeview"/>
</glade-widget-classes>
</glade-catalog>
Ensuite, modifiez les préférences $ PROJECTNAME $ Dialog.ui, en ajoutant ...
<!-- interface-requires preferences_$PROJECTNAME$_treeview 1.0 -->
... en haut, sous la balise require. Et changez l'attribut de classe de language_treeview en Preferences $ PROJECTNAME $ TreeView, en préparation pour une étape ultérieure.
Enfin, ajoutez l'élément suivant à la liste widget_methods dans Préférences $ PROJECTNAME $ Dialog.py
'language_treeview': ['get_languages', 'set_languages', 'button-release-event']
Et à la fin du même fichier (Préférences $ PROJECTNAME $ Dialog.py), ajoutez
import gtk
ALL_LANGUAGES = [
'en', 'uk', 'de', 'fr', # ... much longer list
]
class Preferences$PROJECTNAME$TreeView(gtk.TreeView):
__gtype_name__ = "Preferences$PROJECTNAME$TreeView"
def __init__(self, *args):
super(Preferences$PROJECTNAME$TreeView, self).__init__(*args)
self.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
# loads the liststore with all languages,
# selecting/highlighting in the treeview those
# already retrieved from previously saved preferences
def set_languages(self, preferred_languages):
model = self.get_model()
for row, lang in enumerate(ALL_LANGUAGES):
model.append([lang])
if lang in preferred_languages:
self.get_selection().select_iter(model.get_iter(row))
# collects only the selected languages in the treeview
# to save in the preferences database
def get_languages(self):
model, rows = self.get_selection().get_selected_rows()
result = [model.get_value(model.get_iter(row), 0) for row in rows]
return result
Si vous êtes intéressé à voir mes tentatives pour un et deux, je suis heureux d'obliger.
Modifier: pour le lecteur occasionnel, remplacez toute occurrence de $ PROJECTNAME $ par le nom réel de votre projet rapidement (comme spécifié dans quickly create
).
HTH!