Update year to 2009 in various places
[zeroinstall/zeroinstall-rsl.git] / zeroinstall / 0launch-gui / dialog.py
blobe174e996ff1530f2acf2025ffa9cf2f700ab1a39
1 # Copyright (C) 2009, Thomas Leonard
2 # See the README file for details, or visit http://0install.net.
4 import gtk
5 import gtk.glade
6 import os
7 from zeroinstall.support import tasks
8 from zeroinstall.gtkui import gtkutils
10 n_windows = 0
12 last_error = None
14 gladefile = os.path.join(os.path.dirname(__file__), 'zero-install.glade')
16 class Template(gtkutils.Template):
17 def __init__(self, root):
18 gtkutils.Template.__init__(self, gladefile, root)
20 class Dialog(gtk.Dialog):
21 __shown = False
23 def __init__(self):
24 gtk.Dialog.__init__(self)
25 self.set_has_separator(False)
26 self.set_position(gtk.WIN_POS_CENTER)
28 def add_mixed_button(self, message, stock, response):
29 button = MixedButton(message, stock)
30 button.set_flags(gtk.CAN_DEFAULT)
32 self.add_action_widget(button, response)
33 button.show_all()
34 return button
36 class DialogResponse(tasks.Blocker):
37 response = None
38 def __init__(self, dialog):
39 tasks.Blocker.__init__(self, dialog.get_title())
40 a = None
41 def response(d, resp):
42 self.response = resp
43 d.disconnect(a)
44 self.trigger()
45 a = dialog.connect('response', response)
47 class ButtonClickedBlocker(tasks.Blocker):
48 def __init__(self, button):
49 tasks.Blocker.__init__(self, "Button click")
50 a = None
51 def clicked(b):
52 b.disconnect(a)
53 self.trigger()
54 a = button.connect('clicked', lambda b: self.trigger())
56 def alert(parent, message, type = gtk.MESSAGE_ERROR):
57 if type == gtk.MESSAGE_ERROR:
58 global last_error
59 last_error = message
61 gtkutils.show_message_box(parent, message, type)
63 def MixedButton(message, stock, x_align = 0.5, button = None):
64 if button is None:
65 button = gtk.Button()
67 label = gtk.Label('')
68 label.set_text_with_mnemonic(message)
69 label.set_mnemonic_widget(button)
71 image = gtk.image_new_from_stock(stock, gtk.ICON_SIZE_BUTTON)
72 box = gtk.HBox(False, 2)
73 align = gtk.Alignment(x_align, 0.5, 0.0, 0.0)
75 box.pack_start(image, False, False, 0)
76 box.pack_end(label, False, False, 0)
78 button.add(align)
79 align.add(box)
80 return button
82 def frame(page, title, content, expand = False):
83 frame = gtk.Frame()
84 label = gtk.Label()
85 label.set_markup('<b>%s</b>' % title)
86 frame.set_label_widget(label)
87 frame.set_shadow_type(gtk.SHADOW_NONE)
88 if type(content) in (str, unicode):
89 content = gtk.Label(content)
90 content.set_alignment(0, 0.5)
91 content.set_selectable(True)
92 frame.add(content)
93 if hasattr(content, 'set_padding'):
94 content.set_padding(8, 4)
95 else:
96 content.set_border_width(8)
97 page.pack_start(frame, expand, True, 0)