Відмова: Я швидко нічого не знав, поки не прочитав ваш пост, або про програмування gui взагалі з цього приводу. Тому я, чесно кажучи, не маю жодної справи, яка намагається відповісти на це питання :)
Це, швидше, є акуратним проектом. Я коротко просканував джерело котлової панелі та визначив наступні можливі підходи для додавання параметрів списку, підтримуваних списком ListStore:
- 'Monkey-patch' отримайте та встановіть віджет-методи на запас віджета TreeView (w / ListStore модель), як визначено в data / ui / Preferences $ PROJECTNAME $ Dialog.ui з glade.
- Реалізуйте
set_widget_from_preference
і set_preference
в підкласі проекту PreferencesDialog (підклас - Налаштування $ PROJECTNAME $ Діалог), і зробіть щось інше, коли key
або widget
підтримує ваш відрізок TreeView підтримку ListStore.
- Напишіть спеціальний підклас gtk.TreeView з відповідним користувальницьким віджетом для glade .
Щоб перевірити їх, я реалізував усі три ці ідеї - кожна працювала так, як було призначено, а AFAICT - однаково. Врешті-решт, третя (зокрема) видалася мені найчистішою та ближчою до умовностей, які використовувались у всій котельній плиті, незважаючи на те, що спочатку очікували протилежного.
Ось кроки, які я дотримувався для номера три ...
Використовуючи glade через quickly design
(швидко 11.10, btw) і неміцно слідуючи цьому підручнику (частина 2) , додайте віджет ScrollWindow до налаштувань $ PROJECTNAME $ Dialog.ui, додайте на нього TreeView, назвіть TreeView language_treeview
. Створіть нову модель ListStore для TreeView, коли буде запропоновано, та назвіть його language_liststore тощо. Зрештою, у мене вийшло щось подібне:
Далі додайте каталог поля (data / ui / preferences_ $ PROJECTNAME $ _treeview.xml) із наступним вмістом:
<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>
Потім відредагуйте Параметри $ PROJECTNAME $ Dialog.ui, додавши ...
<!-- interface-requires preferences_$PROJECTNAME$_treeview 1.0 -->
... до початку, під тегом вимагає. І змініть атрибут класу language_treeview на Preferences $ PROJECTNAME $ TreeView, готуючись до наступного кроку.
Нарешті, додайте наступний елемент до списку widget_methods у налаштуваннях $ PROJECTNAME $ Dialog.py
'language_treeview': ['get_languages', 'set_languages', 'button-release-event']
І в кінці того самого файлу (Налаштування $ PROJECTNAME $ Dialog.py) додайте
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
Якщо вам цікаво бачити мої спроби для одного і двох, я із задоволенням зобов'язуюся.
Редагувати: Для випадкового читача будь-яке виникнення $ PROJECTNAME $ замініть фактичним іменем вашого швидкого проекту (як зазначено в quickly create
).
HTH!