2010-04-23 2 views
5

매우 큰 파일 편집기를 만들려고합니다 (편집기는 메모리의 일부분 만 메모리에 저장합니다). 시간),하지만 내 textview 개체를 구축하는 동안 붙어있어. 기본적으로 - 나는 텍스트 뷰 버퍼를 동적으로 업데이트 할 수 있어야한다는 것을 알고 있으며 textview에는 파일의 작은 버퍼 만 포함되어있는 반면 스크롤바는 전체 파일과 관련이 있다는 것을 알지 못합니다.Gtk : 전체 파일과 관련된 스크롤 막대를 사용하여 텍스트 뷰에서 파일의 일부분을 가져 오는 방법은 무엇입니까?

나는 Gtk.ScrolledWindow 및 ScrollBars에서 Gtk.Adjustment를 사용했지만 스크롤바의 범위를 확장 할 수는 있지만 여전히 설정하려고하는 파일 크기가 아니라 버퍼 범위에 적용됩니다. Gtk.Adjustment 매개 변수를 통해) 텍스트 뷰로로드 할 때. 나는 그것이 파일의 일부분을보고 있다는 것을 "알고있다"는 위젯을 가질 필요가 있으며, 파일의 다른 부분을보기 위해 필요한만큼 버퍼를로드/언로드 할 수있다. 지금까지, 나는 "change_view"에 응답하여 내가 꺼져 있거나 현재 버퍼를 벗어나서 다음 버퍼를로드해야 할 때를 계산할 것이라고 생각하지만, 스크롤 막대를 가져 오는 방법을 모르겠습니다. 상단은 파일의 시작과 관련이 있으며 하단은 textview의로드 된 버퍼가 아니라 파일의 끝과 관련이 있습니다.

도움을 주시면 감사하겠습니다.

답변

1

기본 Gtk.TextBuffer 구현을 작성해야합니다. 전체 버퍼를 메모리에 저장해야합니다.

0

el.pescado의 대답에 동의하지만 위장하려고 할 수도 있습니다. 편집중인 파일의 줄 수를 센다. 한 화면의 텍스트를 버퍼에 넣고 나머지는 줄 바꿈으로 채 웁니다. 버퍼의 줄 수는 파일과 같습니다.

그런 다음 텍스트보기가 포함 된 스크롤 된 창의 수직 조정 신호 인 changed에 연결하면 창이 스크롤 될 때마다 알려줍니다. 그럴 경우 버퍼에 이미있는 텍스트를 개행 문자로 바꾸고 현재보고있는 섹션을로드하십시오.

당신은 (내가 즉석에서 파이썬으로 메모리에서이 일을하고 번역하고있어, 버그가있을 수 있습니다)이 코드를 텍스트 뷰에보고 할 당신이 생각하는 라인 번호를 알 수 있습니다 :

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()