2010-04-23 4 views
5

Sto provando a creare un editor di file molto grande (dove l'editor memorizza solo una parte del buffer in memoria in un tempo), ma sono bloccato mentre costruisco il mio oggetto textview. Fondamentalmente, so che devo essere in grado di aggiornare il buffer di visualizzazione del testo in modo dinamico, e non so come fare in modo che le barre di scorrimento si colleghino al file completo mentre il testo contiene solo un piccolo buffer del file.Gtk: Come posso ottenere una parte di un file in una vista testuale con barre di scorrimento relative al file completo

Ho giocato con Gtk.Adjustment su Gtk.ScrolledWindow e ScrollBars, ma sebbene sia possibile estendere l'intervallo delle barre di scorrimento, si applicano comunque all'intervallo del buffer e non al file (che provo a impostare tramite i parametri Gtk.Adjustment) quando carico in textview. Ho bisogno di avere un widget che "sappia" che sta guardando una parte di un file, e può caricare/scaricare i buffer secondo necessità per visualizzare diverse parti del file. Finora, credo che risponderò al "change_view" per calcolare quando sono spento, o che sta per essere fuori dal buffer corrente e ho bisogno di caricare il prossimo, ma non so come ottenere le scrollbar per avere la parte superiore si riferisce all'inizio del file e la parte inferiore si riferisce alla fine del file, piuttosto che al buffer caricato in textview.

Qualsiasi aiuto sarebbe molto apprezzato, grazie!

risposta

1

Probabilmente dovresti creare la tua implementazione Gtk.TextBuffer, poiché quella di default si basa sull'archiviazione di un intero buffer in memoria.

0

Sono d'accordo con la risposta di el.pescado, ma potresti anche provare a fingere. Conta il numero di righe nel file che stai modificando. Metti una schermata di testo nel buffer e riempi il resto con le nuove righe in modo che il buffer abbia lo stesso numero di righe del file.

Quindi connettersi al segnale changed della regolazione verticale della finestra a scorrimento che contiene la visualizzazione del testo, questo verrà notificato all'utente ogni volta che si scorre la finestra. Quando ciò accade, sostituisci il testo che hai già nel buffer con newline e carica la sezione che stai guardando ora.

Si può dire che i numeri di riga si suppone di essere alla ricerca di in una vista di testo con questo codice (può avere bug, sto facendo questo dalla memoria e tradurre in Python al volo):

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