summaryrefslogtreecommitdiff
path: root/grc
diff options
context:
space:
mode:
Diffstat (limited to 'grc')
-rw-r--r--grc/base/Block.py7
-rw-r--r--grc/base/Port.py31
-rw-r--r--grc/examples/simple/variable_config.grc398
-rw-r--r--grc/examples/xmlrpc/xmlrpc_client.grc262
-rw-r--r--grc/examples/xmlrpc/xmlrpc_server.grc750
-rw-r--r--grc/gui/ActionHandler.py34
-rw-r--r--grc/gui/Actions.py28
-rw-r--r--grc/gui/Bars.py6
-rw-r--r--grc/gui/Block.py34
-rw-r--r--grc/gui/Constants.py5
-rw-r--r--grc/gui/DrawingArea.py4
-rw-r--r--grc/gui/Element.py6
-rw-r--r--grc/gui/FlowGraph.py82
-rw-r--r--grc/gui/Port.py76
-rw-r--r--grc/gui/Preferences.py23
-rw-r--r--grc/gui/Utils.py10
-rw-r--r--grc/python/Block.py10
-rw-r--r--grc/python/FlowGraph.py2
-rw-r--r--grc/python/block.dtd7
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)>