2 Copyright 2007, 2008, 2009 Free Software Foundation, Inc.
3 This file is part of GNU Radio
5 GNU Radio Companion is free software; you can redistribute it and/or
6 modify it under the terms of the GNU General Public License
7 as published by the Free Software Foundation; either version 2
8 of the License, or (at your option) any later version.
10 GNU Radio Companion 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 General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
24 from Dialogs import TextDisplay
25 from Constants import MIN_DIALOG_WIDTH, MIN_DIALOG_HEIGHT
27 def get_title_label(title):
29 Get a title label for the params window.
30 The title will be bold, underlined, and left justified.
31 @param title the text of the title
35 label.set_markup('\n<b><span underline="low">%s</span>:</b>\n'%title)
37 hbox.pack_start(label, False, False, padding=11)
40 class PropsDialog(gtk.Dialog):
42 A dialog to set block parameters, view errors, and view documentation.
45 def __init__(self, block):
47 Properties dialog contructor.
48 @param block a block instance
52 gtk.Dialog.__init__(self,
53 title='Properties: %s'%block.get_name(),
54 buttons=(gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE),
57 self.set_size_request(MIN_DIALOG_WIDTH, MIN_DIALOG_HEIGHT)
59 #Create the scrolled window to hold all the parameters
60 scrolled_window = gtk.ScrolledWindow()
61 scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
62 scrolled_window.add_with_viewport(vbox)
63 self.vbox.pack_start(scrolled_window, True)
64 #Params box for block parameters
65 self._params_box = gtk.VBox()
66 self._params_box.pack_start(get_title_label('Parameters'), False)
67 self._input_object_params = list()
68 #Error Messages for the block
69 self._error_box = gtk.VBox()
70 self._error_messages_text_display = TextDisplay()
71 self._error_box.pack_start(gtk.Label(), False, False, LABEL_SPACING)
72 self._error_box.pack_start(get_title_label('Error Messages'), False)
73 self._error_box.pack_start(self._error_messages_text_display, False)
75 self._docs_box = err_box = gtk.VBox()
76 self._docs_text_display = TextDisplay()
77 self._docs_box.pack_start(gtk.Label(), False, False, LABEL_SPACING)
78 self._docs_box.pack_start(get_title_label('Documentation'), False)
79 self._docs_box.pack_start(self._docs_text_display, False)
81 vbox.pack_start(self._params_box, False)
82 vbox.pack_start(self._error_box, False)
83 vbox.pack_start(self._docs_box, False)
84 #connect key press event
85 self.connect('key_press_event', self._handle_key_press)
86 #initial update to populate the params
90 def _params_changed(self):
92 Have the params in this dialog changed?
93 Ex: Added, removed, type change...
94 Make a hash that uniquely represents the params state.
95 @return true if changed
99 for param in self._block.get_params():
100 self._hash ^= hash(param)
101 self._hash ^= hash(param.get_type())
102 return self._hash != old_hash
106 Repopulate the parameters box (if changed).
107 Update all the input parameters.
108 Update the error messages box.
109 Hide the box if there are no errors.
110 Update the documentation block.
111 Hide the box if there are no docs.
113 #update for the block
114 self._block.rewrite()
115 self._block.validate()
116 #update the params box
117 if self._params_changed():
118 #empty the params box
119 for io_param in list(self._input_object_params):
121 self._params_box.remove(io_param)
122 self._input_object_params.remove(io_param)
124 #repopulate the params box
125 for param in self._block.get_params():
126 io_param = param.get_input(param, callback=self._update)
127 self._input_object_params.append(io_param)
128 self._params_box.pack_start(io_param, False)
129 #update the gui inputs
130 for io_param in self._input_object_params: io_param.update()
131 #update the errors box
132 if self._block.is_valid(): self._error_box.hide()
133 else: self._error_box.show()
134 messages = '\n\n'.join(self._block.get_error_messages())
135 self._error_messages_text_display.set_text(messages)
137 if self._block.get_doc(): self._docs_box.show()
138 else: self._docs_box.hide()
139 self._docs_text_display.set_text(self._block.get_doc())
141 def _handle_key_press(self, widget, event):
143 Handle key presses from the keyboard.
144 Call the ok response when enter is pressed.
145 @return false to forward the keypress
147 keyname = gtk.gdk.keyval_name(event.keyval)
148 if keyname == 'Return': self.response(gtk.RESPONSE_OK)
149 return False #forward the keypress
154 @return true if a change occured.
156 original_data = list()
157 for param in self._block.get_params():
158 original_data.append(param.get_value())
162 for param in self._block.get_params():
163 new_data.append(param.get_value())
164 return original_data != new_data