2010-04-23 9 views
5

Tôi đang cố tạo một trình soạn thảo tệp rất lớn (nơi trình biên tập chỉ lưu trữ một phần của bộ đệm trong bộ nhớ thời gian), nhưng tôi bị kẹt trong khi xây dựng đối tượng xem văn bản của mình. Về cơ bản, tôi biết rằng tôi có thể cập nhật bộ đệm chế độ xem văn bản động và tôi không biết nóng để có được thanh cuộn liên quan đến tệp đầy đủ trong khi textview chỉ chứa một bộ đệm nhỏ của tệp.Gtk: Làm thế nào tôi có thể lấy một phần của tập tin trong chế độ xem văn bản với thanh cuộn liên quan đến toàn bộ tập tin

Tôi đã chơi với Gtk.Adjustment trên Gtk.ScrolledWindow và ScrollBars, nhưng mặc dù tôi có thể mở rộng phạm vi thanh cuộn, chúng vẫn áp dụng cho phạm vi của bộ đệm chứ không phải tệp (mà tôi cố gắng đặt thông qua các thông số Gtk.Adjustment) khi tôi tải vào chế độ xem văn bản. Tôi cần phải có một widget mà "biết" rằng nó đang xem xét một phần của một tập tin, và có thể tải/dỡ bỏ bộ đệm khi cần thiết để xem các phần khác nhau của tập tin. Cho đến nay, tôi tin rằng tôi sẽ đáp ứng với "change_view" để tính toán khi tôi tắt, hoặc sắp được ra khỏi bộ đệm hiện tại và cần phải tải tiếp theo, nhưng tôi không biết làm thế nào để có được các thanh cuộn để có đầu liên quan đến đầu của tập tin, và phía dưới liên quan đến cuối của tập tin, chứ không phải là bộ đệm nạp trong textview.

Bất kỳ trợ giúp nào sẽ được đánh giá cao, cảm ơn!

Trả lời

1

Có lẽ bạn nên tạo Gtk.TextBuffer của riêng bạn, vì trình cài đặt mặc định dựa vào lưu trữ toàn bộ bộ đệm trong bộ nhớ.

0

Tôi đồng ý với câu trả lời của el.pescado, nhưng bạn cũng có thể thử giả mạo nó. Đếm số dòng trong tệp bạn đang chỉnh sửa. Đặt một màn hình văn bản trong bộ đệm và điền phần còn lại với dòng mới để bộ đệm có cùng số dòng như tệp.

Sau đó kết nối với tín hiệu changed điều chỉnh theo chiều dọc của cửa sổ cuộn có chứa chế độ xem văn bản, điều này sẽ thông báo cho bạn bất cứ khi nào cửa sổ được cuộn. Khi điều đó xảy ra, hãy thay thế văn bản bạn đã có trong bộ đệm bằng dòng mới và tải phần bạn đang xem.

Bạn có thể biết được số dòng bạn có nghĩa vụ phải được xem xét trong một cái nhìn văn bản với mã này (có thể có lỗi, tôi đang làm điều này từ bộ nhớ và dịch vào Python on the fly):

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