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
|
import os, gtk, gtksourceview2
import glitch
from glitch import *
_default="""import glitch, glitch.gtk
from glitch.limbo.objects import Square
cam=glitch.gtk.GtkCamera(children=[
Square()])
cam.run()
"""
class Start(gtk.Window):
def __init__(self, *args, **kwargs):
gtk.Window.__init__(self)
self.set_title("The Dagger")
self.glue = gtk.VBox()
self.add(self.glue)
self.srcview = self._srcview()
sw = gtk.ScrolledWindow()
sw.add(self.srcview)
toolbar=self._toolbar()
self.nodes=self._nodes()
hp= gtk.HPaned()
hp.add1(self.nodes)
hp.add2(sw)
self.glue.pack_start(toolbar, False)
self.glue.pack_start(hp)
def do_run(self, *args):
src= self.srcview.get_buffer().get_text(*self.srcview.get_buffer().get_bounds())
exec(src, {})
def do_open(self, *args):
f=gtk.FileChooserDialog(action=gtk.FILE_CHOOSER_ACTION_OPEN,buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK))
response = f.run()
if response == gtk.RESPONSE_OK:
self.outfile=f.get_filename()
self.srcview.get_buffer().set_text(open(self.outfile).read())
f.destroy()
def do_save(self, *args):
if not hasattr(self, "outfile"):
f=gtk.FileChooserDialog(action=gtk.FILE_CHOOSER_ACTION_SAVE,buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK))
response = f.run()
if response == gtk.RESPONSE_OK:
self.outfile=f.get_filename()
self.do_save()
f.destroy()
else:
src= self.srcview.get_buffer().get_text(*self.srcview.get_buffer().get_bounds())
open(self.outfile, 'w').write(src)
def _srcview(self):
mgr = gtksourceview2.LanguageManager()
python = mgr.get_language('python')
buffer = gtksourceview2.Buffer()
buffer.set_language(python)
buffer.set_text(_default)
return gtksourceview2.View(buffer)
def _nodes(self):
vp = gtk.VPaned()
ls = gtk.ListStore(str)
for node in dir(glitch):
if isinstance(getattr(glitch, node), type):
ls.append([node])
tv = gtk.TreeView(ls)
renderer = gtk.CellRendererText()
col= gtk.TreeViewColumn("Nodes", renderer)
col.add_attribute(renderer, "text", 0)
mgr = gtksourceview2.LanguageManager()
python = mgr.get_language('python')
docbuffer=gtksourceview2.Buffer()
docbuffer.set_language(python)
docs=gtksourceview2.View(docbuffer)
def on_change(tv):
(model, iter)=tv.get_selection().get_selected()
sel= model.get_value(iter, 0)
cls=eval(sel, globals())
mod=eval(cls.__module__, globals())
f=mod.__file__.replace('pyc', 'py')
docbuffer.set_text(open(f).read())
tv.connect('cursor-changed', on_change)
tv.append_column(col)
sc_tv=gtk.ScrolledWindow()
sc_tv.set_size_request(200,400)
sc_tv.add(tv)
sc_docs=gtk.ScrolledWindow()
sc_docs.add(docs)
vp.add1(sc_tv)
vp.add2(sc_docs)
return vp
def _toolbar(self):
toolbar = gtk.Toolbar()
items = [("execute", gtk.STOCK_EXECUTE, self.do_run),
("save", gtk.STOCK_SAVE, self.do_save),
("open", gtk.STOCK_OPEN, self.do_open),
("close", gtk.STOCK_CLOSE, lambda w: gtk.main_quit())]
for (label, icon, fn) in items:
b = gtk.ToolButton(icon)
b.set_label(label)
toolbar.insert(b, 0)
b.connect("clicked", fn)
return toolbar
if __name__=='__main__':
s = Start()
s.show_all()
s.connect('destroy', lambda w: gtk.main_quit()) # todo: save?
gtk.main()
|