Spec-Zone.ru › GTK 3.24

Обзор виджета текста

Обзор виджета текста — Обзор GtkTextBuffer, GtkTextView и сопутствующих элементов

Концептуальный обзор

GTK+ имеет чрезвычайно мощную структуру для редактирования многострочного текста. Основные объекты, участвующие в этом процессе, — это GtkTextBuffer, представляющий редактируемый текст, и GtkTextView, виджет, который может отображать GtkTextBuffer. Каждый буфер может быть отображён любым количеством представлений.

Важно помнить, что текст в GTK+ закодирован в UTF-8. Это означает, что один символ может быть закодирован несколькими байтами. Количество символов обычно называется смещениями, а количество байтов — индексами. Если вы перепутаете эти два понятия, всё будет работать нормально с ASCII, но как только ваш буфер будет содержать многобайтные символы, возникнут проблемы.

Текст в буфере может быть помечен метками. Метка — это атрибут, который может быть применён к определённому диапазону текста. Например, метка может называться «жирный» и сделать текст внутри метки жирным. Однако понятие метки более общее; метки не обязательно должны влиять на отображение. Они могут вместо этого влиять на поведение нажатий мыши и клавиш, «блокировать» диапазон текста, чтобы пользователь не мог его редактировать, или на множество других вещей. Метка представлена объектом GtkTextTag. Одна метка GtkTextTag может быть применена к любому количеству диапазонов текста в любом количестве буферов.

Каждая метка хранится в GtkTextTagTable. Таблица меток определяет набор меток, которые могут использоваться вместе. Каждый буфер имеет одну связанную с ним таблицу меток; только метки из этой таблицы могут использоваться с буфером. Однако одна таблица меток может быть общей для нескольких буферов.

Метки могут иметь имена, что иногда удобно (например, вы можете назвать вашу жирную метку «жирный»), но они также могут быть безымянными (что удобно, если вы создаёте метки на лету).

Большинство манипуляций с текстом выполняется с помощью итераторов, представленных объектом GtkTextIter. Итератор представляет собой позицию между двумя символами в буфере текста. GtkTextIter — это структура, предназначенная для выделения в стеке; она гарантированно копируется по значению и никогда не содержит данных, выделенных в куче. Итераторы не являются действительными неопределённо; всякий раз, когда буфер изменяется таким образом, что влияет на количество символов в буфере, все имеющиеся итераторы становятся недействительными. (Обратите внимание, что удаление 5 символов и последующая повторная вставка 5 всё равно делает итераторы недействительными, хотя вы получаете то же количество символов, проходя через состояние с другим количеством).

По этой причине итераторы не могут использоваться для сохранения позиций при изменениях буфера. Для сохранения позиции идеально подходит объект GtkTextMark. Вы можете представить себе метку как невидимый курсор или точку вставки; она плавает в буфере, сохраняя позицию. Если текст, окружающий метку, удаляется, метка остаётся в позиции, которую занимал текст; если текст вставляется в метку, метка оказывается либо слева, либо справа от нового текста, в зависимости от её тяжести. Стандартный курсор текста в языках слева направо — это метка с правой тяжестью, поскольку она остаётся справа от вставляемого текста.

Как и метки, метки могут быть именованными или безымянными. В GtkTextBuffer есть две встроенные метки; они называются "insert" и "selection_bound" и соответствуют точке вставки и границе выделения, которая не является точкой вставки, соответственно. Если текст не выделен, эти две метки будут находиться в одной позиции. Вы можете манипулировать выделением и расположением курсора, перемещая эти метки.

[2]

Буферы текста всегда содержат как минимум одну строку, но могут быть пустыми (то есть буферы могут содержать ноль символов). Последняя строка в буфере текста никогда не заканчивается разделителем строк (например, новой строкой); другие строки в буфере всегда заканчиваются разделителем строк. Разделители строк учитываются при подсчёте количества символов и смещений символов. Обратите внимание, что некоторые разделители строк Unicode представлены несколькими байтами в UTF-8, а последовательность из двух символов «\r\n» также считается разделителем строк.

Простой пример

Самое простое использование GtkTextView может выглядеть так:

Во многих случаях также удобно сначала создать буфер с помощью gtk_text_buffer_new(), а затем создать виджет для этого буфера с помощью gtk_text_view_new_with_buffer(). Или вы можете изменить буфер, отображаемый виджетом, после создания виджета с помощью gtk_text_view_set_buffer().

Пример изменения атрибутов текста

Способ изменения атрибутов текста в GtkTextView заключается в применении меток, которые изменяют атрибуты для области текста. Для текстовых функций, которые берутся из темы (например, шрифт и цвет переднего плана), используйте CSS для переопределения их значений по умолчанию.

GtkWidget *view;
GtkTextBuffer *buffer;

view = gtk_text_view_new ();

buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));

gtk_text_buffer_set_text (buffer, "Hello, this is some text", -1);

/* Now you might put the view in a container and display it on the
 * screen; when the user edits the text, signals on the buffer
 * will be emitted, such as "changed", "insert_text", and so on.
 */

Приложение gtk-demo, поставляемое с GTK+, содержит больше примеров кода для GtkTextView.

[2] Если вы хотите поместить курсор в ответ на действие пользователя, обязательно используйте gtk_text_buffer_place_cursor(), который перемещает оба одновременно без создания временного выделения (перемещение одного, а затем другого временно выделяет диапазон между старыми и новыми позициями).

© 2005–2020 The GNOME Project
Licensed under the GNU Lesser General Public License version 2.1 or later.
https://developer.gnome.org/gtk3/3.24/TextWidget.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API