| 1 | |
|---|
| 2 | |
|---|
| 3 | |
|---|
| 4 | |
|---|
| 5 | |
|---|
| 6 | |
|---|
| 7 | |
|---|
| 8 | |
|---|
| 9 | |
|---|
| 10 | |
|---|
| 11 | |
|---|
| 12 | |
|---|
| 13 | |
|---|
| 14 | |
|---|
| 15 | |
|---|
| 16 | |
|---|
| 17 | |
|---|
| 18 | import random |
|---|
| 19 | import webbrowser |
|---|
| 20 | |
|---|
| 21 | import pygtk |
|---|
| 22 | pygtk.require('2.0') |
|---|
| 23 | import gtk |
|---|
| 24 | |
|---|
| 25 | |
|---|
| 26 | class TextInputDialog(gtk.Dialog): |
|---|
| 27 | |
|---|
| 28 | def __init__(self, toplevel_window, suggested_name): |
|---|
| 29 | flags = gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT |
|---|
| 30 | buttons = (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT, |
|---|
| 31 | gtk.STOCK_OK, gtk.RESPONSE_ACCEPT) |
|---|
| 32 | super(TextInputDialog, self).__init__(u'Enter a name for the dataset', |
|---|
| 33 | toplevel_window, flags, buttons) |
|---|
| 34 | self.set_default_size(300, -1) |
|---|
| 35 | |
|---|
| 36 | hbox = gtk.HBox(spacing=6) |
|---|
| 37 | hbox.set_border_width(12) |
|---|
| 38 | |
|---|
| 39 | label = gtk.Label(u'Name') |
|---|
| 40 | hbox.pack_start(label, False, False) |
|---|
| 41 | |
|---|
| 42 | self.entry = gtk.Entry() |
|---|
| 43 | self.entry.set_text(suggested_name) |
|---|
| 44 | self.entry.set_activates_default(True) |
|---|
| 45 | hbox.pack_start(self.entry, True, True) |
|---|
| 46 | |
|---|
| 47 | self.vbox.pack_start(hbox, False, False) |
|---|
| 48 | |
|---|
| 49 | self.vbox.show_all() |
|---|
| 50 | |
|---|
| 51 | self.set_default_response(gtk.RESPONSE_ACCEPT) |
|---|
| 52 | |
|---|
| 53 | def get_name(self): |
|---|
| 54 | return self.entry.get_text() |
|---|
| 55 | |
|---|
| 56 | |
|---|
| 57 | class PointDialog(gtk.Dialog): |
|---|
| 58 | |
|---|
| 59 | def __init__(self, toplevel_window, initial_x, initial_y): |
|---|
| 60 | flags = gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT |
|---|
| 61 | buttons = (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT, |
|---|
| 62 | gtk.STOCK_OK, gtk.RESPONSE_ACCEPT) |
|---|
| 63 | super(PointDialog, self).__init__(u'Enter the point values', |
|---|
| 64 | toplevel_window, flags, buttons) |
|---|
| 65 | |
|---|
| 66 | initials = {u'x': str(initial_x), u'y': str(initial_y)} |
|---|
| 67 | self.entries = {} |
|---|
| 68 | for coordinate in (u'x', u'y'): |
|---|
| 69 | hbox = gtk.HBox(spacing=6) |
|---|
| 70 | hbox.set_border_width(12) |
|---|
| 71 | |
|---|
| 72 | label = gtk.Label(coordinate) |
|---|
| 73 | hbox.pack_start(label, False, False) |
|---|
| 74 | |
|---|
| 75 | entry = gtk.Entry() |
|---|
| 76 | entry.set_activates_default(True) |
|---|
| 77 | entry.set_text(initials[coordinate]) |
|---|
| 78 | hbox.pack_start(entry, True, True) |
|---|
| 79 | |
|---|
| 80 | self.entries[coordinate] = entry |
|---|
| 81 | |
|---|
| 82 | self.vbox.pack_start(hbox, False, False) |
|---|
| 83 | |
|---|
| 84 | self.vbox.show_all() |
|---|
| 85 | |
|---|
| 86 | self.set_default_response(gtk.RESPONSE_ACCEPT) |
|---|
| 87 | |
|---|
| 88 | def get_point(self): |
|---|
| 89 | return (float(self.entries[u'x'].get_text()), |
|---|
| 90 | float(self.entries[u'y'].get_text())) |
|---|
| 91 | |
|---|
| 92 | |
|---|
| 93 | class OptionDialog(gtk.Dialog): |
|---|
| 94 | |
|---|
| 95 | def __init__(self, toplevel_window, label, value, value_type): |
|---|
| 96 | flags = gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT |
|---|
| 97 | buttons = (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT, |
|---|
| 98 | gtk.STOCK_OK, gtk.RESPONSE_ACCEPT) |
|---|
| 99 | super(OptionDialog, self).__init__(u'Enter the option value', |
|---|
| 100 | toplevel_window, flags, buttons) |
|---|
| 101 | |
|---|
| 102 | |
|---|
| 103 | hbox = gtk.HBox(spacing=6) |
|---|
| 104 | hbox.set_border_width(12) |
|---|
| 105 | |
|---|
| 106 | label = gtk.Label(label) |
|---|
| 107 | hbox.pack_start(label, False, False) |
|---|
| 108 | |
|---|
| 109 | self.entry = gtk.Entry() |
|---|
| 110 | self.entry.set_text(value or '') |
|---|
| 111 | self.entry.set_activates_default(True) |
|---|
| 112 | hbox.pack_start(self.entry, True, True) |
|---|
| 113 | |
|---|
| 114 | self.vbox.pack_start(hbox, False, False) |
|---|
| 115 | |
|---|
| 116 | self.vbox.show_all() |
|---|
| 117 | |
|---|
| 118 | self.set_default_response(gtk.RESPONSE_ACCEPT) |
|---|
| 119 | |
|---|
| 120 | def get_value(self): |
|---|
| 121 | return self.entry.get_text() |
|---|
| 122 | |
|---|
| 123 | |
|---|
| 124 | class RandomGeneratorDialog(gtk.Dialog): |
|---|
| 125 | |
|---|
| 126 | def __init__(self, toplevel_window): |
|---|
| 127 | flags = gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT |
|---|
| 128 | buttons = (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT, |
|---|
| 129 | gtk.STOCK_OK, gtk.RESPONSE_ACCEPT) |
|---|
| 130 | super(RandomGeneratorDialog, self).__init__(u'Points generation', |
|---|
| 131 | toplevel_window, |
|---|
| 132 | flags, buttons) |
|---|
| 133 | |
|---|
| 134 | self.size_group = gtk.SizeGroup(gtk.SIZE_GROUP_HORIZONTAL) |
|---|
| 135 | |
|---|
| 136 | self.number = self._create_spin_button('Number of points to generate', |
|---|
| 137 | 0, 1, 5, 1, 1000, 10) |
|---|
| 138 | self.min = self._create_spin_button('Minimum y value', |
|---|
| 139 | 2, 0.5, 1, -1000, 1000, 0) |
|---|
| 140 | self.max = self._create_spin_button('Maximum y value', |
|---|
| 141 | 2, 0.5, 1, 0, 1000, 10) |
|---|
| 142 | |
|---|
| 143 | self.vbox.show_all() |
|---|
| 144 | |
|---|
| 145 | self.set_default_response(gtk.RESPONSE_ACCEPT) |
|---|
| 146 | |
|---|
| 147 | def _create_spin_button(self, label_text, digits, step, page, |
|---|
| 148 | min_value, max_value, value): |
|---|
| 149 | hbox = gtk.HBox(spacing=6) |
|---|
| 150 | hbox.set_border_width(12) |
|---|
| 151 | |
|---|
| 152 | label = gtk.Label(label_text) |
|---|
| 153 | label.set_alignment(1.0, 0.5) |
|---|
| 154 | self.size_group.add_widget(label) |
|---|
| 155 | hbox.pack_start(label, False, False) |
|---|
| 156 | |
|---|
| 157 | spin_button = gtk.SpinButton(digits=digits) |
|---|
| 158 | spin_button.set_increments(step, page) |
|---|
| 159 | spin_button.set_range(min_value, max_value) |
|---|
| 160 | spin_button.set_value(value) |
|---|
| 161 | spin_button.set_activates_default(True) |
|---|
| 162 | hbox.pack_start(spin_button, True, True) |
|---|
| 163 | |
|---|
| 164 | self.vbox.pack_start(hbox, False, False) |
|---|
| 165 | |
|---|
| 166 | return spin_button |
|---|
| 167 | |
|---|
| 168 | def generate_points(self): |
|---|
| 169 | n = self.number.get_value_as_int() |
|---|
| 170 | min_value = self.min.get_value() |
|---|
| 171 | max_value = self.max.get_value() |
|---|
| 172 | return [(x, random.uniform(min_value, max_value)) |
|---|
| 173 | for x in range(n)] |
|---|
| 174 | |
|---|
| 175 | |
|---|
| 176 | class AboutDialog(gtk.AboutDialog): |
|---|
| 177 | |
|---|
| 178 | def __init__(self, toplevel_window): |
|---|
| 179 | super(AboutDialog, self).__init__() |
|---|
| 180 | self.set_transient_for(toplevel_window) |
|---|
| 181 | |
|---|
| 182 | self.set_name('Chavier') |
|---|
| 183 | self.set_version('0.1') |
|---|
| 184 | self.set_comments('A Chart Viewer for the Pycha library') |
|---|
| 185 | self.set_copyright('Copyleft 2008 Lorenzo Gil Sanchez') |
|---|
| 186 | |
|---|
| 187 | author = 'Lorenzo Gil Sanchez <lorenzo.gil.sanchez@gmail.com>' |
|---|
| 188 | self.set_authors([author]) |
|---|
| 189 | self.set_program_name('Chavier') |
|---|
| 190 | self.set_website('http://www.lorenzogil.com/projects/pycha') |
|---|
| 191 | self.set_website_label('Project website') |
|---|
| 192 | |
|---|
| 193 | |
|---|
| 194 | def url_handler(dialog, link, data=None): |
|---|
| 195 | webbrowser.open(link) |
|---|
| 196 | |
|---|
| 197 | gtk.about_dialog_set_url_hook(url_handler) |
|---|
| 198 | |
|---|
| 199 | |
|---|
| 200 | def warning(window, msg): |
|---|
| 201 | dialog = gtk.MessageDialog(window, |
|---|
| 202 | gtk.DIALOG_MODAL|gtk.DIALOG_DESTROY_WITH_PARENT, |
|---|
| 203 | gtk.MESSAGE_WARNING, gtk.BUTTONS_OK, msg) |
|---|
| 204 | dialog.run() |
|---|
| 205 | dialog.destroy() |
|---|