summaryrefslogtreecommitdiff
path: root/examples/cairo_snippets/snippets_gtk.py
blob: c7796ea4bf10670e7e5cfc9b0a7796d4b9739db8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#!/usr/bin/env python
"""Python version of cairo-demo/cairo_snippets/cairo_snippets_gtk.c
"""
from __future__ import division
from math import pi as M_PI  # used by many snippets
import os.path
import sys

import cairo
import gtk
import pango

from snippets import snip_list, snippet_normalize


Width, Height = 400, 400

snippets_path = os.path.join(os.path.dirname(__file__), 'snippets')


def gdkcolor_to_rgb (gdkcolor):
    return gdkcolor.red/65535, gdkcolor.green/65535, gdkcolor.blue/65535


class Window (gtk.Window):
    """Composite widget"""
    def __init__ (self, title=None, type=gtk.WINDOW_TOPLEVEL):
        gtk.Window.__init__ (self, type)
        self.set_default_size (Width, Height)

        self.da = gtk.DrawingArea()
        self.da.connect('expose-event', self.da_expose_event)

        def put_in_frame (widget):
            frame = gtk.Frame (label=None)
            frame.set_property ('shadow_type', gtk.SHADOW_IN)
            frame.add (widget)
            return frame

        vpaned = gtk.VPaned()
        self.add (vpaned)

        sv = self.create_text_view()
        vpaned.pack1 (put_in_frame (sv), True, True)
        sv.set_size_request (Width, int(Height/2))

        hpaned = gtk.HPaned()
        vpaned.pack2 (hpaned, True, False)

        sl = self.create_snippet_list()
        hpaned.pack1 (put_in_frame (sl), True, True)

        hpaned.pack2 (put_in_frame (self.da), True, True)
        self.da.set_size_request (int(Width/2), int(Height/2))

        # set focus to snippet list
        sl.get_child().grab_focus()


    def da_expose_event (self, da, event, data=None):
        x, y, width, height = da.allocation

        cr = da.window.cairo_create()

        try:
            exec (self.snippet_str, globals(), locals())
        except:
            exc_type, exc_value = sys.exc_info()[:2]
            print >> sys.stderr, exc_type, exc_value

        return True


    def create_text_view (self):
        sw = gtk.ScrolledWindow()
        sw.set_property ('shadow-type', gtk.SHADOW_IN)
        sw.set_policy (hscrollbar_policy=gtk.POLICY_AUTOMATIC,
                       vscrollbar_policy=gtk.POLICY_AUTOMATIC)

        text_view = gtk.TextView()
        sw.add (text_view)
        # set a fixed width font, so any tabs line up
        text_view.modify_font(pango.FontDescription ("Fixed"))

        self.text_buffer = text_view.get_buffer()

        return sw


    def cb_selection_changed (self, tselection, data=None):
        model, iter = tselection.get_selected()
        if iter:
            filename = model[iter][0] + '.py'
            try:
                path = os.path.join(snippets_path, filename)
                file_obj = open(path, 'r')
                self.snippet_str = file_obj.read()
                file_obj.close()
                self.text_buffer.set_text(self.snippet_str)
            except IOError, exc:
                print "%s: %s" % (exc.filename, exc.strerror)

            self._draw_pixmap = True
            self.da.queue_draw()


    def create_snippet_list (self):
        sw = gtk.ScrolledWindow()
        sw.set_property ('shadow-type', gtk.SHADOW_IN)
        sw.set_policy (hscrollbar_policy=gtk.POLICY_NEVER,
                       vscrollbar_policy=gtk.POLICY_AUTOMATIC)

        model = gtk.ListStore (str,)
        for row in snip_list:
            model.append (row=(row,))

        tree_view = gtk.TreeView (model)
        sw.add (tree_view)
        tree_view.set_property ('headers-visible', False)
        tree_view.set_property ('search-column', 0)
        tree_view.set_property ('rules-hint', False)

        tselection = tree_view.get_selection()
        tselection.connect ("changed", self.cb_selection_changed)
        tselection.set_mode (gtk.SELECTION_BROWSE)

        cr = gtk.CellRendererText()
        tvc = gtk.TreeViewColumn (None, cr, text=0)
        tree_view.append_column (tvc)

        tselection.select_path(0,) # select first item

        return sw


if __name__ == '__main__':
    app = Window ()
    app.connect('destroy', gtk.main_quit)
    app.show_all()
    gtk.main()