root/tags/0.4.1/chavier/dialogs.py

Revision 109, 6.8 kB (checked in by lgs, 4 years ago)

Some refactoring and support for negative values in line and bar charts. Inspired by Nicolas patch

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