Несколько курсоров с одинаковым gtkTextBuffer в разных gtkTextView - PullRequest
3 голосов
/ 10 августа 2011

Я пытаюсь редактировать тот же текст (который я сохранил в GtkTextBuffer, но альтернативы приветствуются) с несколькими курсорами, каждый в отдельном GtkTextView. Мне нужны все курсоры, чтобы иметь возможность редактировать текст (и отражаться в других представлениях). Перемещение одного курсора (например, с помощью клавиатуры) не должно перемещать другие курсоры.

Для тех, кто знаком, я пытаюсь эмулировать поведение разделенного окна emacs.

Какой самый простой способ сделать это?

Фон

В текстовом обзоре указано, что

Каждый буфер может отображаться любым количеством просмотров.

за исключением того, что курсор хранится в GtkTextBuffer, а не в GtkTextView. В частности, перемещение курсора в одном виде изменит положение курсора во всех других видах.

Больше технических деталей

Я на самом деле использую pygtk и gtksourceview2 в моем конкретном примере. В частности, GtkTextView - это GtkSourceView (gtksourceview2.View в python). Но мой вопрос не относится к Pygtk.

1 Ответ

1 голос
/ 10 августа 2011

Вы не можете сделать это с GtkSourceView "из коробки" - вам, к сожалению, придется написать это самостоятельно.

Я бы хотел написать это подклассом GtkSourceBuffer.Сделайте так, чтобы он «обернул» оригинальный GtkSourceBuffer, но сохранил свою собственную отдельную позицию курсора.Затем создайте два из этих «обертывающих» исходных буферов и поместите их в исходные представления.

Хотя это не сработало бы, если вы хотите, чтобы все курсоры отображались во всех исходных представлениях.Может быть, вы могли бы создать подкласс GtkSourceBuffer и просто сохранить для него отдельную позицию курсора для каждого вида, к которому он добавлен.

Что бы вы сделали, если бы выбрали каждый бит текста в каждом представлении?Я бы тщательно обдумал это, прежде чем приступить к кодированию.

Быстрым и грязным способом было бы подключиться к сигналам 'focus-in-event' и 'focus-out-event' источникаПросмотры.Потеряв фокус, сделайте запись представления своей текущей позиции курсора.Затем, получив фокус, восстановите положение курсора.Таким образом, было бы почти так, как будто бы у каждого представления была своя собственная позиция курсора.

...