Gtk: Как я могу получить часть файла в текстовом виде с полосами прокрутки, относящихся к полному файлу - PullRequest
5 голосов
/ 23 апреля 2010

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

Я играл с Gtk.Adjustment на Gtk.ScrolledWindow и ScrollBars, но хотя я могу расширить диапазон полос прокрутки, они все же применяются к диапазону буфера, а не к размеру файла (который я пытаюсь установить с помощьюGtk.Adjustment параметры), когда я загружаю в textview.Мне нужно иметь виджет, который «знает», что он смотрит на часть файла, и может загружать / выгружать буферы по мере необходимости для просмотра различных частей файла.До сих пор я верю, что я отвечу на "change_view", чтобы вычислить, когда я выключен или собираюсь отключиться от текущего буфера и должен загрузить следующий, но я не знаю, как заставить полосы прокрутки иметьверхняя часть относится к началу файла, а нижняя часть относится к концу файла, а не к загруженному буферу в textview.

Любая помощь будет принята с благодарностью, спасибо!

Ответы [ 2 ]

1 голос
/ 23 апреля 2010

Вы, вероятно, должны создать свою собственную реализацию Gtk.TextBuffer, поскольку по умолчанию она использует весь буфер в памяти.

0 голосов
/ 24 апреля 2010

Я согласен с ответом el.pescado, но вы также можете попытаться подделать его.Подсчитайте количество строк в файле, который вы редактируете.Поместите один скриншот текста в буфер и заполните остальные строки новой строкой, чтобы в буфере было столько же строк, сколько в файле.

Затем подключите к сигналу changed регулировки по вертикали прокручиваемого окна, содержащего текстовое представление, это будет уведомлять вас при каждой прокрутке окна.Когда это произойдет, замените текст, который у вас уже был в буфере, на новые строки и загрузите раздел, который вы сейчас просматриваете.

Вы можете сказать, какие номера строк вы должны просматривать в текстовом представленииэтот код (могут быть ошибки, я делаю это из памяти и на лету перевожу на Python):

visible_rect = textview.get_visible_rect()
top = textview.get_iter_at_location(visible_rect.x, visible_rect.y)
bottom = textview.get_iter_at_location(visible_rect.x, visible_rect.y + visible_rect.height)
top_line, bottom_line = top.get_line(), bottom.get_line()
...