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