Программно выделите текст в Gtk :: TextView, используя Gtkmm - PullRequest
1 голос
/ 06 февраля 2020

Как выбрать текст в Gtk::TextView:

  • , начиная с позиции курсора
  • n количество символов в обратном направлении

Документация от developer.gnome.org, похоже, не помогает.

1 Ответ

1 голос
/ 06 февраля 2020

Выбор выполняется не в самом Gtk::TextView, а в соответствующем Gtk::TextBuffer. Хотя я не уверен, почему именно этот выбор дизайна был сделан, я, по крайней мере, ясно понимаю последствия: выборки могут совместно использоваться несколькими Gtk::TextView s, когда они совместно используют один и тот же буфер. Это может быть желательно или нет, но именно так «они» сделали это.

Буфер Gtk::TextView можно получить с помощью

Glib :: RefPtr < TextBuffer> get_buffer ()

Возвращает Gtk :: TextBuffer, отображаемый этим текстовым представлением.

Счетчик ссылок в буфере не увеличивается; вызывающий эту функцию не будет владельцем новой ссылки.

Затем Gtk::TextBuffer обеспечивает

void Gtk :: TextBuffer :: select_range ( const iterator & ins, const iterator & bound)

Эта функция перемещает метки «insert» и «selection_bound» одновременно.

Если переместить их в два этапа с помощью move_mark() вы временно выберете регион между их старым и новым местоположением, что может быть довольно неэффективным, поскольку временно выбранный регион заставит вещи пересчитываться. Эта функция перемещает их как единое целое, которое можно оптимизировать.

ins Где поставить метку «вставки».

bound Где поставить метку «selection_bound».

Текущую позицию курсора можно получить с помощью

Glib :: RefPtr Gtk :: TextBuffer :: get_insert ()

Возвращает метку, которая представляет курсор (точку вставки).

Эквивалентно вызову get_mark (), чтобы получить метку с именем «insert», но она немного более эффективна и требует меньше ввода.

Возвращенное Gtk::TextMark можно «преобразовать» в Gtk::TextIter с помощью

TextIter Gtk :: TextMark :: get_iter () .

Кроме того, Gtk::TextBuffer предоставляет множество функций get_iter_at для получения Gtk::TextBuffer::iterator s для различных параметров.


Примечание в Общее:

Изучение справочного руководства по мощному API виджетов - это то, что я считаю утомительным.

В Кроме gtkmm, есть серьезная альтернатива:

Программирование с помощью gtkmm 3

(также доступно на других языках).

Глава 11 о TextView и может помочь получить «большую картину».

...