Haftungsausschluss: Ich wusste nichts schnelles, bis ich Ihren Beitrag gelesen habe, oder über GUI-Programmierung im Allgemeinen. Daher habe ich ehrlich gesagt nichts damit zu tun, diese Frage zu beantworten :)
Das heißt, schnell ist ein ordentliches Projekt. Ich habe die Boilerplate-Quelle kurz gescannt und die folgenden möglichen Ansätze zum Hinzufügen einer ListStore-gestützten Listenstilpräferenz identifiziert:
- 'Monkey-Patch' ruft Widget_Methods ab und setzt sie auf ein TreeView-Widget (mit ListStore-Modell), wie in data / ui / Preferences $ PROJECTNAME $ Dialog.ui with glade definiert.
- Implementieren Sie
set_widget_from_preference
und set_preference
in der Unterklasse von PreferencesDialog des Projekts (die Unterklasse ist Preferences $ PROJECTNAME $ Dialog) und führen Sie etwas anderes aus, wenn key
oder wenn widget
Ihr von ListStore unterstütztes TreeView-Widget verwendet wird.
- Schreiben Sie eine benutzerdefinierte Unterklasse von gtk.TreeView mit einem passenden benutzerdefinierten Widget für glade .
Um sie zu testen, habe ich alle drei dieser Ideen umgesetzt - jede funktionierte wie beabsichtigt und AFAICT identisch. Am Ende schien mir der dritte (insbesondere) der sauberste zu sein und näher an den Konventionen zu sein, die auf der gesamten Kesselplatte angewendet wurden, obwohl zunächst das Gegenteil erwartet wurde.
Hier sind die Schritte, die ich für Nummer drei befolgt habe ...
quickly design
Fügen Sie mit Glade via (schnell 11.10, übrigens) und nach diesem Tutorial (Teil 2) ein ScrolledWindow-Widget zu den Einstellungen $ PROJECTNAME $ Dialog.ui hinzu, legen Sie eine TreeView darauf ab und benennen Sie die TreeView language_treeview
. Erstellen Sie ein neues ListStore-Modell für die TreeView, wenn Sie dazu aufgefordert werden, und nennen Sie es language_liststore usw. Am Ende hatte ich Folgendes:
Fügen Sie als Nächstes einen Glade-Katalog (data / ui / settings_ $ PROJECTNAME $ _treeview.xml) mit den folgenden Inhalten hinzu:
<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>
Bearbeiten Sie dann die Einstellungen $ PROJECTNAME $ Dialog.ui und fügen Sie ...
<!-- interface-requires preferences_$PROJECTNAME$_treeview 1.0 -->
... nach oben unter dem Tag "require". Ändern Sie das Klassenattribut language_treeview in Preferences $ PROJECTNAME $ TreeView, um sich auf einen späteren Schritt vorzubereiten.
Fügen Sie abschließend das folgende Element zur Liste widget_methods in den Einstellungen $ PROJECTNAME $ Dialog.py hinzu
'language_treeview': ['get_languages', 'set_languages', 'button-release-event']
Und fügen Sie am Ende derselben Datei (Einstellungen $ PROJECTNAME $ Dialog.py) hinzu
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
Wenn Sie daran interessiert sind, meine Versuche für eins und zwei zu sehen, bin ich gerne bereit, dies zu tun.
Bearbeiten: Ersetzen Sie für den Gelegenheitsleser jedes Vorkommen von $ PROJECTNAME $ durch den tatsächlichen Namen Ihres schnellen Projekts (wie in angegeben quickly create
).
HTH!