Merge branch 'sync' of http://gnuradio.org/git/matt into wip/examples
[debian/gnuradio] / grc / python / Block.py
index e2c812d5ad8a5befd8da7041e5722d69a0fc87bb..dd39b095de5a0c14920ee1db2bed655c43e5ae1a 100644 (file)
@@ -18,10 +18,14 @@ 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
 import extract_docs
 import extract_category
 
-class Block(_Block):
+class Block(_Block, _GUIBlock):
+
+       def is_virtual_sink(self): return self.get_key() == 'virtual_sink'
+       def is_virtual_source(self): return self.get_key() == 'virtual_source'
 
        ##for make source to keep track of indexes
        _source_count = 0
@@ -48,13 +52,13 @@ class Block(_Block):
                        flow_graph=flow_graph,
                        n=n,
                )
+               _GUIBlock.__init__(self)
 
        def validate(self):
                """
                Validate this block.
                Call the base class validate.
                Evaluate the checks: each check must evaluate to True.
-               Adjust the nports.
                """
                _Block.validate(self)
                #evaluate the checks
@@ -65,15 +69,19 @@ class Block(_Block):
                                try: assert check_eval
                                except AssertionError: self.add_error_message('Check "%s" failed.'%check)
                        except: self.add_error_message('Check "%s" did not evaluate.'%check)
+
+       def rewrite(self):
+               """
+               Add and remove ports to adjust for the nports.
+               """
+               _Block.rewrite(self)
                #adjust nports
-               for get_ports, get_port, Port in (
-                       (self.get_sources, self.get_source, self.get_parent().get_parent().Source),
-                       (self.get_sinks, self.get_sink, self.get_parent().get_parent().Sink),
+               for get_ports, get_port in (
+                       (self.get_sources, self.get_source),
+                       (self.get_sinks, self.get_sink),
                ):
-                       #TODO #FIXME we want to filter out msg ports and run the regular code below this line
-                       if any([port.get_type() == 'msg' for port in get_ports()]): continue
-                       #how many ports?
-                       num_ports = len(get_ports())
+                       #how many streaming (non-message) ports?
+                       num_ports = len(filter(lambda p: p.get_type() != 'msg', get_ports()))
                        #do nothing for 0 ports
                        if not num_ports: continue
                        #get the nports setting
@@ -97,11 +105,11 @@ class Block(_Block):
                        #add more ports
                        if nports > num_ports:
                                for key in map(str, range(num_ports, nports)):
-                                       n = port0._n
-                                       n['key'] = key
-                                       port = Port(self, n)
-                                       #FIXME should use insert w/index not append
-                                       get_ports().append(port)
+                                       prev_port = get_port(str(int(key)-1))
+                                       get_ports().insert(
+                                               get_ports().index(prev_port)+1,
+                                               prev_port.copy(new_key=key),
+                                       )
                                continue
 
        def port_controller_modify(self, direction):