Added '0compile gui' command. This uses a GTK file selector to let you
[0compile.git] / gui_support.py
blobb6fd689d118536e3f491b8fb961ab50e9607ef6f
1 # Copyright (C) 2006, Thomas Leonard
2 # See http://0install.net/0compile.html
4 import sys, os, popen2
5 import pygtk; pygtk.require('2.0')
6 import gtk, gobject
8 class CompileBox(gtk.Dialog):
9 child = None
11 def __init__(self, title):
12 gtk.Dialog.__init__(self)
13 self.set_title(title)
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)
23 swin.add(tv)
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)
29 self.vbox.show_all()
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")
36 else:
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)
44 if data:
45 self.buffer.insert_at_cursor(data)
46 return True
47 else:
48 status = self.child.wait()
49 self.child = None
51 if os.WIFEXITED(status) and os.WEXITSTATUS(status) == 0:
52 self.buffer.insert_at_cursor("Command complete.\n")
53 self.success()
54 else:
55 self.fail("Command failed.\n")
56 return False
59 def choose_dir(title, default):
60 sel = gtk.FileSelection(title)
61 sel.set_has_separator(False)
62 sel.set_filename(default)
63 while True:
64 resp = sel.run()
65 if resp == gtk.RESPONSE_OK:
66 build_dir = sel.get_filename()
67 if not os.path.exists(build_dir):
68 sel.destroy()
69 return build_dir
70 alert(sel, _("'%s' already exists") % build_dir)
71 else:
72 sel.destroy()
73 return None
75 def alert(parent, msg):
76 d = gtk.MessageDialog(parent,
77 gtk.DIALOG_MODAL,
78 gtk.MESSAGE_ERROR,
79 gtk.BUTTONS_OK,
80 msg)
81 d.run()
82 d.destroy()