Несколько курсоров с одним gtkTextBuffer в разных gtkTextView
Я пытаюсь отредактировать один и тот же текст (который я сохранил в GtkTextBuffer, но альтернативы приветствуются) с несколькими курсорами, каждый в отдельном GtkTextView. Мне нужны все курсоры, чтобы иметь возможность редактировать текст (и отражаться в других представлениях). Перемещение одного курсора (например, с помощью клавиатуры) не должно перемещать другие курсоры.
Для тех, кто знаком, я пытаюсь подражать поведению разделенного окна emacs.
Какой самый простой способ сделать это?
Фон
Обзор текстового виджета гласит, что
Каждый буфер может отображаться любым количеством просмотров.
за исключением того, что курсор хранится в GtkTextBuffer, а не в GtkTextView. В частности, перемещение курсора в одном виде изменит положение курсора во всех других представлениях.
Больше технических деталей
Я на самом деле использую pygtk и gtksourceview2 в моем конкретном примере. В частности, GtkTextView представляет собой GtkSourceView (gtksourceview2.View в python). Но мой вопрос не является специфическим для pygtk.
1 ответ
Вы не можете сделать это с GtkSourceView из коробки - вам, к сожалению, придется написать это самостоятельно.
Чтобы написать это, я бы создал подкласс GtkSourceBuffer. Сделайте так, чтобы он "обернул" оригинальный GtkSourceBuffer, но сохранил свою собственную отдельную позицию курсора. Затем создайте два из этих "оберточных" исходных буферов и поместите их в исходные представления.
Хотя это не сработает, если вы хотите, чтобы все курсоры отображались во всех исходных представлениях. Возможно, вы могли бы создать подкласс GtkSourceBuffer и просто сохранить его положение курсора для каждого вида, к которому он добавлен.
Что бы вы сделали, если бы вы выбрали разные кусочки текста в каждом представлении? Я бы тщательно обдумал это, прежде чем начать кодировать.
Быстрый и грязный способ - подключиться к сигналам "фокус-в-событии" и "фокус-в-событии" исходных видов. Потеряв фокус, сделайте запись представления своей текущей позиции курсора. Затем, получив фокус, восстановите положение курсора. Таким образом, почти каждый вид имеет свою позицию курсора.