diff options
Diffstat (limited to 'grc')
-rw-r--r-- | grc/base/Block.py | 7 | ||||
-rw-r--r-- | grc/base/Port.py | 31 | ||||
-rw-r--r-- | grc/examples/simple/variable_config.grc | 398 | ||||
-rw-r--r-- | grc/examples/xmlrpc/xmlrpc_client.grc | 262 | ||||
-rw-r--r-- | grc/examples/xmlrpc/xmlrpc_server.grc | 750 | ||||
-rw-r--r-- | grc/gui/ActionHandler.py | 34 | ||||
-rw-r--r-- | grc/gui/Actions.py | 28 | ||||
-rw-r--r-- | grc/gui/Bars.py | 6 | ||||
-rw-r--r-- | grc/gui/Block.py | 34 | ||||
-rw-r--r-- | grc/gui/Constants.py | 5 | ||||
-rw-r--r-- | grc/gui/DrawingArea.py | 4 | ||||
-rw-r--r-- | grc/gui/Element.py | 6 | ||||
-rw-r--r-- | grc/gui/FlowGraph.py | 82 | ||||
-rw-r--r-- | grc/gui/Port.py | 76 | ||||
-rw-r--r-- | grc/gui/Preferences.py | 23 | ||||
-rw-r--r-- | grc/gui/Utils.py | 10 | ||||
-rw-r--r-- | grc/python/Block.py | 10 | ||||
-rw-r--r-- | grc/python/FlowGraph.py | 2 | ||||
-rw-r--r-- | grc/python/block.dtd | 7 |
19 files changed, 1352 insertions, 423 deletions
diff --git a/grc/base/Block.py b/grc/base/Block.py index a14ffd92fc..a8a699f29d 100644 --- a/grc/base/Block.py +++ b/grc/base/Block.py @@ -77,6 +77,7 @@ class Block(Element): self._block_wrapper_path = n.find('block_wrapper_path') self._bussify_sink = n.find('bus_sink') self._bussify_source = n.find('bus_source') + self._var_value = n.find('var_value') or '$value' # get list of param tabs n_tabs = n.find('param_tab_order') or None @@ -275,8 +276,10 @@ class Block(Element): tmpl = str(tmpl) if '$' not in tmpl: return tmpl n = dict((p.get_key(), TemplateArg(p)) for p in self.get_params()) - try: return str(Template(tmpl, n)) - except Exception, e: return "-------->\n%s: %s\n<--------"%(e, tmpl) + try: + return str(Template(tmpl, n)) + except Exception as err: + return "Template error: %s\n %s" % (tmpl, err) ############################################## # Controller Modify diff --git a/grc/base/Port.py b/grc/base/Port.py index edc309bf05..34766bb4f8 100644 --- a/grc/base/Port.py +++ b/grc/base/Port.py @@ -36,6 +36,7 @@ class Port(Element): self._name = n['name'] self._key = n['key'] self._type = n['type'] + self._hide = n.find('hide') or '' self._dir = dir def validate(self): @@ -65,15 +66,17 @@ class Port(Element): def get_name(self): number = '' if self.get_type() == 'bus': - busses = filter(lambda a: a._dir == self._dir, self.get_parent().get_ports_gui()); - - number = str(busses.index(self)) + '#' + str(len(self.get_associated_ports())); + busses = filter(lambda a: a._dir == self._dir, self.get_parent().get_ports_gui()) + number = str(busses.index(self)) + '#' + str(len(self.get_associated_ports())) return self._name + number def get_key(self): return self._key def is_sink(self): return self._dir == 'sink' def is_source(self): return self._dir == 'source' def get_type(self): return self.get_parent().resolve_dependencies(self._type) + def get_hide(self): + value = self.get_parent().resolve_dependencies(self._hide).strip().lower() + return False if value in ('false', 'off', '0') else bool(value) def get_connections(self): """ @@ -97,20 +100,18 @@ class Port(Element): def get_associated_ports(self): if not self.get_type() == 'bus': - return [self]; + return [self] else: if self.is_source(): - get_p = self.get_parent().get_sources; - bus_structure = self.get_parent().current_bus_structure['source']; - direc = 'source' + get_ports = self.get_parent().get_sources + bus_structure = self.get_parent().current_bus_structure['source'] else: - get_p = self.get_parent().get_sinks; - bus_structure = self.get_parent().current_bus_structure['sink']; - direc = 'sink' + get_ports = self.get_parent().get_sinks + bus_structure = self.get_parent().current_bus_structure['sink'] - ports = [i for i in get_p() if not i.get_type() == 'bus']; + ports = [i for i in get_ports() if not i.get_type() == 'bus'] if bus_structure: - busses = [i for i in get_p() if i.get_type() == 'bus']; - bus_index = busses.index(self); - ports = filter(lambda a: ports.index(a) in bus_structure[bus_index], ports); - return ports; + busses = [i for i in get_ports() if i.get_type() == 'bus'] + bus_index = busses.index(self) + ports = filter(lambda a: ports.index(a) in bus_structure[bus_index], ports) + return ports diff --git a/grc/examples/simple/variable_config.grc b/grc/examples/simple/variable_config.grc index 0b50b1e5bb..0b60abc813 100644 --- a/grc/examples/simple/variable_config.grc +++ b/grc/examples/simple/variable_config.grc @@ -1,6 +1,6 @@ <?xml version='1.0' encoding='ASCII'?> <flow_graph> - <timestamp>Sat Nov 10 15:20:12 2012</timestamp> + <timestamp>Sat Jul 12 16:15:51 2014</timestamp> <block> <key>options</key> <param> @@ -29,7 +29,7 @@ </param> <param> <key>generate_options</key> - <value>wx_gui</value> + <value>qt_gui</value> </param> <param> <key>category</key> @@ -52,8 +52,12 @@ <value></value> </param> <param> + <key>alias</key> + <value></value> + </param> + <param> <key>_coordinate</key> - <value>(10, 10)</value> + <value>(-1, 2)</value> </param> <param> <key>_rotation</key> @@ -75,8 +79,12 @@ <value>32000</value> </param> <param> + <key>alias</key> + <value></value> + </param> + <param> <key>_coordinate</key> - <value>(10, 170)</value> + <value>(-1, 125)</value> </param> <param> <key>_rotation</key> @@ -84,42 +92,58 @@ </param> </block> <block> - <key>variable_config</key> + <key>analog_sig_source_x</key> <param> <key>id</key> - <value>freq_init</value> + <value>analog_sig_source_x_0</value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> - <key>value</key> - <value>1000</value> - </param> - <param> <key>type</key> - <value>real</value> + <value>complex</value> </param> <param> - <key>config_file</key> - <value>config.conf</value> + <key>samp_rate</key> + <value>samp_rate</value> </param> <param> - <key>section</key> - <value>main</value> + <key>waveform</key> + <value>analog.GR_COS_WAVE</value> </param> <param> - <key>option</key> + <key>freq</key> <value>freq</value> </param> <param> - <key>writeback</key> - <value>freq</value> + <key>amp</key> + <value>1</value> + </param> + <param> + <key>offset</key> + <value>0</value> + </param> + <param> + <key>alias</key> + <value></value> + </param> + <param> + <key>affinity</key> + <value></value> + </param> + <param> + <key>minoutbuf</key> + <value>0</value> + </param> + <param> + <key>maxoutbuf</key> + <value>0</value> </param> <param> <key>_coordinate</key> - <value>(255, 17)</value> + <value>(173, 201)</value> </param> <param> <key>_rotation</key> @@ -127,54 +151,50 @@ </param> </block> <block> - <key>variable_slider</key> + <key>blocks_throttle</key> <param> <key>id</key> - <value>freq</value> + <value>blocks_throttle_0</value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> - <key>label</key> - <value>Frequency (Hz)</value> - </param> - <param> - <key>value</key> - <value>freq_init</value> + <key>type</key> + <value>complex</value> </param> <param> - <key>min</key> - <value>-samp_rate/2</value> + <key>samples_per_second</key> + <value>samp_rate</value> </param> <param> - <key>max</key> - <value>samp_rate/2</value> + <key>vlen</key> + <value>1</value> </param> <param> - <key>num_steps</key> - <value>100</value> + <key>ignoretag</key> + <value>True</value> </param> <param> - <key>style</key> - <value>wx.SL_HORIZONTAL</value> + <key>alias</key> + <value></value> </param> <param> - <key>converver</key> - <value>float_converter</value> + <key>affinity</key> + <value></value> </param> <param> - <key>grid_pos</key> - <value></value> + <key>minoutbuf</key> + <value>0</value> </param> <param> - <key>notebook</key> - <value></value> + <key>maxoutbuf</key> + <value>0</value> </param> <param> <key>_coordinate</key> - <value>(429, 24)</value> + <value>(392, 233)</value> </param> <param> <key>_rotation</key> @@ -182,10 +202,10 @@ </param> </block> <block> - <key>wxgui_fftsink2</key> + <key>qtgui_freq_sink_x</key> <param> <key>id</key> - <value>wxgui_fftsink2_0</value> + <value>qtgui_freq_sink_x_0</value> </param> <param> <key>_enabled</key> @@ -196,76 +216,224 @@ <value>complex</value> </param> <param> - <key>title</key> - <value>FFT Plot</value> + <key>name</key> + <value>QT GUI Plot</value> </param> <param> - <key>samp_rate</key> - <value>samp_rate</value> + <key>fftsize</key> + <value>1024</value> + </param> + <param> + <key>wintype</key> + <value>firdes.WIN_BLACKMAN_hARRIS</value> </param> <param> - <key>baseband_freq</key> + <key>fc</key> <value>0</value> </param> <param> - <key>y_per_div</key> - <value>10</value> + <key>bw</key> + <value>samp_rate</value> + </param> + <param> + <key>autoscale</key> + <value>False</value> </param> <param> - <key>y_divs</key> + <key>average</key> + <value>1.0</value> + </param> + <param> + <key>ymin</key> + <value>-140</value> + </param> + <param> + <key>ymax</key> <value>10</value> </param> <param> - <key>ref_level</key> - <value>50</value> + <key>nconnections</key> + <value>1</value> </param> <param> - <key>ref_scale</key> - <value>2.0</value> + <key>update_time</key> + <value>0.10</value> </param> <param> - <key>fft_size</key> - <value>1024</value> + <key>gui_hint</key> + <value></value> + </param> + <param> + <key>label1</key> + <value></value> </param> <param> - <key>fft_rate</key> - <value>30</value> + <key>width1</key> + <value>1</value> </param> <param> - <key>peak_hold</key> - <value>False</value> + <key>color1</key> + <value>"blue"</value> </param> <param> - <key>average</key> - <value>False</value> + <key>alpha1</key> + <value>1.0</value> </param> <param> - <key>avg_alpha</key> - <value>0</value> + <key>label2</key> + <value></value> + </param> + <param> + <key>width2</key> + <value>1</value> + </param> + <param> + <key>color2</key> + <value>"red"</value> + </param> + <param> + <key>alpha2</key> + <value>1.0</value> + </param> + <param> + <key>label3</key> + <value></value> + </param> + <param> + <key>width3</key> + <value>1</value> + </param> + <param> + <key>color3</key> + <value>"green"</value> + </param> + <param> + <key>alpha3</key> + <value>1.0</value> + </param> + <param> + <key>label4</key> + <value></value> + </param> + <param> + <key>width4</key> + <value>1</value> + </param> + <param> + <key>color4</key> + <value>"black"</value> </param> <param> - <key>win</key> - <value>None</value> + <key>alpha4</key> + <value>1.0</value> </param> <param> - <key>win_size</key> + <key>label5</key> <value></value> </param> <param> - <key>grid_pos</key> + <key>width5</key> + <value>1</value> + </param> + <param> + <key>color5</key> + <value>"cyan"</value> + </param> + <param> + <key>alpha5</key> + <value>1.0</value> + </param> + <param> + <key>label6</key> <value></value> </param> <param> - <key>notebook</key> + <key>width6</key> + <value>1</value> + </param> + <param> + <key>color6</key> + <value>"magenta"</value> + </param> + <param> + <key>alpha6</key> + <value>1.0</value> + </param> + <param> + <key>label7</key> <value></value> </param> <param> - <key>freqvar</key> - <value>None</value> + <key>width7</key> + <value>1</value> + </param> + <param> + <key>color7</key> + <value>"yellow"</value> + </param> + <param> + <key>alpha7</key> + <value>1.0</value> + </param> + <param> + <key>label8</key> + <value></value> + </param> + <param> + <key>width8</key> + <value>1</value> + </param> + <param> + <key>color8</key> + <value>"dark red"</value> + </param> + <param> + <key>alpha8</key> + <value>1.0</value> + </param> + <param> + <key>label9</key> + <value></value> + </param> + <param> + <key>width9</key> + <value>1</value> + </param> + <param> + <key>color9</key> + <value>"dark green"</value> + </param> + <param> + <key>alpha9</key> + <value>1.0</value> + </param> + <param> + <key>label10</key> + <value></value> + </param> + <param> + <key>width10</key> + <value>1</value> + </param> + <param> + <key>color10</key> + <value>"dark blue"</value> + </param> + <param> + <key>alpha10</key> + <value>1.0</value> + </param> + <param> + <key>alias</key> + <value></value> + </param> + <param> + <key>affinity</key> + <value></value> </param> <param> <key>_coordinate</key> - <value>(671, 233)</value> + <value>(643, 221)</value> </param> <param> <key>_rotation</key> @@ -273,30 +441,58 @@ </param> </block> <block> - <key>blocks_throttle</key> + <key>variable_qtgui_range</key> <param> <key>id</key> - <value>blocks_throttle_0</value> + <value>freq</value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> - <key>type</key> - <value>complex</value> + <key>label</key> + <value>Frequency (Hz)</value> </param> <param> - <key>samples_per_second</key> - <value>samp_rate</value> + <key>value</key> + <value>1e3</value> </param> <param> - <key>vlen</key> + <key>start</key> + <value>-samp_rate/2</value> + </param> + <param> + <key>stop</key> + <value>samp_rate/2</value> + </param> + <param> + <key>step</key> <value>1</value> </param> <param> + <key>widget</key> + <value>counter_slider</value> + </param> + <param> + <key>orient</key> + <value>Qt.Horizontal</value> + </param> + <param> + <key>min_len</key> + <value>200</value> + </param> + <param> + <key>gui_hint</key> + <value></value> + </param> + <param> + <key>alias</key> + <value></value> + </param> + <param> <key>_coordinate</key> - <value>(392, 233)</value> + <value>(339, 9)</value> </param> <param> <key>_rotation</key> @@ -304,42 +500,46 @@ </param> </block> <block> - <key>analog_sig_source_x</key> + <key>variable_config</key> <param> <key>id</key> - <value>analog_sig_source_x_0</value> + <value>freq_init</value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> + <key>value</key> + <value>1000</value> + </param> + <param> <key>type</key> - <value>complex</value> + <value>real</value> </param> <param> - <key>samp_rate</key> - <value>samp_rate</value> + <key>config_file</key> + <value>/home/mbant/.gnuradio/config.conf</value> </param> <param> - <key>waveform</key> - <value>analog.GR_COS_WAVE</value> + <key>section</key> + <value>main</value> </param> <param> - <key>freq</key> + <key>option</key> <value>freq</value> </param> <param> - <key>amp</key> - <value>1</value> + <key>writeback</key> + <value>freq</value> </param> <param> - <key>offset</key> - <value>0</value> + <key>alias</key> + <value></value> </param> <param> <key>_coordinate</key> - <value>(173, 201)</value> + <value>(168, 0)</value> </param> <param> <key>_rotation</key> @@ -347,14 +547,14 @@ </param> </block> <connection> - <source_block_id>blocks_throttle_0</source_block_id> - <sink_block_id>wxgui_fftsink2_0</sink_block_id> + <source_block_id>analog_sig_source_x_0</source_block_id> + <sink_block_id>blocks_throttle_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> - <source_block_id>analog_sig_source_x_0</source_block_id> - <sink_block_id>blocks_throttle_0</sink_block_id> + <source_block_id>blocks_throttle_0</source_block_id> + <sink_block_id>qtgui_freq_sink_x_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> diff --git a/grc/examples/xmlrpc/xmlrpc_client.grc b/grc/examples/xmlrpc/xmlrpc_client.grc index 3bb4e7ed3b..45d8af2824 100644 --- a/grc/examples/xmlrpc/xmlrpc_client.grc +++ b/grc/examples/xmlrpc/xmlrpc_client.grc @@ -1,6 +1,6 @@ <?xml version='1.0' encoding='ASCII'?> <flow_graph> - <timestamp>Thu Jul 24 14:27:44 2008</timestamp> + <timestamp>Sat Jul 12 17:10:55 2014</timestamp> <block> <key>options</key> <param> @@ -29,15 +29,101 @@ </param> <param> <key>generate_options</key> - <value>wx_gui</value> + <value>qt_gui</value> </param> <param> <key>category</key> <value>Custom</value> </param> <param> + <key>run_options</key> + <value>prompt</value> + </param> + <param> + <key>run</key> + <value>True</value> + </param> + <param> + <key>max_nouts</key> + <value>0</value> + </param> + <param> + <key>realtime_scheduling</key> + <value></value> + </param> + <param> + <key>alias</key> + <value></value> + </param> + <param> + <key>_coordinate</key> + <value>(-2, 0)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>variable</key> + <param> + <key>id</key> + <value>samp_rate</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>value</key> + <value>32000</value> + </param> + <param> + <key>alias</key> + <value></value> + </param> + <param> + <key>_coordinate</key> + <value>(13, 172)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>xmlrpc_client</key> + <param> + <key>id</key> + <value>xmlrpc_client</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>addr</key> + <value>localhost</value> + </param> + <param> + <key>port</key> + <value>1234</value> + </param> + <param> + <key>callback</key> + <value>set_freq</value> + </param> + <param> + <key>variable</key> + <value>freq</value> + </param> + <param> + <key>alias</key> + <value></value> + </param> + <param> <key>_coordinate</key> - <value>(10, 10)</value> + <value>(177, 0)</value> </param> <param> <key>_rotation</key> @@ -71,8 +157,12 @@ <value>ampl</value> </param> <param> + <key>alias</key> + <value></value> + </param> + <param> <key>_coordinate</key> - <value>(409, 35)</value> + <value>(308, 0)</value> </param> <param> <key>_rotation</key> @@ -83,7 +173,7 @@ <key>xmlrpc_client</key> <param> <key>id</key> - <value>xmlrpc_client</value> + <value>xmlrpc_client1</value> </param> <param> <key>_enabled</key> @@ -99,15 +189,19 @@ </param> <param> <key>callback</key> - <value>set_freq</value> + <value>set_offset</value> </param> <param> <key>variable</key> - <value>freq</value> + <value>offset*ampl</value> + </param> + <param> + <key>alias</key> + <value></value> </param> <param> <key>_coordinate</key> - <value>(222, 34)</value> + <value>(440, 4)</value> </param> <param> <key>_rotation</key> @@ -115,7 +209,7 @@ </param> </block> <block> - <key>variable_slider</key> + <key>variable_qtgui_range</key> <param> <key>id</key> <value>freq</value> @@ -133,28 +227,40 @@ <value>1000</value> </param> <param> - <key>min</key> + <key>start</key> <value>0</value> </param> <param> - <key>max</key> - <value>5000</value> + <key>stop</key> + <value>5e3</value> + </param> + <param> + <key>step</key> + <value>1</value> </param> <param> - <key>num_steps</key> - <value>100</value> + <key>widget</key> + <value>counter_slider</value> </param> <param> - <key>slider_type</key> - <value>horizontal</value> + <key>orient</key> + <value>Qt.Horizontal</value> </param> <param> - <key>grid_pos</key> - <value>0, 0, 1, 2</value> + <key>min_len</key> + <value>200</value> + </param> + <param> + <key>gui_hint</key> + <value>0,0,1,2</value> + </param> + <param> + <key>alias</key> + <value></value> </param> <param> <key>_coordinate</key> - <value>(207, 162)</value> + <value>(209, 165)</value> </param> <param> <key>_rotation</key> @@ -162,7 +268,7 @@ </param> </block> <block> - <key>variable_slider</key> + <key>variable_qtgui_range</key> <param> <key>id</key> <value>ampl</value> @@ -180,28 +286,40 @@ <value>1</value> </param> <param> - <key>min</key> + <key>start</key> <value>0</value> </param> <param> - <key>max</key> + <key>stop</key> <value>2</value> </param> <param> - <key>num_steps</key> - <value>100</value> + <key>step</key> + <value>.1</value> + </param> + <param> + <key>widget</key> + <value>counter_slider</value> </param> <param> - <key>slider_type</key> - <value>horizontal</value> + <key>orient</key> + <value>Qt.Horizontal</value> </param> <param> - <key>grid_pos</key> - <value>1, 0, 1, 2</value> + <key>min_len</key> + <value>200</value> + </param> + <param> + <key>gui_hint</key> + <value>1,0,1,2</value> + </param> + <param> + <key>alias</key> + <value></value> </param> <param> <key>_coordinate</key> - <value>(397, 167)</value> + <value>(367, 158)</value> </param> <param> <key>_rotation</key> @@ -209,7 +327,7 @@ </param> </block> <block> - <key>variable_chooser</key> + <key>variable_qtgui_chooser</key> <param> <key>id</key> <value>offset</value> @@ -223,90 +341,88 @@ <value>Offset</value> </param> <param> - <key>value_index</key> - <value>1</value> + <key>type</key> + <value>int</value> </param> <param> - <key>choices</key> - <value>[-1, 0, 1]</value> + <key>num_opts</key> + <value>3</value> </param> <param> - <key>labels</key> - <value>["neg", "zero", "pos"]</value> + <key>value</key> + <value>0</value> </param> <param> - <key>chooser_type</key> - <value>radio_buttons_horizontal</value> + <key>options</key> + <value>[0, 1, 2]</value> </param> <param> - <key>grid_pos</key> - <value>2, 0, 1, 2</value> + <key>labels</key> + <value>[]</value> </param> <param> - <key>_coordinate</key> - <value>(596, 177)</value> + <key>option0</key> + <value>-1</value> </param> <param> - <key>_rotation</key> + <key>label0</key> + <value>neg</value> + </param> + <param> + <key>option1</key> <value>0</value> </param> - </block> - <block> - <key>xmlrpc_client</key> <param> - <key>id</key> - <value>xmlrpc_client1</value> + <key>label1</key> + <value>zero</value> </param> <param> - <key>_enabled</key> - <value>True</value> + <key>option2</key> + <value>1</value> </param> <param> - <key>addr</key> - <value>localhost</value> + <key>label2</key> + <value>pos</value> </param> <param> - <key>port</key> - <value>1234</value> + <key>option3</key> + <value>3</value> </param> <param> - <key>callback</key> - <value>set_offset</value> + <key>label3</key> + <value></value> </param> <param> - <key>variable</key> - <value>offset*ampl</value> + <key>option4</key> + <value>4</value> </param> <param> - <key>_coordinate</key> - <value>(608, 39)</value> + <key>label4</key> + <value></value> </param> <param> - <key>_rotation</key> - <value>0</value> + <key>widget</key> + <value>combo_box</value> </param> - </block> - <block> - <key>variable</key> <param> - <key>id</key> - <value>samp_rate</value> + <key>orient</key> + <value>Qt.QVBoxLayout</value> </param> <param> - <key>_enabled</key> - <value>True</value> + <key>gui_hint</key> + <value>2,0,1,2</value> </param> <param> - <key>value</key> - <value>32000</value> + <key>alias</key> + <value></value> </param> <param> <key>_coordinate</key> - <value>(13, 172)</value> + <value>(531, 145)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> </block> -</flow_graph>
\ No newline at end of file +</flow_graph> diff --git a/grc/examples/xmlrpc/xmlrpc_server.grc b/grc/examples/xmlrpc/xmlrpc_server.grc index 3a133fd7c4..d210b2694e 100644 --- a/grc/examples/xmlrpc/xmlrpc_server.grc +++ b/grc/examples/xmlrpc/xmlrpc_server.grc @@ -1,6 +1,6 @@ <?xml version='1.0' encoding='ASCII'?> <flow_graph> - <timestamp>Sat Nov 10 15:20:55 2012</timestamp> + <timestamp>Sat Jul 12 17:11:40 2014</timestamp> <block> <key>options</key> <param> @@ -29,7 +29,7 @@ </param> <param> <key>generate_options</key> - <value>wx_gui</value> + <value>qt_gui</value> </param> <param> <key>category</key> @@ -52,8 +52,12 @@ <value></value> </param> <param> + <key>alias</key> + <value></value> + </param> + <param> <key>_coordinate</key> - <value>(10, 10)</value> + <value>(0, -1)</value> </param> <param> <key>_rotation</key> @@ -64,7 +68,7 @@ <key>variable</key> <param> <key>id</key> - <value>offset</value> + <value>ampl</value> </param> <param> <key>_enabled</key> @@ -72,11 +76,42 @@ </param> <param> <key>value</key> + <value>1</value> + </param> + <param> + <key>alias</key> + <value></value> + </param> + <param> + <key>_coordinate</key> + <value>(4, 291)</value> + </param> + <param> + <key>_rotation</key> <value>0</value> </param> + </block> + <block> + <key>variable</key> + <param> + <key>id</key> + <value>freq</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>value</key> + <value>1000</value> + </param> + <param> + <key>alias</key> + <value></value> + </param> <param> <key>_coordinate</key> - <value>(12, 390)</value> + <value>(2, 213)</value> </param> <param> <key>_rotation</key> @@ -84,26 +119,26 @@ </param> </block> <block> - <key>xmlrpc_server</key> + <key>variable</key> <param> <key>id</key> - <value>xmlrpc_server</value> + <value>samp_rate</value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> - <key>addr</key> - <value>localhost</value> + <key>value</key> + <value>32000</value> </param> <param> - <key>port</key> - <value>1234</value> + <key>alias</key> + <value></value> </param> <param> <key>_coordinate</key> - <value>(395, 240)</value> + <value>(2, 136)</value> </param> <param> <key>_rotation</key> @@ -111,74 +146,136 @@ </param> </block> <block> - <key>wxgui_scopesink2</key> + <key>variable</key> <param> <key>id</key> - <value>wxgui_scopesink2</value> + <value>offset</value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> - <key>type</key> - <value>float</value> + <key>value</key> + <value>0</value> </param> <param> - <key>title</key> - <value>Scope Plot</value> + <key>alias</key> + <value></value> + </param> + <param> + <key>_coordinate</key> + <value>(3, 366)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>analog_sig_source_x</key> + <param> + <key>id</key> + <value>analog_sig_source_x_0</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>type</key> + <value>float</value> </param> <param> <key>samp_rate</key> <value>samp_rate</value> </param> <param> - <key>v_scale</key> + <key>waveform</key> + <value>analog.GR_COS_WAVE</value> + </param> + <param> + <key>freq</key> + <value>freq</value> + </param> + <param> + <key>amp</key> + <value>ampl</value> + </param> + <param> + <key>offset</key> + <value>offset</value> + </param> + <param> + <key>alias</key> + <value></value> + </param> + <param> + <key>affinity</key> + <value></value> + </param> + <param> + <key>minoutbuf</key> <value>0</value> </param> <param> - <key>v_offset</key> + <key>maxoutbuf</key> <value>0</value> </param> <param> - <key>t_scale</key> - <value>.001</value> + <key>_coordinate</key> + <value>(175, 0)</value> </param> <param> - <key>ac_couple</key> - <value>False</value> + <key>_rotation</key> + <value>0</value> </param> + </block> + <block> + <key>blocks_throttle</key> <param> - <key>xy_mode</key> - <value>False</value> + <key>id</key> + <value>blocks_throttle</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> </param> <param> - <key>num_inputs</key> + <key>type</key> + <value>float</value> + </param> + <param> + <key>samples_per_second</key> + <value>samp_rate</value> + </param> + <param> + <key>vlen</key> <value>1</value> </param> <param> - <key>win_size</key> - <value></value> + <key>ignoretag</key> + <value>True</value> </param> <param> - <key>grid_pos</key> - <value>0, 0, 2, 4</value> + <key>alias</key> + <value></value> </param> <param> - <key>notebook</key> + <key>affinity</key> <value></value> </param> <param> - <key>trig_mode</key> - <value>wxgui.TRIG_MODE_AUTO</value> + <key>minoutbuf</key> + <value>0</value> </param> <param> - <key>y_axis_label</key> - <value>Counts</value> + <key>maxoutbuf</key> + <value>0</value> </param> <param> <key>_coordinate</key> - <value>(623, 28)</value> + <value>(399, 35)</value> </param> <param> <key>_rotation</key> @@ -186,10 +283,41 @@ </param> </block> <block> - <key>wxgui_fftsink2</key> + <key>xmlrpc_server</key> <param> <key>id</key> - <value>wxgui_fftsink2</value> + <value>xmlrpc_server</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>addr</key> + <value>localhost</value> + </param> + <param> + <key>port</key> + <value>1234</value> + </param> + <param> + <key>alias</key> + <value></value> + </param> + <param> + <key>_coordinate</key> + <value>(129, 137)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>qtgui_time_sink_x</key> + <param> + <key>id</key> + <value>qtgui_time_sink_x_0</value> </param> <param> <key>_enabled</key> @@ -200,176 +328,320 @@ <value>float</value> </param> <param> - <key>title</key> - <value>FFT Plot</value> + <key>name</key> + <value>Scope Plot</value> </param> <param> - <key>samp_rate</key> + <key>size</key> + <value>1024</value> + </param> + <param> + <key>srate</key> <value>samp_rate</value> </param> <param> - <key>baseband_freq</key> - <value>0</value> + <key>autoscale</key> + <value>False</value> </param> <param> - <key>y_per_div</key> - <value>10</value> + <key>ymin</key> + <value>-1</value> </param> <param> - <key>y_divs</key> - <value>8</value> + <key>ymax</key> + <value>1</value> </param> <param> - <key>ref_level</key> - <value>50</value> + <key>nconnections</key> + <value>1</value> </param> <param> - <key>ref_scale</key> - <value>2.0</value> + <key>update_time</key> + <value>0.10</value> </param> <param> - <key>fft_size</key> - <value>512</value> + <key>entags</key> + <value>True</value> </param> <param> - <key>fft_rate</key> - <value>15</value> + <key>gui_hint</key> + <value>0, 0, 2, 4</value> </param> <param> - <key>peak_hold</key> - <value>False</value> + <key>tr_mode</key> + <value>qtgui.TRIG_MODE_FREE</value> </param> <param> - <key>average</key> - <value>False</value> + <key>tr_slope</key> + <value>qtgui.TRIG_SLOPE_POS</value> </param> <param> - <key>avg_alpha</key> + <key>tr_level</key> + <value>0.0</value> + </param> + <param> + <key>tr_delay</key> <value>0</value> </param> <param> - <key>win</key> - <value>None</value> + <key>tr_chan</key> + <value>0</value> </param> <param> - <key>win_size</key> + <key>tr_tag</key> + <value>""</value> + </param> + <param> + <key>label1</key> <value></value> </param> <param> - <key>grid_pos</key> - <value>2, 0, 2, 4</value> + <key>width1</key> + <value>1</value> </param> <param> - <key>notebook</key> + <key>color1</key> + <value>"blue"</value> + </param> + <param> + <key>style1</key> + <value>1</value> + </param> + <param> + <key>marker1</key> + <value>-1</value> + </param> + <param> + <key>alpha1</key> + <value>1.0</value> + </param> + <param> + <key>label2</key> <value></value> </param> <param> - <key>freqvar</key> - <value>None</value> + <key>width2</key> + <value>1</value> </param> <param> - <key>_coordinate</key> - <value>(630, 233)</value> + <key>color2</key> + <value>"red"</value> </param> <param> - <key>_rotation</key> - <value>0</value> + <key>style2</key> + <value>1</value> </param> - </block> - <block> - <key>variable</key> <param> - <key>id</key> - <value>samp_rate</value> + <key>marker2</key> + <value>-1</value> </param> <param> - <key>_enabled</key> - <value>True</value> + <key>alpha2</key> + <value>1.0</value> </param> <param> - <key>value</key> - <value>32000</value> + <key>label3</key> + <value></value> </param> <param> - <key>_coordinate</key> - <value>(11, 160)</value> + <key>width3</key> + <value>1</value> </param> <param> - <key>_rotation</key> - <value>0</value> + <key>color3</key> + <value>"green"</value> </param> - </block> - <block> - <key>variable</key> <param> - <key>id</key> - <value>freq</value> + <key>style3</key> + <value>1</value> </param> <param> - <key>_enabled</key> - <value>True</value> + <key>marker3</key> + <value>-1</value> </param> <param> - <key>value</key> - <value>1000</value> + <key>alpha3</key> + <value>1.0</value> </param> <param> - <key>_coordinate</key> - <value>(11, 237)</value> + <key>label4</key> + <value></value> </param> <param> - <key>_rotation</key> - <value>0</value> + <key>width4</key> + <value>1</value> </param> - </block> - <block> - <key>variable</key> <param> - <key>id</key> - <value>ampl</value> + <key>color4</key> + <value>"black"</value> </param> <param> - <key>_enabled</key> - <value>True</value> + <key>style4</key> + <value>1</value> </param> <param> - <key>value</key> + <key>marker4</key> + <value>-1</value> + </param> + <param> + <key>alpha4</key> + <value>1.0</value> + </param> + <param> + <key>label5</key> + <value></value> + </param> + <param> + <key>width5</key> <value>1</value> </param> <param> - <key>_coordinate</key> - <value>(13, 315)</value> + <key>color5</key> + <value>"cyan"</value> </param> <param> - <key>_rotation</key> - <value>0</value> + <key>style5</key> + <value>1</value> </param> - </block> - <block> - <key>blocks_throttle</key> <param> - <key>id</key> - <value>blocks_throttle</value> + <key>marker5</key> + <value>-1</value> </param> <param> - <key>_enabled</key> - <value>True</value> + <key>alpha5</key> + <value>1.0</value> </param> <param> - <key>type</key> - <value>float</value> + <key>label6</key> + <value></value> </param> <param> - <key>samples_per_second</key> - <value>samp_rate</value> + <key>width6</key> + <value>1</value> </param> <param> - <key>vlen</key> + <key>color6</key> + <value>"magenta"</value> + </param> + <param> + <key>style6</key> <value>1</value> </param> <param> + <key>marker6</key> + <value>-1</value> + </param> + <param> + <key>alpha6</key> + <value>1.0</value> + </param> + <param> + <key>label7</key> + <value></value> + </param> + <param> + <key>width7</key> + <value>1</value> + </param> + <param> + <key>color7</key> + <value>"yellow"</value> + </param> + <param> + <key>style7</key> + <value>1</value> + </param> + <param> + <key>marker7</key> + <value>-1</value> + </param> + <param> + <key>alpha7</key> + <value>1.0</value> + </param> + <param> + <key>label8</key> + <value></value> + </param> + <param> + <key>width8</key> + <value>1</value> + </param> + <param> + <key>color8</key> + <value>"dark red"</value> + </param> + <param> + <key>style8</key> + <value>1</value> + </param> + <param> + <key>marker8</key> + <value>-1</value> + </param> + <param> + <key>alpha8</key> + <value>1.0</value> + </param> + <param> + <key>label9</key> + <value></value> + </param> + <param> + <key>width9</key> + <value>1</value> + </param> + <param> + <key>color9</key> + <value>"dark green"</value> + </param> + <param> + <key>style9</key> + <value>1</value> + </param> + <param> + <key>marker9</key> + <value>-1</value> + </param> + <param> + <key>alpha9</key> + <value>1.0</value> + </param> + <param> + <key>label10</key> + <value></value> + </param> + <param> + <key>width10</key> + <value>1</value> + </param> + <param> + <key>color10</key> + <value>"blue"</value> + </param> + <param> + <key>style10</key> + <value>1</value> + </param> + <param> + <key>marker10</key> + <value>-1</value> + </param> + <param> + <key>alpha10</key> + <value>1.0</value> + </param> + <param> + <key>alias</key> + <value></value> + </param> + <param> + <key>affinity</key> + <value></value> + </param> + <param> <key>_coordinate</key> - <value>(386, 93)</value> + <value>(644, 13)</value> </param> <param> <key>_rotation</key> @@ -377,10 +649,10 @@ </param> </block> <block> - <key>analog_sig_source_x</key> + <key>qtgui_freq_sink_x</key> <param> <key>id</key> - <value>analog_sig_source_x_0</value> + <value>qtgui_freq_sink_x_0</value> </param> <param> <key>_enabled</key> @@ -391,28 +663,224 @@ <value>float</value> </param> <param> - <key>samp_rate</key> + <key>name</key> + <value>Spectrum Plot</value> + </param> + <param> + <key>fftsize</key> + <value>1024</value> + </param> + <param> + <key>wintype</key> + <value>firdes.WIN_BLACKMAN_hARRIS</value> + </param> + <param> + <key>fc</key> + <value>0</value> + </param> + <param> + <key>bw</key> <value>samp_rate</value> </param> <param> - <key>waveform</key> - <value>analog.GR_COS_WAVE</value> + <key>autoscale</key> + <value>False</value> </param> <param> - <key>freq</key> - <value>freq</value> + <key>average</key> + <value>1.0</value> </param> <param> - <key>amp</key> - <value>ampl</value> + <key>ymin</key> + <value>-140</value> </param> <param> - <key>offset</key> - <value>offset</value> + <key>ymax</key> + <value>10</value> + </param> + <param> + <key>nconnections</key> + <value>1</value> + </param> + <param> + <key>update_time</key> + <value>0.10</value> + </param> + <param> + <key>gui_hint</key> + <value>2, 0, 2, 4</value> + </param> + <param> + <key>label1</key> + <value></value> + </param> + <param> + <key>width1</key> + <value>1</value> + </param> + <param> + <key>color1</key> + <value>"blue"</value> + </param> + <param> + <key>alpha1</key> + <value>1.0</value> + </param> + <param> + <key>label2</key> + <value></value> + </param> + <param> + <key>width2</key> + <value>1</value> + </param> + <param> + <key>color2</key> + <value>"red"</value> + </param> + <param> + <key>alpha2</key> + <value>1.0</value> + </param> + <param> + <key>label3</key> + <value></value> + </param> + <param> + <key>width3</key> + <value>1</value> + </param> + <param> + <key>color3</key> + <value>"green"</value> + </param> + <param> + <key>alpha3</key> + <value>1.0</value> + </param> + <param> + <key>label4</key> + <value></value> + </param> + <param> + <key>width4</key> + <value>1</value> + </param> + <param> + <key>color4</key> + <value>"black"</value> + </param> + <param> + <key>alpha4</key> + <value>1.0</value> + </param> + <param> + <key>label5</key> + <value></value> + </param> + <param> + <key>width5</key> + <value>1</value> + </param> + <param> + <key>color5</key> + <value>"cyan"</value> + </param> + <param> + <key>alpha5</key> + <value>1.0</value> + </param> + <param> + <key>label6</key> + <value></value> + </param> + <param> + <key>width6</key> + <value>1</value> + </param> + <param> + <key>color6</key> + <value>"magenta"</value> + </param> + <param> + <key>alpha6</key> + <value>1.0</value> + </param> + <param> + <key>label7</key> + <value></value> + </param> + <param> + <key>width7</key> + <value>1</value> + </param> + <param> + <key>color7</key> + <value>"yellow"</value> + </param> + <param> + <key>alpha7</key> + <value>1.0</value> + </param> + <param> + <key>label8</key> + <value></value> + </param> + <param> + <key>width8</key> + <value>1</value> + </param> + <param> + <key>color8</key> + <value>"dark red"</value> + </param> + <param> + <key>alpha8</key> + <value>1.0</value> + </param> + <param> + <key>label9</key> + <value></value> + </param> + <param> + <key>width9</key> + <value>1</value> + </param> + <param> + <key>color9</key> + <value>"dark green"</value> + </param> + <param> + <key>alpha9</key> + <value>1.0</value> + </param> + <param> + <key>label10</key> + <value></value> + </param> + <param> + <key>width10</key> + <value>1</value> + </param> + <param> + <key>color10</key> + <value>"dark blue"</value> + </param> + <param> + <key>alpha10</key> + <value>1.0</value> + </param> + <param> + <key>alias</key> + <value></value> + </param> + <param> + <key>affinity</key> + <value></value> </param> <param> <key>_coordinate</key> - <value>(164, 154)</value> + <value>(644, 126)</value> </param> <param> <key>_rotation</key> @@ -420,20 +888,20 @@ </param> </block> <connection> - <source_block_id>blocks_throttle</source_block_id> - <sink_block_id>wxgui_scopesink2</sink_block_id> + <source_block_id>analog_sig_source_x_0</source_block_id> + <sink_block_id>blocks_throttle</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>blocks_throttle</source_block_id> - <sink_block_id>wxgui_fftsink2</sink_block_id> + <sink_block_id>qtgui_time_sink_x_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> - <source_block_id>analog_sig_source_x_0</source_block_id> - <sink_block_id>blocks_throttle</sink_block_id> + <source_block_id>blocks_throttle</source_block_id> + <sink_block_id>qtgui_freq_sink_x_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> diff --git a/grc/gui/ActionHandler.py b/grc/gui/ActionHandler.py index 2c1c9942d7..dcc3c846eb 100644 --- a/grc/gui/ActionHandler.py +++ b/grc/gui/ActionHandler.py @@ -118,6 +118,7 @@ class ActionHandler: Actions.TYPES_WINDOW_DISPLAY, Actions.TOGGLE_BLOCKS_WINDOW, Actions.TOGGLE_REPORTS_WINDOW, Actions.TOGGLE_HIDE_DISABLED_BLOCKS, Actions.TOOLS_RUN_FDESIGN, Actions.TOGGLE_SCROLL_LOCK, Actions.CLEAR_REPORTS, + Actions.TOGGLE_AUTO_HIDE_PORT_LABELS, Actions.TOGGLE_SNAP_TO_GRID ): action.set_sensitive(True) if ParseXML.xml_failures: Messages.send_xml_errors_if_any(ParseXML.xml_failures) @@ -133,9 +134,13 @@ class ActionHandler: if not self.get_page(): self.main_window.new_page() #ensure that at least a blank page exists self.main_window.btwin.search_entry.hide() - Actions.TOGGLE_REPORTS_WINDOW.set_active(Preferences.reports_window_visibility()) - Actions.TOGGLE_BLOCKS_WINDOW.set_active(Preferences.blocks_window_visibility()) - Actions.TOGGLE_SCROLL_LOCK.set_active(Preferences.scroll_lock()) + for action in ( + Actions.TOGGLE_REPORTS_WINDOW, + Actions.TOGGLE_BLOCKS_WINDOW, + Actions.TOGGLE_AUTO_HIDE_PORT_LABELS, + Actions.TOGGLE_SCROLL_LOCK, + Actions.TOGGLE_SNAP_TO_GRID + ): action.load_from_preferences() elif action == Actions.APPLICATION_QUIT: if self.main_window.close_pages(): gtk.main_quit() @@ -361,28 +366,32 @@ class ActionHandler: elif action == Actions.ERRORS_WINDOW_DISPLAY: Dialogs.ErrorsDialog(self.get_flow_graph()) elif action == Actions.TOGGLE_REPORTS_WINDOW: - visible = action.get_active() - if visible: + if action.get_active(): self.main_window.reports_scrolled_window.show() else: self.main_window.reports_scrolled_window.hide() - Preferences.reports_window_visibility(visible) + action.save_to_preferences() elif action == Actions.TOGGLE_BLOCKS_WINDOW: - visible = action.get_active() - if visible: + if action.get_active(): self.main_window.btwin.show() else: self.main_window.btwin.hide() - Preferences.blocks_window_visibility(visible) + action.save_to_preferences() elif action == Actions.TOGGLE_SCROLL_LOCK: - visible = action.get_active() - self.main_window.text_display.scroll_lock = visible - if visible: + active = action.get_active() + self.main_window.text_display.scroll_lock = active + if active: self.main_window.text_display.scroll_to_end() + action.save_to_preferences() elif action == Actions.CLEAR_REPORTS: self.main_window.text_display.clear() elif action == Actions.TOGGLE_HIDE_DISABLED_BLOCKS: Actions.NOTHING_SELECT() + elif action == Actions.TOGGLE_AUTO_HIDE_PORT_LABELS: + action.save_to_preferences() + self.main_window.get_flow_graph().create_shapes() + elif action == Actions.TOGGLE_SNAP_TO_GRID: + action.save_to_preferences() ################################################## # Param Modifications ################################################## @@ -492,7 +501,6 @@ class ActionHandler: self.main_window.btwin.search_entry.show() self.main_window.btwin.search_entry.grab_focus() elif action == Actions.OPEN_HIER: - bn = []; for b in self.get_flow_graph().get_selected_blocks(): if b._grc_source: self.main_window.new_page(b._grc_source, show=True) diff --git a/grc/gui/Actions.py b/grc/gui/Actions.py index a9ab41230d..c41798aab8 100644 --- a/grc/gui/Actions.py +++ b/grc/gui/Actions.py @@ -21,6 +21,8 @@ import pygtk pygtk.require('2.0') import gtk +import Preferences + NO_MODS_MASK = 0 ######################################################################## @@ -127,7 +129,7 @@ class ToggleAction(gtk.ToggleAction, _ActionBase): Pass additional arguments such as keypresses. """ - def __init__(self, keypresses=(), name=None, label=None, tooltip=None, stock_id=None): + def __init__(self, keypresses=(), name=None, label=None, tooltip=None, stock_id=None, preference_name=None): """ Create a new ToggleAction instance. @@ -142,6 +144,15 @@ class ToggleAction(gtk.ToggleAction, _ActionBase): ) #register this action _ActionBase.__init__(self, label, keypresses) + self.preference_name = preference_name + + def load_from_preferences(self): + if self.preference_name is not None: + self.set_active(Preferences.bool_entry(self.preference_name)) + + def save_to_preferences(self): + if self.preference_name is not None: + Preferences.bool_entry(self.preference_name, self.get_active()) ######################################################################## # Actions @@ -236,12 +247,22 @@ BLOCK_DISABLE = Action( stock_id=gtk.STOCK_DISCONNECT, keypresses=(gtk.keysyms.d, NO_MODS_MASK), ) +TOGGLE_SNAP_TO_GRID = ToggleAction( + label='_Snap to grid', + tooltip='Snap blocks to a grid for an easier connection alignment', + preference_name='snap_to_grid' +) TOGGLE_HIDE_DISABLED_BLOCKS = ToggleAction( label='Hide _disabled blocks', tooltip='Toggle visibility of disabled blocks and connections', stock_id=gtk.STOCK_MISSING_IMAGE, keypresses=(gtk.keysyms.d, gtk.gdk.CONTROL_MASK), ) +TOGGLE_AUTO_HIDE_PORT_LABELS = ToggleAction( + label='Auto-hide port _labels', + tooltip='Automatically hide port labels', + preference_name='auto_hide_port_labels' +) BLOCK_CREATE_HIER = Action( label='C_reate Hier', tooltip='Create hier block from selected blocks', @@ -275,15 +296,18 @@ TOGGLE_REPORTS_WINDOW = ToggleAction( label='Show _Reports', tooltip='Toggle visibility of the Report widget', keypresses=(gtk.keysyms.r, gtk.gdk.CONTROL_MASK), + preference_name='reports_window_visible' ) TOGGLE_BLOCKS_WINDOW = ToggleAction( label='Show _Block Tree', tooltip='Toggle visibility of the block tree widget', keypresses=(gtk.keysyms.b, gtk.gdk.CONTROL_MASK), + preference_name='blocks_window_visible' ) TOGGLE_SCROLL_LOCK = ToggleAction( label='_Reports Scroll Lock', tooltip='Toggle scroll lock for the report window', + preference_name='scroll_lock' ) ABOUT_WINDOW_DISPLAY = Action( label='_About', @@ -310,7 +334,7 @@ FLOW_GRAPH_GEN = Action( FLOW_GRAPH_EXEC = Action( label='_Execute', tooltip='Execute the flow graph', - stock_id=gtk.STOCK_EXECUTE, + stock_id=gtk.STOCK_MEDIA_PLAY, keypresses=(gtk.keysyms.F6, NO_MODS_MASK), ) FLOW_GRAPH_KILL = Action( diff --git a/grc/gui/Bars.py b/grc/gui/Bars.py index 11e35c992b..743345200e 100644 --- a/grc/gui/Bars.py +++ b/grc/gui/Bars.py @@ -97,10 +97,14 @@ MENU_BAR_LIST = ( Actions.TOGGLE_SCROLL_LOCK, Actions.CLEAR_REPORTS, None, + Actions.TOGGLE_HIDE_DISABLED_BLOCKS, + Actions.TOGGLE_AUTO_HIDE_PORT_LABELS, + Actions.TOGGLE_SNAP_TO_GRID, + None, Actions.ERRORS_WINDOW_DISPLAY, Actions.FIND_BLOCKS, ]), - (gtk.Action('Build', '_Build', None, None), [ + (gtk.Action('Run', '_Run', None, None), [ Actions.FLOW_GRAPH_GEN, Actions.FLOW_GRAPH_EXEC, Actions.FLOW_GRAPH_KILL, diff --git a/grc/gui/Block.py b/grc/gui/Block.py index 49c0361eb9..0ae624f94f 100644 --- a/grc/gui/Block.py +++ b/grc/gui/Block.py @@ -26,6 +26,7 @@ from Constants import \ BLOCK_LABEL_PADDING, \ PORT_SEPARATION, LABEL_SEPARATION, \ PORT_BORDER_SEPARATION, POSSIBLE_ROTATIONS +import Actions import pygtk pygtk.require('2.0') import gtk @@ -43,6 +44,8 @@ class Block(Element): Block contructor. Add graphics related params to the block. """ + self.W = 0 + self.H = 0 #add the position param self.get_params().append(self.get_parent().get_parent().Param( block=self, @@ -97,6 +100,12 @@ class Block(Element): Args: coor: the coordinate tuple (x, y) """ + if Actions.TOGGLE_SNAP_TO_GRID.get_active(): + offset_x, offset_y = (0, self.H/2) if self.is_horizontal() else (self.H/2, 0) + coor = ( + Utils.align_to_grid(coor[0] + offset_x) - offset_x, + Utils.align_to_grid(coor[1] + offset_y) - offset_y + ) self.get_param('_coordinate').set_value(str(coor)) def get_rotation(self): @@ -174,13 +183,23 @@ class Block(Element): Utils.rotate_pixmap(gc, self.horizontal_label, self.vertical_label) #calculate width and height needed self.W = self.label_width + 2*BLOCK_LABEL_PADDING + def get_min_height_for_ports(): + visible_ports = filter(lambda p: not p.get_hide(), ports) + H = 2*PORT_BORDER_SEPARATION + len(visible_ports) * PORT_SEPARATION + if visible_ports: H -= ports[0].H + return H self.H = max(*( - [self.label_height+2*BLOCK_LABEL_PADDING] + [2*PORT_BORDER_SEPARATION + \ - sum([port.H + PORT_SEPARATION for port in ports]) - PORT_SEPARATION - for ports in (self.get_sources_gui(), self.get_sinks_gui())] + - [4*PORT_BORDER_SEPARATION + \ - sum([(port.H) + PORT_SEPARATION for port in ports]) - PORT_SEPARATION - for ports in ([i for i in self.get_sources_gui() if i.get_type() == 'bus'], [i for i in self.get_sinks_gui() if i.get_type() == 'bus'])] + [ # labels + self.label_height + 2 * BLOCK_LABEL_PADDING + ] + + [ # ports + get_min_height_for_ports() for ports in (self.get_sources_gui(), self.get_sinks_gui()) + ] + + [ # bus ports only + 4 * PORT_BORDER_SEPARATION + + sum([port.H + PORT_SEPARATION for port in ports if port.get_type() == 'bus']) - PORT_SEPARATION + for ports in (self.get_sources_gui(), self.get_sinks_gui()) + ] )) def draw(self, gc, window): @@ -205,7 +224,8 @@ class Block(Element): window.draw_drawable(gc, self.vertical_label, 0, 0, x+(self.H-self.label_height)/2, y+BLOCK_LABEL_PADDING, -1, -1) #draw ports for port in self.get_ports_gui(): - port.draw(gc, window) + if not port.get_hide(): + port.draw(gc, window) def what_is_selected(self, coor, coor_m=None): """ diff --git a/grc/gui/Constants.py b/grc/gui/Constants.py index 7fabcfc0a0..c82449b6b6 100644 --- a/grc/gui/Constants.py +++ b/grc/gui/Constants.py @@ -53,7 +53,7 @@ BLOCK_LABEL_PADDING = 7 PORT_LABEL_PADDING = 2 #port constraint dimensions -PORT_SEPARATION = 17 +PORT_SEPARATION = 32 PORT_BORDER_SEPARATION = 9 PORT_MIN_WIDTH = 20 @@ -81,3 +81,6 @@ SCROLL_DISTANCE = 15 #How close the mouse click can be to a line and register a connection select. LINE_SELECT_SENSITIVITY = 5 + +# canvas grid size +CANVAS_GRID_SIZE = 8
\ No newline at end of file diff --git a/grc/gui/DrawingArea.py b/grc/gui/DrawingArea.py index 448948e7f4..d22a2c6d5f 100644 --- a/grc/gui/DrawingArea.py +++ b/grc/gui/DrawingArea.py @@ -37,6 +37,7 @@ class DrawingArea(gtk.DrawingArea): main_window: the main_window containing all flow graphs """ self.ctrl_mask = False + self.mod1_mask = False self._flow_graph = flow_graph gtk.DrawingArea.__init__(self) self.set_size_request(MIN_WINDOW_WIDTH, MIN_WINDOW_HEIGHT) @@ -88,6 +89,7 @@ class DrawingArea(gtk.DrawingArea): """ self.grab_focus() self.ctrl_mask = event.state & gtk.gdk.CONTROL_MASK + self.mod1_mask = event.state & gtk.gdk.MOD1_MASK if event.button == 1: self._flow_graph.handle_mouse_selector_press( double_click=(event.type == gtk.gdk._2BUTTON_PRESS), coordinate=(event.x, event.y), @@ -102,6 +104,7 @@ class DrawingArea(gtk.DrawingArea): Forward button release information to the flow graph. """ self.ctrl_mask = event.state & gtk.gdk.CONTROL_MASK + self.mod1_mask = event.state & gtk.gdk.MOD1_MASK if event.button == 1: self._flow_graph.handle_mouse_selector_release( coordinate=(event.x, event.y), ) @@ -111,6 +114,7 @@ class DrawingArea(gtk.DrawingArea): Forward mouse motion information to the flow graph. """ self.ctrl_mask = event.state & gtk.gdk.CONTROL_MASK + self.mod1_mask = event.state & gtk.gdk.MOD1_MASK self._flow_graph.handle_mouse_motion( coordinate=(event.x, event.y), ) diff --git a/grc/gui/Element.py b/grc/gui/Element.py index c43f0eb35c..95a4e2edab 100644 --- a/grc/gui/Element.py +++ b/grc/gui/Element.py @@ -262,3 +262,9 @@ class Element(object): if rotation not in POSSIBLE_ROTATIONS: raise Exception('"%s" is not one of the possible rotations: (%s)'%(rotation, POSSIBLE_ROTATIONS)) self.rotation = rotation + + def mouse_over(self): + pass + + def mouse_out(self): + pass diff --git a/grc/gui/FlowGraph.py b/grc/gui/FlowGraph.py index 2b3d08628a..31017a9923 100644 --- a/grc/gui/FlowGraph.py +++ b/grc/gui/FlowGraph.py @@ -51,6 +51,8 @@ class FlowGraph(Element): #selected ports self._old_selected_port = None self._new_selected_port = None + # current mouse hover element + self.element_under_mouse = None #context menu self._context_menu = gtk.Menu() for action in [ @@ -82,6 +84,7 @@ class FlowGraph(Element): def set_size(self, *args): self.get_drawing_area().set_size_request(*args) def get_scroll_pane(self): return self.drawing_area.get_parent() def get_ctrl_mask(self): return self.drawing_area.ctrl_mask + def get_mod1_mask(self): return self.drawing_area.mod1_mask def new_pixmap(self, *args): return self.get_drawing_area().new_pixmap(*args) def add_new_block(self, key, coor=None): @@ -544,35 +547,60 @@ class FlowGraph(Element): def handle_mouse_motion(self, coordinate): """ - The mouse has moved, respond to mouse dragging. + The mouse has moved, respond to mouse dragging or notify elements Move a selected element to the new coordinate. Auto-scroll the scroll bars at the boundaries. """ #to perform a movement, the mouse must be pressed # (no longer checking pending events via gtk.events_pending() - always true in Windows) - if not self.mouse_pressed: return - #perform autoscrolling - width, height = self.get_size() - x, y = coordinate - h_adj = self.get_scroll_pane().get_hadjustment() - v_adj = self.get_scroll_pane().get_vadjustment() - for pos, length, adj, adj_val, adj_len in ( - (x, width, h_adj, h_adj.get_value(), h_adj.page_size), - (y, height, v_adj, v_adj.get_value(), v_adj.page_size), - ): - #scroll if we moved near the border - if pos-adj_val > adj_len-SCROLL_PROXIMITY_SENSITIVITY and adj_val+SCROLL_DISTANCE < length-adj_len: - adj.set_value(adj_val+SCROLL_DISTANCE) - adj.emit('changed') - elif pos-adj_val < SCROLL_PROXIMITY_SENSITIVITY: - adj.set_value(adj_val-SCROLL_DISTANCE) - adj.emit('changed') - #remove the connection if selected in drag event - if len(self.get_selected_elements()) == 1 and self.get_selected_element().is_connection(): - Actions.ELEMENT_DELETE() - #move the selected elements and record the new coordinate - X, Y = self.get_coordinate() - if not self.get_ctrl_mask(): self.move_selected((int(x - X), int(y - Y))) - self.set_coordinate((x, y)) - #queue draw for animation - self.queue_draw() + if not self.mouse_pressed: + # only continue if mouse-over stuff is enabled (just the auto-hide port label stuff for now) + if not Actions.TOGGLE_AUTO_HIDE_PORT_LABELS.get_active(): return + redraw = False + for element in reversed(self.get_elements()): + over_element = element.what_is_selected(coordinate) + if not over_element: continue + if over_element != self.element_under_mouse: # over sth new + if self.element_under_mouse: + redraw |= self.element_under_mouse.mouse_out() or False + self.element_under_mouse = over_element + redraw |= over_element.mouse_over() or False + break + else: + if self.element_under_mouse: + redraw |= self.element_under_mouse.mouse_out() or False + self.element_under_mouse = None + if redraw: + #self.create_labels() + self.create_shapes() + self.queue_draw() + else: + #perform auto-scrolling + width, height = self.get_size() + x, y = coordinate + h_adj = self.get_scroll_pane().get_hadjustment() + v_adj = self.get_scroll_pane().get_vadjustment() + for pos, length, adj, adj_val, adj_len in ( + (x, width, h_adj, h_adj.get_value(), h_adj.page_size), + (y, height, v_adj, v_adj.get_value(), v_adj.page_size), + ): + #scroll if we moved near the border + if pos-adj_val > adj_len-SCROLL_PROXIMITY_SENSITIVITY and adj_val+SCROLL_DISTANCE < length-adj_len: + adj.set_value(adj_val+SCROLL_DISTANCE) + adj.emit('changed') + elif pos-adj_val < SCROLL_PROXIMITY_SENSITIVITY: + adj.set_value(adj_val-SCROLL_DISTANCE) + adj.emit('changed') + #remove the connection if selected in drag event + if len(self.get_selected_elements()) == 1 and self.get_selected_element().is_connection(): + Actions.ELEMENT_DELETE() + #move the selected elements and record the new coordinate + if not self.get_ctrl_mask(): + X, Y = self.get_coordinate() + dX, dY = int(x - X), int(y - Y) + active = Actions.TOGGLE_SNAP_TO_GRID.get_active() or self.get_mod1_mask() + if not active or abs(dX) >= Utils.CANVAS_GRID_SIZE or abs(dY) >= Utils.CANVAS_GRID_SIZE: + self.move_selected((dX, dY)) + self.set_coordinate((x, y)) + #queue draw for animation + self.queue_draw() diff --git a/grc/gui/Port.py b/grc/gui/Port.py index 8b4edfa430..c56432d2b5 100644 --- a/grc/gui/Port.py +++ b/grc/gui/Port.py @@ -23,14 +23,18 @@ from Constants import \ CONNECTOR_EXTENSION_INCREMENT, \ PORT_LABEL_PADDING, PORT_MIN_WIDTH import Utils +import Actions import Colors import pygtk pygtk.require('2.0') import gtk +PORT_HIDDEN_MARKUP_TMPL="""\ +<span foreground="black" font_desc="Sans 7.5"> </span>""" PORT_MARKUP_TMPL="""\ <span foreground="black" font_desc="Sans 7.5">$encode($port.get_name())</span>""" + class Port(Element): """The graphical port.""" @@ -40,7 +44,10 @@ class Port(Element): Create list of connector coordinates. """ Element.__init__(self) - self.connector_coordinates = dict() + self.W = self.H = self.w = self.h = 0 + self._connector_coordinate = (0,0) + self._connector_length = 0 + self._label_hidden = True def create_shapes(self): """Create new areas and labels for the port.""" @@ -52,40 +59,42 @@ class Port(Element): elif self.is_sink(): ports = self.get_parent().get_sinks_gui() #get the max width self.W = max([port.W for port in ports] + [PORT_MIN_WIDTH]) + W = self.W if not self.label_hidden() else 10 #get a numeric index for this port relative to its sibling ports try: index = ports.index(self) except: if hasattr(self, '_connector_length'): - del self._connector_length; + del self._connector_length return - length = len(ports) + length = len(filter(lambda p: not p.get_hide(), ports)) #reverse the order of ports for these rotations if rotation in (180, 270): index = length-index-1 - offset = (self.get_parent().H - length*self.H - (length-1)*PORT_SEPARATION)/2 + offset = (self.get_parent().H - (length-1)*PORT_SEPARATION - self.H)/2 #create areas and connector coordinates if (self.is_sink() and rotation == 0) or (self.is_source() and rotation == 180): - x = -1*self.W - y = (PORT_SEPARATION+self.H)*index+offset - self.add_area((x, y), (self.W, self.H)) + x = -1*W + y = PORT_SEPARATION*index+offset + self.add_area((x, y), (W, self.H)) self._connector_coordinate = (x-1, y+self.H/2) elif (self.is_source() and rotation == 0) or (self.is_sink() and rotation == 180): x = self.get_parent().W - y = (PORT_SEPARATION+self.H)*index+offset - self.add_area((x, y), (self.W, self.H)) - self._connector_coordinate = (x+1+self.W, y+self.H/2) + y = PORT_SEPARATION*index+offset + self.add_area((x, y), (W, self.H)) + self._connector_coordinate = (x+1+W, y+self.H/2) elif (self.is_source() and rotation == 90) or (self.is_sink() and rotation == 270): - y = -1*self.W - x = (PORT_SEPARATION+self.H)*index+offset - self.add_area((x, y), (self.H, self.W)) + y = -1*W + x = PORT_SEPARATION*index+offset + self.add_area((x, y), (self.H, W)) self._connector_coordinate = (x+self.H/2, y-1) elif (self.is_sink() and rotation == 90) or (self.is_source() and rotation == 270): y = self.get_parent().W - x = (PORT_SEPARATION+self.H)*index+offset - self.add_area((x, y), (self.H, self.W)) - self._connector_coordinate = (x+self.H/2, y+1+self.W) + x = PORT_SEPARATION*index+offset + self.add_area((x, y), (self.H, W)) + self._connector_coordinate = (x+self.H/2, y+1+W) #the connector length self._connector_length = CONNECTOR_EXTENSION_MINIMAL + CONNECTOR_EXTENSION_INCREMENT*index + def modify_height(self, start_height): type_dict = {'bus':(lambda a: a * 3)}; @@ -102,8 +111,8 @@ class Port(Element): layout = gtk.DrawingArea().create_pango_layout('') layout.set_markup(Utils.parse_template(PORT_MARKUP_TMPL, port=self)) self.w, self.h = layout.get_pixel_size() - self.W, self.H = 2*PORT_LABEL_PADDING+self.w, 2*PORT_LABEL_PADDING+self.h - self.H = self.modify_height(self.H); + self.W, self.H = 2*PORT_LABEL_PADDING + self.w, 2*PORT_LABEL_PADDING+self.h + self.H = self.modify_height(self.H) #create the pixmap pixmap = self.get_parent().get_parent().new_pixmap(self.w, self.h) gc = pixmap.new_gc() @@ -129,6 +138,8 @@ class Port(Element): border_color=self.is_highlighted() and Colors.HIGHLIGHT_COLOR or self.get_parent().is_dummy_block() and Colors.MISSING_BLOCK_BORDER_COLOR or Colors.BORDER_COLOR, ) + if self.label_hidden(): + return X,Y = self.get_coordinate() (x,y),(w,h) = self._areas_list[0] #use the first area's sizes to place the labels if self.is_horizontal(): @@ -143,9 +154,9 @@ class Port(Element): Returns: the connector coordinate (x, y) tuple """ - x,y = self._connector_coordinate - X,Y = self.get_coordinate() - return (x+X, y+Y) + x, y = self._connector_coordinate + X, Y = self.get_coordinate() + return (x + X, y + Y) def get_connector_direction(self): """ @@ -222,3 +233,26 @@ class Port(Element): the parent's highlighting status """ return self.get_parent().is_highlighted() + + def label_hidden(self): + """ + Figure out if the label should be shown + + Returns: + true if the label should be hidden + """ + return self._label_hidden and Actions.TOGGLE_AUTO_HIDE_PORT_LABELS.get_active() + + def mouse_over(self): + """ + Called from flow graph on mouse-over + """ + self._label_hidden = False + return Actions.TOGGLE_AUTO_HIDE_PORT_LABELS.get_active() # only redraw if necessary + + def mouse_out(self): + """ + Called from flow graph on mouse-out + """ + self._label_hidden = True + return Actions.TOGGLE_AUTO_HIDE_PORT_LABELS.get_active() # only redraw if necessary diff --git a/grc/gui/Preferences.py b/grc/gui/Preferences.py index a6bd0d6603..1d6675da32 100644 --- a/grc/gui/Preferences.py +++ b/grc/gui/Preferences.py @@ -84,20 +84,11 @@ def blocks_window_position(pos=None): try: return _config_parser.getint('main', 'blocks_window_position') or 1 #greater than 0 except: return -1 -def reports_window_visibility(visible=None): - if visible is not None: _config_parser.set('main', 'reports_window_visible', visible) +def bool_entry(key, active=None, default=True): + if active is not None: + _config_parser.set('main', key, active) else: - try: return _config_parser.getboolean('main', 'reports_window_visible') - except: return True - -def blocks_window_visibility(visible=None): - if visible is not None: _config_parser.set('main', 'blocks_window_visible', visible) - else: - try: return _config_parser.getboolean('main', 'blocks_window_visible') - except: return True - -def scroll_lock(visible=None): - if visible is not None: _config_parser.set('main', 'scroll_lock', visible) - else: - try: return _config_parser.getboolean('main', 'scroll_lock') - except: return True + try: + return _config_parser.getboolean('main', key) + except: + return default
\ No newline at end of file diff --git a/grc/gui/Utils.py b/grc/gui/Utils.py index ebd5aefca7..9a0a59cda7 100644 --- a/grc/gui/Utils.py +++ b/grc/gui/Utils.py @@ -17,7 +17,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA """ -from Constants import POSSIBLE_ROTATIONS +from Constants import POSSIBLE_ROTATIONS, CANVAS_GRID_SIZE from Cheetah.Template import Template import pygtk pygtk.require('2.0') @@ -108,3 +108,11 @@ def parse_template(tmpl_str, **kwargs): # print tmpl_str # print str(kwargs['param'].get_error_messages()) return str(Template(tmpl_str, kwargs)) + +def align_to_grid(coor): + _align = lambda: int(round(x / (1.0 * CANVAS_GRID_SIZE)) * CANVAS_GRID_SIZE) + try: + return [_align() for x in coor] + except TypeError: + x = coor + return _align()
\ No newline at end of file diff --git a/grc/python/Block.py b/grc/python/Block.py index 7a1c3a254f..9556e8f061 100644 --- a/grc/python/Block.py +++ b/grc/python/Block.py @@ -19,6 +19,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA from .. base.Block import Block as _Block from .. gui.Block import Block as _GUIBlock +from . FlowGraph import _variable_matcher import extract_docs class Block(_Block, _GUIBlock): @@ -90,6 +91,14 @@ class Block(_Block, _GUIBlock): if not self.get_parent().evaluate(check_res): self.add_error_message('Check "%s" failed.'%check) except: self.add_error_message('Check "%s" did not evaluate.'%check) + # for variables check the value (only if var_value is used + if _variable_matcher.match(self.get_key()) and self._var_value != '$value': + value = self._var_value + try: + value = self.get_var_value() + self.get_parent().evaluate(value) + except Exception as err: + self.add_error_message('Value "%s" cannot be evaluated:\n%s' % (value, err)) def rewrite(self): """ @@ -169,6 +178,7 @@ class Block(_Block, _GUIBlock): def get_make(self): return self.resolve_dependencies(self._make) def get_var_make(self): return self.resolve_dependencies(self._var_make) + def get_var_value(self): return self.resolve_dependencies(self._var_value) def get_callbacks(self): """ diff --git a/grc/python/FlowGraph.py b/grc/python/FlowGraph.py index 114f708cb2..daec2d4310 100644 --- a/grc/python/FlowGraph.py +++ b/grc/python/FlowGraph.py @@ -262,7 +262,7 @@ class FlowGraph(_FlowGraph, _GUIFlowGraph): #load variables for variable in self.get_variables(): try: - e = eval(variable.get_param('value').to_code(), n, n) + e = eval(variable.get_var_value(), n, n) n[variable.get_id()] = e except: pass #make namespace public diff --git a/grc/python/block.dtd b/grc/python/block.dtd index 18e53fda2a..576b428111 100644 --- a/grc/python/block.dtd +++ b/grc/python/block.dtd @@ -25,15 +25,15 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA Top level element. A block contains a name, ...parameters list, and list of IO ports. --> -<!ELEMENT block (name, key, category?, throttle?, import*, var_make?, make, callback*, param_tab_order?, param*, bus_sink?, bus_source?, check*, sink*, source*, bus_structure_sink?, bus_structure_source?, doc?, grc_source?)> +<!ELEMENT block (name, key, category?, throttle?, import*, var_make?, var_value?, make, callback*, param_tab_order?, param*, bus_sink?, bus_source?, check*, sink*, source*, bus_structure_sink?, bus_structure_source?, doc?, grc_source?)> <!-- Sub level elements. --> <!ELEMENT param_tab_order (tab+)> <!ELEMENT param (base_key?, name, key, value?, type?, hide?, option*, tab?)> <!ELEMENT option (name, key, opt*)> -<!ELEMENT sink (name, type, vlen?, nports?, optional?)> -<!ELEMENT source (name, type, vlen?, nports?, optional?)> +<!ELEMENT sink (name, type, vlen?, nports?, optional?, hide?)> +<!ELEMENT source (name, type, vlen?, nports?, optional?, hide?)> <!-- Bottom level elements. Character data only. @@ -57,6 +57,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA <!ELEMENT bus_structure_sink (#PCDATA)> <!ELEMENT bus_structure_source (#PCDATA)> <!ELEMENT var_make (#PCDATA)> +<!ELEMENT var_value (#PCDATA)> <!ELEMENT make (#PCDATA)> <!ELEMENT value (#PCDATA)> <!ELEMENT callback (#PCDATA)> |