diff options
author | Sebastian Koslowski <koslowski@kit.edu> | 2016-06-18 21:16:14 -0700 |
---|---|---|
committer | Sebastian Koslowski <koslowski@kit.edu> | 2016-07-13 16:33:29 +0200 |
commit | 4b60db7deaa89a998715b45e942fa0c69dd5be1a (patch) | |
tree | 304720c369be0bf78aed80fe377fb892794f9fc0 /grc | |
parent | 025c19f6a22ab3ed035cbc63787c4dcdba395faf (diff) |
grc-refactor: the hopeless cause of bus ports...
Diffstat (limited to 'grc')
-rw-r--r-- | grc/core/Block.py | 107 | ||||
-rw-r--r-- | grc/core/FlowGraph.py | 81 | ||||
-rw-r--r-- | grc/core/Port.py | 27 | ||||
-rw-r--r-- | grc/gui/FlowGraph.py | 4 |
4 files changed, 102 insertions, 117 deletions
diff --git a/grc/core/Block.py b/grc/core/Block.py index c6d743eaee..743c9de99f 100644 --- a/grc/core/Block.py +++ b/grc/core/Block.py @@ -578,26 +578,30 @@ class Block(Element): Returns: true for change """ - changed = False + type_templates = ' '.join(p._type for p in self.get_children()) type_param = None for key, param in six.iteritems(self.params): - children = self.get_children() + if not param.is_enum(): + continue # Priority to the type controller - if param.key in ' '.join([p._type for p in children]): type_param = param + if param.key in type_templates: + type_param = param + break # Use param if type param is unset if not type_param: type_param = param - if type_param: - # Try to increment the enum by direction - try: - keys = type_param.get_option_keys() - old_index = keys.index(type_param.get_value()) - new_index = (old_index + direction + len(keys)) % len(keys) - type_param.set_value(keys[new_index]) - changed = True - except: - pass - return changed + if not type_param: + return False + + # Try to increment the enum by direction + try: + keys = type_param.get_option_keys() + old_index = keys.index(type_param.get_value()) + new_index = (old_index + direction + len(keys)) % len(keys) + type_param.set_value(keys[new_index]) + return True + except: + return False def port_controller_modify(self, direction): """ @@ -611,7 +615,7 @@ class Block(Element): """ changed = False # Concat the nports string from the private nports settings of all ports - nports_str = ' '.join([port._nports for port in self.get_ports()]) + nports_str = ' '.join(port._nports for port in self.get_ports()) # Modify all params whose keys appear in the nports string for key, param in six.iteritems(self.params): if param.is_enum() or param.key not in nports_str: @@ -682,12 +686,9 @@ class Block(Element): ############################################## def get_bus_structure(self, direction): - if direction == 'source': - bus_structure = self._bus_structure_source - else: - bus_structure = self._bus_structure_sink - - bus_structure = self.resolve_dependencies(bus_structure) + bus_structure = self.resolve_dependencies( + self._bus_structure_source if direction == 'source' else + self._bus_structure_sink) if not bus_structure: return '' # TODO: Don't like empty strings. should change this to None eventually @@ -706,70 +707,66 @@ class Block(Element): return buslist or ports def _import_bus_stuff(self, n): - bussinks = n.get('bus_sink', []) - if len(bussinks) > 0 and not self._bussify_sink: + bus_sinks = n.get('bus_sink', []) + if len(bus_sinks) > 0 and not self._bussify_sink: self.bussify({'name': 'bus', 'type': 'bus'}, 'sink') - elif len(bussinks) > 0: + elif len(bus_sinks) > 0: self.bussify({'name': 'bus', 'type': 'bus'}, 'sink') self.bussify({'name': 'bus', 'type': 'bus'}, 'sink') - bussrcs = n.get('bus_source', []) - if len(bussrcs) > 0 and not self._bussify_source: + bus_sources = n.get('bus_source', []) + if len(bus_sources) > 0 and not self._bussify_source: self.bussify({'name': 'bus', 'type': 'bus'}, 'source') - elif len(bussrcs) > 0: + elif len(bus_sources) > 0: self.bussify({'name': 'bus', 'type': 'bus'}, 'source') self.bussify({'name': 'bus', 'type': 'bus'}, 'source') def form_bus_structure(self, direc): - if direc == 'source': - get_p = self.get_sources - get_p_gui = self.get_sources_gui - bus_structure = self.get_bus_structure('source') - else: - get_p = self.get_sinks - get_p_gui = self.get_sinks_gui - bus_structure = self.get_bus_structure('sink') + ports = self.sources if direc == 'source' else self.sinks + struct = self.get_bus_structure(direc) - struct = [list(range(len(get_p())))] - if True in [isinstance(a.get_nports(), int) for a in get_p()]: - structlet = [] - last = 0 - for j in [i.get_nports() for i in get_p() if isinstance(i.get_nports(), int)]: - structlet.extend([a+last for a in range(j)]) - last = structlet[-1] + 1 - struct = [structlet] - if bus_structure: + if not struct: + struct = [list(range(len(ports)))] - struct = bus_structure + elif any(isinstance(p.get_nports(), int) for p in ports): + last = 0 + structlet = [] + for port in ports: + nports = port.get_nports() + if not isinstance(nports, int): + continue + structlet.extend(a + last for a in range(nports)) + last += nports + struct = [structlet] self.current_bus_structure[direc] = struct return struct def bussify(self, n, direc): if direc == 'source': - get_p = self.get_sources get_p_gui = self.get_sources_gui else: - get_p = self.get_sinks get_p_gui = self.get_sinks_gui - for elt in get_p(): + ports = self.sources if direc == 'source' else self.sinks + + for elt in ports: for connect in elt.get_connections(): self.parent.remove_element(connect) - if ('bus' not in [a.get_type() for a in get_p()]) and len(get_p()) > 0: + if ports and all('bus' != p.get_type() for p in ports): struct = self.form_bus_structure(direc) self.current_bus_structure[direc] = struct - if get_p()[0].get_nports(): - n['nports'] = str(1) + if ports[0].get_nports(): + n['nports'] = '1' for i in range(len(struct)): - n['key'] = str(len(get_p())) + n['key'] = str(len(ports)) n = dict(n) port = self.parent.parent.Port(block=self, n=n, dir=direc) - get_p().append(port) - elif 'bus' in [a.get_type() for a in get_p()]: + ports.append(port) + elif any('bus' == p.get_type() for p in ports): for elt in get_p_gui(): - get_p().remove(elt) + ports.remove(elt) self.current_bus_structure[direc] = '' def _init_bus_ports(self, n): diff --git a/grc/core/FlowGraph.py b/grc/core/FlowGraph.py index 53c4b783b7..16bcb3b9f6 100644 --- a/grc/core/FlowGraph.py +++ b/grc/core/FlowGraph.py @@ -461,52 +461,41 @@ class FlowGraph(Element): ############################################## def bus_ports_rewrite(self): # todo: move to block.rewrite() - for block in self.blocks: - for direc in ['source', 'sink']: - if direc == 'source': - get_p = block.get_sources - get_p_gui = block.get_sources_gui - bus_structure = block.form_bus_structure('source') - else: - get_p = block.get_sinks - get_p_gui = block.get_sinks_gui - bus_structure = block.form_bus_structure('sink') - - if 'bus' in [a.get_type() for a in get_p_gui()]: - if len(get_p_gui()) > len(bus_structure): - times = range(len(bus_structure), len(get_p_gui())) - for i in times: - for connect in get_p_gui()[-1].get_connections(): - block.parent.remove_element(connect) - get_p().remove(get_p_gui()[-1]) - elif len(get_p_gui()) < len(bus_structure): - n = {'name': 'bus', 'type': 'bus'} - if any(isinstance(a.get_nports(), int) for a in get_p()): - n['nports'] = str(1) - - times = range(len(get_p_gui()), len(bus_structure)) - - for i in times: - n['key'] = str(len(get_p())) - n = dict(n) - port = block.parent.parent.Port( - block=block, n=n, dir=direc) - get_p().append(port) - - if 'bus' in [a.get_type() for a in block.get_sources_gui()]: - for i in range(len(block.get_sources_gui())): - if len(block.get_sources_gui()[ - i].get_connections()) > 0: - source = block.get_sources_gui()[i] - sink = [] - - for j in range(len(source.get_connections())): - sink.append( - source.get_connections()[j].sink_port) - for elt in source.get_connections(): - self.remove_element(elt) - for j in sink: - self.connect(source, j) + def doit(block, ports, ports_gui, direc): + bus_structure = block.form_bus_structure(direc) + + if any('bus' == a.get_type() for a in ports_gui): + if len(ports_gui) > len(bus_structure): + for _ in range(len(bus_structure), len(ports_gui)): + for connect in ports_gui[-1].get_connections(): + block.parent.remove_element(connect) + ports.remove(ports_gui[-1]) + elif len(ports_gui) < len(bus_structure): + n = {'name': 'bus', 'type': 'bus'} + if any(isinstance(a.get_nports(), int) for a in ports): + n['nports'] = str(1) + for _ in range(len(ports_gui), len(bus_structure)): + n['key'] = str(len(ports)) + port = block.parent.parent.Port(block=block, n=dict(n), dir=direc) + ports.append(port) + + if 'bus' in [a.get_type() for a in block.get_sources_gui()]: + for i in range(len(block.get_sources_gui())): + if not block.get_sources_gui()[i].get_connections(): + continue + source = block.get_sources_gui()[i] + sink = [] + + for j in range(len(source.get_connections())): + sink.append(source.get_connections()[j].sink_port) + for elt in source.get_connections(): + self.remove_element(elt) + for j in sink: + self.connect(source, j) + + for blk in self.blocks: + doit(blk, blk.sources, blk.get_sources_gui(), 'source') + doit(blk, blk.sinks, blk.get_sinks_gui(), 'sinks') def _update_old_message_port_keys(source_key, sink_key, source_block, sink_block): diff --git a/grc/core/Port.py b/grc/core/Port.py index d0362ffd78..bb1e1fa9f2 100644 --- a/grc/core/Port.py +++ b/grc/core/Port.py @@ -363,18 +363,17 @@ class Port(Element): def get_associated_ports(self): if not self.get_type() == 'bus': return [self] + + block = self.parent_block + if self.is_source: + block_ports = block.sources + bus_structure = block.current_bus_structure['source'] else: - flowgraph = self.parent_flowgraph - if self.is_source: - get_ports = flowgraph.get_sources - bus_structure = flowgraph.current_bus_structure['source'] - else: - get_ports = flowgraph.get_sinks - bus_structure = flowgraph.current_bus_structure['sink'] - - ports = [i for i in get_ports() if not i.get_type() == 'bus'] - if bus_structure: - busses = [i for i in get_ports() if i.get_type() == 'bus'] - bus_index = busses.index(self) - ports = [a for a in ports if ports.index(a) in bus_structure[bus_index]] - return ports + block_ports = block.sinks + bus_structure = block.current_bus_structure['sink'] + + ports = [i for i in block_ports if not i.get_type() == 'bus'] + if bus_structure: + bus_index = [i for i in block_ports if i.get_type() == 'bus'].index(self) + ports = [p for i, p in enumerate(ports) if i in bus_structure[bus_index]] + return ports diff --git a/grc/gui/FlowGraph.py b/grc/gui/FlowGraph.py index 1c4960fed4..f6a57ef367 100644 --- a/grc/gui/FlowGraph.py +++ b/grc/gui/FlowGraph.py @@ -259,7 +259,7 @@ class FlowGraph(Element, _Flowgraph): Returns: true for change """ - return any([sb.type_controller_modify(direction) for sb in self.get_selected_blocks()]) + return any(sb.type_controller_modify(direction) for sb in self.get_selected_blocks()) def port_controller_modify_selected(self, direction): """ @@ -271,7 +271,7 @@ class FlowGraph(Element, _Flowgraph): Returns: true for changed """ - return any([sb.port_controller_modify(direction) for sb in self.get_selected_blocks()]) + return any(sb.port_controller_modify(direction) for sb in self.get_selected_blocks()) def enable_selected(self, enable): """ |