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