Display code fragments in GtkSourceView and maintain line numbers

A problem I found while developing for coala is that i needed a Sourcecode printing widget which would print snippets of code. The obvious choice was to use GtkSourceView. A fundemental problem I discovered was that while it prints snippets of code from a file it does not maintain line numbers which was critical for my application.

The Solution:

GtkSourceView has a gutter object which holds all the objects in the margin. This also includes the line numbers. Thus I assigned a custom line renderer.

class LineRenderer(GtkSource.GutterRendererText): 
    line_offset = 0 
    def __init__(self, start_line, *args, **kwargs): 
        self.line_offset = start_line GtkSource.GutterRendererText.__init__(self, *args, **kwargs) 
    def do_query_data(self, start, end, flags): 
        self.props.text = str(start.get_line() + self.line_offset + 1) 
        label = Gtk.Label() 
        pango_layout = label.get_layout() 
        pango_layout.set_text(self.props.text, len(self.props.text)) 
        self.props.size = pango_layout.get_pixel_size()[0]

The usage

textbuffer = GtkSource.Buffer() 
textbuffer.set_highlight_syntax(True) 
textbuffer.set_language(language) 
textbuffer.set_text(''.join(open(result.file).readlines()[start_nr:result.line_nr])[:-1]) 
textview = GtkSource.View(visible=True, buffer=textbuffer, monospace=True, editable=False) 
textview.set_visible(True) 
textview.set_hexpand(True) 
self.source_view.attach(textview, 0,self.source_view_iter, 2, 1) 
gutter = textview.get_gutter(Gtk.TextWindowType.LEFT) 
renderer = LineRenderer(start_nr, xpad=6, xalign=1.0) 
gutter.insert(renderer, 0)</pre>
<pre>

Any further queries drop a comment. šŸ™‚

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s