root / ase / gui / widgets.py @ 12
Historique | Voir | Annoter | Télécharger (4,23 ko)
1 |
import gtk |
---|---|
2 |
|
3 |
from ase.gui.languages import translate as _ |
4 |
|
5 |
|
6 |
class Number(gtk.SpinButton): |
7 |
def __init__(self, value=0, |
8 |
lower=0, upper=10000, |
9 |
step_incr=1, page_incr=10, |
10 |
climb_rate=0.5, digits=0): |
11 |
self.adj = gtk.Adjustment(value, lower, upper, step_incr, page_incr, 0) |
12 |
gtk.SpinButton.__init__(self, self.adj, climb_rate, digits) |
13 |
|
14 |
def connect(self, *args): |
15 |
return self.adj.connect(*args) |
16 |
|
17 |
|
18 |
class Menu: |
19 |
def __init__(self, menubar, name, items): |
20 |
self.items = {}
|
21 |
menu = gtk.Menu() |
22 |
for data in items: |
23 |
text = data[0]
|
24 |
callback = data[1]
|
25 |
args = data[2:]
|
26 |
menuitem = gtk.MenuItem(_(text)) |
27 |
menu.append(menuitem) |
28 |
menuitem.connect('activate', callback, *args)
|
29 |
menuitem.show() |
30 |
self.items[text] = menuitem
|
31 |
menuitem = gtk.MenuItem(_(name)) |
32 |
menubar.append(menuitem) |
33 |
menuitem.set_submenu(menu) |
34 |
menuitem.show() |
35 |
|
36 |
|
37 |
class Help(gtk.Window): |
38 |
def __init__(self, text): |
39 |
gtk.Window.__init__(self)
|
40 |
vbox = gtk.VBox() |
41 |
self.add(vbox)
|
42 |
label = pack(vbox, gtk.Label()) |
43 |
label.set_line_wrap(True)
|
44 |
text = _(text).replace('<c>', '<span foreground="blue">') |
45 |
text = text.replace('</c>', '</span>') |
46 |
label.set_markup(text) |
47 |
close = pack(vbox, gtk.Button(_('Close')))
|
48 |
close.connect('clicked', lambda widget: self.destroy()) |
49 |
self.show_all()
|
50 |
|
51 |
def help(text): |
52 |
button = gtk.Button(_('Help'))
|
53 |
button.connect('clicked', lambda widget, text=text: Help(text)) |
54 |
return button
|
55 |
|
56 |
|
57 |
class Window(gtk.Window): |
58 |
def __init__(self, gui): |
59 |
self.gui = gui
|
60 |
gtk.Window.__init__(self)
|
61 |
self.set_title(_('Constraints')) |
62 |
vbox = gtk.VBox() |
63 |
b = pack(vbox, [gtk.Button(_('Constrain')),
|
64 |
gtk.Label(_(' selected atoms'))])[0] |
65 |
b.connect('clicked', self.selected) |
66 |
b = pack(vbox, [gtk.Button(_('Constrain')),
|
67 |
gtk.Label(_(' immobile atoms:'))])[0] |
68 |
b.connect('clicked', self.immobile) |
69 |
b = pack(vbox, gtk.Button('Clear constraint'))
|
70 |
b.connect('clicked', self.clear) |
71 |
close = pack(vbox, gtk.Button(_('Close')))
|
72 |
close.connect('clicked', lambda widget: self.destroy()) |
73 |
self.add(vbox)
|
74 |
vbox.show() |
75 |
self.show()
|
76 |
|
77 |
def pack(vbox, widgets, end=False, bottom=False): |
78 |
if not isinstance(widgets, list): |
79 |
widgets.show() |
80 |
if bottom:
|
81 |
vbox.pack_end(widgets, 0, 0) |
82 |
else:
|
83 |
vbox.pack_start(widgets, 0, 0) |
84 |
return widgets
|
85 |
hbox = gtk.HBox(0, 0) |
86 |
hbox.show() |
87 |
if bottom:
|
88 |
vbox.pack_end(hbox, 0, 0) |
89 |
else:
|
90 |
vbox.pack_start(hbox, 0, 0) |
91 |
for widget in widgets: |
92 |
if type(widget) is gtk.Entry: |
93 |
widget.set_size_request(widget.get_max_length() * 9, 24) |
94 |
widget.show() |
95 |
if end and widget is widgets[-1]: |
96 |
hbox.pack_end(widget, 0, 0) |
97 |
else:
|
98 |
hbox.pack_start(widget, 0, 0) |
99 |
return widgets
|
100 |
|
101 |
class cancel_apply_ok(gtk.HButtonBox): |
102 |
"Widget with Cancel, Apply and OK buttons. The arguments are callbacks."
|
103 |
def __init__(self, cancel, apply, ok): |
104 |
gtk.HButtonBox.__init__(self)
|
105 |
cancel_but = gtk.Button(stock=gtk.STOCK_CANCEL) |
106 |
cancel_but.connect('clicked', cancel)
|
107 |
apply_but = gtk.Button(stock=gtk.STOCK_APPLY) |
108 |
apply_but.connect('clicked', apply) |
109 |
ok_but = gtk.Button(stock=gtk.STOCK_OK) |
110 |
ok_but.connect('clicked', ok)
|
111 |
for w in (cancel_but, apply_but, ok_but): |
112 |
self.pack_start(w, 0, 0) |
113 |
w.show() |
114 |
#self.show_all()
|
115 |
|
116 |
def oops(message, message2=None): |
117 |
dialog = gtk.MessageDialog(flags=gtk.DIALOG_MODAL, |
118 |
type=gtk.MESSAGE_WARNING, |
119 |
buttons=gtk.BUTTONS_CLOSE, |
120 |
message_format=message) |
121 |
try:
|
122 |
dialog.format_secondary_text(message2) |
123 |
except AttributeError: |
124 |
print >>sys.stderr, message
|
125 |
print >>sys.stderr, message2
|
126 |
dialog.connect('response', lambda x, y, dialog=dialog: dialog.destroy()) |
127 |
dialog.show() |
128 |
|
129 |
class AseGuiCancelException(Exception): |
130 |
pass
|
131 |
|