Disclaimer: non sapevo nulla di quanto prima non avessi letto il tuo post o della programmazione della gui in generale. Pertanto, sinceramente, non ho intenzione di rispondere a questa domanda :)
Detto questo, rapidamente è un progetto pulito. Ho scansionato brevemente la fonte del boilerplate e identificato i seguenti potenziali approcci per l'aggiunta di una preferenza di stile elenco supportata da ListStore:
- 'Monkey-patch' ottiene e imposta widget_methods su un widget TreeView di serie (con il modello ListStore) come definito in data / ui / Preferenze $ PROJECTNAME $ Dialog.ui con glade.
- Implementa
set_widget_from_preference
e set_preference
nella sottoclasse di PreferenzeDialog del progetto (la sottoclasse è la finestra Preferenze $ PROJECTNAME $) e fai qualcosa di diverso quando key
o widget
è il tuo widget TreeView supportato da ListStore.
- Scrivi una sottoclasse personalizzata di gtk.TreeView con un widget personalizzato corrispondente per glade .
Per provarli, ho implementato tutte e tre queste idee - ognuna ha funzionato come previsto e AFAICT, in modo identico. Alla fine, il terzo (in particolare) mi è sembrato il più pulito, e più vicino alle convenzioni utilizzate in tutta la caldaia, nonostante inizialmente si aspettasse il contrario.
Ecco i passaggi che ho seguito per il numero tre ...
Usando glade via quickly design
(rapidamente 11.10, tra l'altro), e seguendo vagamente questo tutorial (parte 2) , aggiungi un widget ScrolledWindow a Preferenze $ PROJECTNAME $ Dialog.ui, rilascia un TreeView su di esso, dai un nome a TreeView language_treeview
. Crea un nuovo modello ListStore per TreeView quando richiesto e chiamalo language_liststore, ecc ... alla fine ho finito con qualcosa del genere:
Quindi, aggiungi un catalogo glade (data / ui / preferenze_ $ PROJECTNAME $ _treeview.xml) con i seguenti contenuti:
<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>
Quindi, modifica Preferenze $ PROJECTNAME $ Dialog.ui, aggiungendo ...
<!-- interface-requires preferences_$PROJECTNAME$_treeview 1.0 -->
... verso l'alto, sotto il tag richiede. E modifica l'attributo class di language_treeview in Preferenze $ PROJECTNAME $ TreeView, in preparazione per un passaggio successivo.
Infine, aggiungi il seguente elemento all'elenco widget_methods in Preferenze $ PROJECTNAME $ Dialog.py
'language_treeview': ['get_languages', 'set_languages', 'button-release-event']
E alla fine dello stesso file (Preferenze $ PROJECTNAME $ Dialog.py), aggiungi
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
Se sei interessato a vedere i miei tentativi per uno e due, sono felice di accontentarti.
Modifica: per il lettore occasionale, sostituisci qualsiasi occorrenza di $ PROJECTNAME $ con il nome effettivo del tuo progetto rapido (come specificato in quickly create
).
HTH!