summaryrefslogtreecommitdiff
path: root/grc/python/Block.py
diff options
context:
space:
mode:
Diffstat (limited to 'grc/python/Block.py')
-rw-r--r--grc/python/Block.py69
1 files changed, 22 insertions, 47 deletions
diff --git a/grc/python/Block.py b/grc/python/Block.py
index e13b26c12f..5dffcb3124 100644
--- a/grc/python/Block.py
+++ b/grc/python/Block.py
@@ -97,54 +97,29 @@ class Block(_Block, _GUIBlock):
"""
_Block.rewrite(self)
- def rectify(ports):
- #restore integer contiguity after insertion
- #rectify the port names with the index
- self.back_ofthe_bus(ports);
- for i, port in enumerate(ports):
- port._key = str(i)
- port._name = port._n['name']
- if len(ports) > 1 and not port._type == 'bus': port._name += str(i)
-
- def insert_port(get_ports, get_port, key):
- prev_port = get_port(str(int(key)-1))
- get_ports().insert(
- get_ports().index(prev_port)+1,
- prev_port.copy(new_key=key),
- )
- rectify(get_ports())
-
- def remove_port(get_ports, get_port, key):
- port = get_port(key)
- for connection in port.get_connections():
- self.get_parent().remove_element(connection)
- get_ports().remove(port)
- rectify(get_ports())
-
- #adjust nports
- for get_ports, get_port in (
- (self.get_sources, self.get_source),
- (self.get_sinks, self.get_sink),
- ):
- master_ports = filter(lambda p: p.get_nports(), get_ports())
- for i, master_port in enumerate(master_ports):
- nports = master_port.get_nports()
- index_first = get_ports().index(master_port)
- try: index_last = get_ports().index(master_ports[i+1])
- except IndexError: index_last = len(get_ports())
- num_ports = index_last - index_first
- #do nothing if nports is already num ports
- if nports == num_ports: continue
- #remove excess ports and connections
- if nports < num_ports:
- for key in reversed(map(str, range(index_first+nports, index_first+num_ports))):
- remove_port(get_ports, get_port, key);
- continue
- #add more ports
- if nports > num_ports:
- for key in map(str, range(index_first+num_ports, index_first+nports)):
- insert_port(get_ports, get_port, key)
+ # adjust nports
+ for ports in (self.get_sources(), self.get_sinks()):
+ for i, master_port in enumerate(ports):
+ nports = master_port.get_nports() or 1
+ num_ports = 1 + len(master_port.get_clones())
+ if not nports and num_ports == 1: # not a master port and no left-over clones
continue
+ # remove excess cloned ports
+ for port in master_port.get_clones()[nports-1:]:
+ # remove excess connections
+ for connection in port.get_connections():
+ self.get_parent().remove_element(connection)
+ master_port.remove_clone(port)
+ ports.remove(port)
+ # add more cloned ports
+ for i in range(num_ports, nports):
+ port = master_port.add_clone()
+ ports.insert(ports.index(master_port) + i, port)
+
+ self.back_ofthe_bus(ports)
+ # renumber non-message/-msg ports
+ for i, port in enumerate(filter(lambda p: p.get_key().isdigit(), ports)):
+ port._key = str(i)
def port_controller_modify(self, direction):
"""