Descargo de responsabilidad: no supe nada rápidamente hasta que leí tu publicación, o sobre la programación gui en general para el caso. Por lo tanto, sinceramente, no tengo nada que tratar de responder esta pregunta :)
Dicho esto, rápidamente es un proyecto ordenado. Escaneé brevemente la fuente repetitiva e identifiqué los siguientes enfoques potenciales para agregar una preferencia de estilo de lista respaldada por ListStore:
- 'Monkey-patch' obtiene y establece widget_methods en un widget TreeView estándar (con el modelo ListStore) como se define en data / ui / Preferences $ PROJECTNAME $ Dialog.ui with glade.
- Implemente
set_widget_from_preference
y set_preference
en la subclase de PreferencesDialog del proyecto (la subclase es Preferences $ PROJECTNAME $ Dialog), y haga algo diferente cuando key
o widget
sea su widget TreeView respaldado por ListStore.
- Escriba una subclase personalizada de gtk.TreeView con un widget personalizado correspondiente para glade .
Para probarlos, implementé las tres ideas: cada una funcionó según lo previsto y AFAICT, de forma idéntica. Al final, el tercero (en particular) me pareció el más limpio y más cercano a las convenciones utilizadas en toda la repetitiva, a pesar de que inicialmente esperaba lo contrario.
Aquí están los pasos que seguí para el número tres ...
Usando glade via quickly design
(rápidamente 11.10, por cierto), y siguiendo libremente este tutorial (parte 2) , agregue un widget ScrolledWindow a las Preferencias $ PROJECTNAME $ Dialog.ui, suelte un TreeView sobre él, nombre TreeView language_treeview
. Cree un nuevo modelo ListStore para TreeView cuando se le solicite, y asígnele el nombre language_liststore, etc. Finalmente terminé con algo como esto:
A continuación, agregue un catálogo glade (data / ui / preferencias_ $ PROJECTNAME $ _treeview.xml) con el siguiente contenido:
<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>
Luego, edite Preferencias $ PROJECTNAME $ Dialog.ui, agregando ...
<!-- interface-requires preferences_$PROJECTNAME$_treeview 1.0 -->
... hacia arriba, debajo de la etiqueta require. Y cambie el atributo de clase de language_treeview a Preferencias $ PROJECTNAME $ TreeView, en preparación para un paso posterior.
Finalmente, agregue el siguiente elemento a la lista widget_methods en Preferencias $ PROJECTNAME $ Dialog.py
'language_treeview': ['get_languages', 'set_languages', 'button-release-event']
Y al final del mismo archivo (Preferencias $ PROJECTNAME $ Dialog.py), agregue
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 está interesado en ver mis intentos de uno y dos, estoy feliz de hacerlo.
Editar: para el lector casual, reemplace cualquier aparición de $ PROJECTNAME $ con el nombre real de su proyecto rápido (como se especifica en quickly create
).
HTH!