Отказ от ответственности: я ничего не знал о быстрой, пока я не прочитал ваш пост, или о графическом программировании в целом в этом отношении. Поэтому я, честно говоря, не имею никакого дела, пытаясь ответить на этот вопрос :)
Тем не менее, быстро это аккуратный проект. Я кратко просканировал исходный шаблон и определил следующие потенциальные подходы для добавления предпочтений в стиле списка в виде списка:
- 'Monkey-patch' получает и устанавливает виджет_методы на стандартный виджет TreeView (с моделью ListStore), как это определено в data / ui / Preferences $ PROJECTNAME $ Dialog.ui с полянкой.
- Реализовать
set_widget_from_preference
и set_preference
в подклассе проекта из PreferencesDialog (подкласс является Preferences $ Projectname $ Dialog), и сделать что - то другое , когда key
или widget
ваша ListStore поддерживается TreeView виджет.
- Напишите пользовательский подкласс gtk.TreeView с соответствующим пользовательским виджетом для поляны .
Чтобы проверить их, я реализовал все три эти идеи - каждая работала так, как задумывалось, и AFAICT - одинаково. В конце концов, третий (в частности) показался мне наиболее чистым и ближе к обычаям, используемым во всем шаблоне, несмотря на то, что изначально ожидал обратного.
Вот шаги, которые я следовал за номером три ...
Используя glade через quickly design
(быстро 11.10, кстати) и неукоснительно следуя этому руководству (часть 2) , добавьте виджет ScrolledWindow в Preferences $ PROJECTNAME $ Dialog.ui, поместите в него TreeView, назовите TreeView language_treeview
. При появлении запроса создайте новую модель ListStore для TreeView и назовите ее language_liststore и т. Д. ... в конце концов я получил нечто подобное:
Затем добавьте каталог glade (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 -->
... наверх, под тегом require. И измените атрибут класса 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
).
НТН!