13.7. Пример TextView

Пример testtext.py (производный от testtext.c включённой в дистрибутив GTK+ 2.0.x) показывает использование виджета TextView и связанных с ним объектов TextBuffer, TextIter, TextMark, TextTag, TextTagTable.

Рисунок 13.2, “Пример TextView” показывает окно программы:

Риснок 13.2. Пример TextView

TextView Example

Программа testtext.py определяет несколько классов в дополнение к классу TestText:

Отображение цветов реализуется с помощью TextTag, применяемых на отрывки текста. Строки 109-115 (в методе __init__()) создают эти TextTag и строки 763-784 (метод do_apply_colors()) применяют цветовые TextTag.

Строки 202-239 предоставляют методы (color_cycle_timeout(), set_colors() и cycle_colors()), которые включают цветовой цикл. Цветовой цикл включается настройкой (строка 220) свойства foreground_gdk для отдельных color_tags (которые также изменяют свойство foreground_set). Цветовой цикл отключается настройкой свойства foreground_set в FALSE (строка 222). Цвета периодически меняются с помощью перемещения start_hue (строка 237).

Новый Buffer заполняется содержимым примера тогда, когда выбирается пункт меню Test->Example (метод fill_example_buffer() в строках 302-372). Пример содержит текст различных цветов, стилей, языков и изображений. Метод init_tags() (строки 260-300) настраивают модификации TextTag, для использования их с текстом примера. Событийный сигнал этих TextTag прикреплён к методу tag_event_handler() (строки 241-156) для пояснения кнопки и события захвата движения.

В TextView выбран режим переноса WRAP_WORD (строка 580). Окна, граничащие с TextView показаны выбором их размеров в строках 587-588 и 596-597. Левое и правое окно используется для отображения номеров строк, а верхнее и нижнее окно отображают пользовательские вкладки тогда, когда они установлены. Эти окна обновляются по сигналу "expose-event" (строки 590 и 599). Метод line_numbers_expose() (строки 1079-1116) определяет левое или правое окно получает событие "expose" и рассчитывает размер области.

В начале каждой линии высчитывается её номер с помощью метода get_lines() (строки 1057-1077). Номера строк отображаются в граничащем окне (преобразуются в строке 1109)

Пользовательские вкладки, отображаемые в верхнем и нижнем окне похожи (строки 1013-1055). Они отображаются только когда курсор перемещается в область текста, для которого выбран атрибут custom tab. Это определяется обработкой сигнала "mark-set" в методе cursor_set_handler() (строки 999-1011) и отключает верхнее и нежнее окно тогда, когда выбрана метка insert.

Передвигаемые виджеты добавляются на View методом do_add_children() (строки 892-899), который вызывает последующий метод add_movable_children() (строки 874-890). Это gtk.Label, которые можно перетащить внутрь различных окон, являющихся частью виджета TextView.

Похожим образом, виджеты добавляются на окна TextView с использованием метода do_add_focus_children() (строки 901-949).