diff options
Diffstat (limited to 'grc/python/Block.py')
-rw-r--r-- | grc/python/Block.py | 85 |
1 files changed, 20 insertions, 65 deletions
diff --git a/grc/python/Block.py b/grc/python/Block.py index d8aabd2867..74011e5f51 100644 --- a/grc/python/Block.py +++ b/grc/python/Block.py @@ -97,73 +97,28 @@ 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); - current_master_port_name = '' # name of the currently expanded master port - n = 0 # master port index - for i, port in enumerate(ports): - port._key = str(i) - port._name = port._n['name'] - if port.get_nports() > 1 and not port._type == 'bus': - n = n + 1 if port._name == current_master_port_name else 0 # next master port --> reset. - current_master_port_name = port._name # remember last master port name - port._name += str(n) - - 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()) - - def get_master_ports(get_ports): - port_basenames = set() - master_ports = list() - for p in get_ports(): - base_n = ''.join([c for c in p._name if not c.isdigit()]) - if not base_n in port_basenames: - master_ports.append(p) - port_basenames.add(base_n) - return master_ports - #adjust nports - for get_ports, get_port in ( - (self.get_sources, self.get_source), - (self.get_sinks, self.get_sink), - ): - master_ports2 = get_master_ports(get_ports) - master_ports = filter(lambda p: p.get_nports(), get_ports()) - assert master_ports == master_ports2 - for i, master_port in enumerate(master_ports): - nports = master_port.get_nports() - if not nports: - continue - 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) + 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: # no/former master port? skip continue + # remove excess 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_duplicate(port) + ports.remove(port) + # add more 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) + for i, port in enumerate(filter(lambda p: p.get_key().isdigit(), ports)): + port._key = str(i) def port_controller_modify(self, direction): """ |