Ignore:
Timestamp:
10/29/12 19:35:17 (18 months ago)
Author:
Ales Erjavec <ales.erjavec@…>
Branch:
default
Message:

Filter suggested widgets by compatible channel types.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • Orange/OrangeCanvas/document/interactions.py

    r11163 r11164  
    6161class NoPossibleLinksError(ValueError): 
    6262    pass 
     63 
     64 
     65def reversed_arguments(func): 
     66    """Return a function with reversed argument order. 
     67    """ 
     68    def wrapped(*args): 
     69        return func(*reversed(args)) 
     70    return wrapped 
    6371 
    6472 
     
    231239                try: 
    232240                    node = self.create_new(event) 
     241                except Exception: 
     242                    log.error("Failed to create a new node, ending.", 
     243                              exc_info=True) 
     244                    node = None 
     245 
     246                if node is not None: 
    233247                    self.document.addNode(node) 
    234                 except Exception: 
    235                     log.error("Failed to create a new node, ending.") 
    236                     node = None 
    237248 
    238249            if node is not None: 
     
    250261        """ 
    251262        pos = event.screenPos() 
    252         quick_menu = self.document.quickMenu() 
    253  
    254         action = quick_menu.exec_(pos) 
     263        menu = self.document.quickMenu() 
     264        node = self.scene.node_for_item(self.from_item) 
     265        from_desc = node.description 
     266 
     267        def is_compatible(source, sink): 
     268            return any(scheme.compatible_channels(output, input) \ 
     269                       for output in source.outputs \ 
     270                       for input in sink.inputs) 
     271 
     272        if self.direction == self.FROM_SINK: 
     273            # Reverse the argument order. 
     274            is_compatible = reversed_arguments(is_compatible) 
     275 
     276        def filter(index): 
     277            desc = index.data(QtWidgetRegistry.WIDGET_DESC_ROLE) 
     278            if desc.isValid(): 
     279                desc = desc.toPyObject() 
     280                return is_compatible(from_desc, desc) 
     281            else: 
     282                return False 
     283 
     284        menu.setFilterFunc(filter) 
     285        try: 
     286            action = menu.exec_(pos) 
     287        finally: 
     288            menu.setFilterFunc(None) 
    255289 
    256290        if action: 
     
    401435        """ 
    402436        pos = event.screenPos() 
    403         quick_menu = self.document.quickMenu() 
    404  
    405         action = quick_menu.exec_(pos) 
     437        menu = self.document.quickMenu() 
     438        menu.setFilterFunc(None) 
     439 
     440        action = menu.exec_(pos) 
    406441        if action: 
    407442            item = action.property("item").toPyObject() 
Note: See TracChangeset for help on using the changeset viewer.