Avertissement: je ne savais rien de rapidement avant de lire votre message, ni de la programmation gui en général. Par conséquent, honnêtement, je ne cherche pas à répondre à cette question:)
Cela dit, Rapidement est un projet intéressant. J'ai brièvement analysé le code source et identifié les approches potentielles suivantes pour ajouter une préférence de style liste avec ListStore:
- 'Monkey-patch' récupère et définit widget_methods sur une arborescence stock
widget (modèle ListStore) défini dans le répertoire data / ui / Preferences $ PROJECTNAME $ Dialog.ui avec Glade.
- Implémentez
set_widget_from_preference
et set_preference
dans le
la sous-classe de 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 sauvegardé par ListStore.
- Rédigez une sous-classe personnalisée de gtk.TreeView avec un widget personnalisé pour glade . .
Pour les tester, j'ai mis en œuvre ces trois idées - chacune fonctionnant comme prévu et AFAICT, à l'identique. En fin de compte, le troisième (en particulier) me paraissait le plus propre et le plus proche des conventions utilisées dans l’ensemble du chaud, bien qu’il attendait initialement le contraire.
Voici les étapes que j'ai suivies pour le numéro trois ...
Utilisation de Glade via quickly design
(rapidement 11.10, btw), et en suivant vaguement ce tutoriel (partie 2) , ajoutez un widget ScrolledWindow aux préférences $ PROJECTNAME $ Dialog.ui, déposez-lui un TreeView, nommez-le TreeView language_treeview
. Créez un nouveau modèle ListStore pour le TreeView lorsque vous y êtes invité, et nommez-le language_liststore, etc. ... vous avez fini par obtenir quelque chose comme ceci:

Ensuite,ajoutezuncataloguedesous-produits(data/ui/preferences_$PROJECTNAME$_treeview.xml)aveclecontenusuivant:
<glade-catalogname="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>
Modifiez ensuite les préférences $ PROJECTNAME $ Dialog.ui, en ajoutant ...
<!-- interface-requires preferences_$PROJECTNAME$_treeview 1.0 -->
... en haut, sous la balise require. Et modifiez l'attribut de classe de language_treeview sur Preferences $ PROJECTNAME $ TreeView, en vue d'une étape ultérieure.
Enfin, ajoutez l'élément suivant à la liste widget_methods dans les 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 souhaitez voir mes tentatives pour un et deux, je suis heureux de vous rendre service.
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!