1 # Copyright (C) 2006, Thomas Leonard
2 # See http://0install.net/0compile.html
5 import pygtk
; pygtk
.require('2.0')
8 class CompileBox(gtk
.Dialog
):
11 def __init__(self
, title
):
12 gtk
.Dialog
.__init
__(self
)
14 self
.set_default_size(gtk
.gdk
.screen_width() / 2, gtk
.gdk
.screen_height() / 2)
16 self
.add_button(gtk
.STOCK_CLOSE
, gtk
.RESPONSE_OK
)
18 self
.buffer = gtk
.TextBuffer()
19 tv
= gtk
.TextView(self
.buffer)
20 tv
.set_wrap_mode(gtk
.WRAP_WORD
)
21 swin
= gtk
.ScrolledWindow()
22 swin
.set_policy(gtk
.POLICY_NEVER
, gtk
.POLICY_AUTOMATIC
)
24 swin
.set_shadow_type(gtk
.SHADOW_IN
)
25 tv
.set_editable(False)
26 tv
.set_cursor_visible(False)
27 self
.vbox
.pack_start(swin
, True, True, 0)
31 def run(self
, command
, success
):
32 assert self
.child
is None
33 self
.success
= success
34 if isinstance(command
, basestring
):
35 self
.buffer.insert_at_cursor("Running: " + command
+ "\n")
37 self
.buffer.insert_at_cursor("Running: " + ' '.join(command
) + "\n")
38 self
.child
= popen2
.Popen4(command
)
39 self
.child
.tochild
.close()
40 gobject
.io_add_watch(self
.child
.fromchild
, gobject
.IO_IN | gobject
.IO_HUP
, self
.got_data
)
42 def got_data(self
, src
, cond
):
43 data
= os
.read(src
.fileno(), 100)
45 self
.buffer.insert_at_cursor(data
)
48 status
= self
.child
.wait()
51 if os
.WIFEXITED(status
) and os
.WEXITSTATUS(status
) == 0:
52 self
.buffer.insert_at_cursor("Command complete.\n")
55 self
.fail("Command failed.\n")
59 def choose_dir(title
, default
):
60 sel
= gtk
.FileSelection(title
)
61 sel
.set_has_separator(False)
62 sel
.set_filename(default
)
65 if resp
== gtk
.RESPONSE_OK
:
66 build_dir
= sel
.get_filename()
67 if not os
.path
.exists(build_dir
):
70 alert(sel
, _("'%s' already exists") % build_dir
)
75 def alert(parent
, msg
):
76 d
= gtk
.MessageDialog(parent
,