Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • Orange/OrangeCanvas/orngSignalManager.py

    r10996 r11461  
    1010 
    1111import __builtin__ 
     12 
     13from collections import deque 
    1214 
    1315import orange 
     
    617619        skipWidgets = self.getBlockedWidgets() # Widgets that are blocking 
    618620         
    619          
     621        self.addEvent("Blocked widgets %s." % 
     622                      [w.captionTitle for w in skipWidgets], 
     623                      eventVerbosity=2) 
    620624        # start propagating 
    621625        self.signalProcessingInProgress = 1 
     
    680684        # there is no link... 
    681685        return 0 
    682      
    683686 
    684687    def widgetDescendants(self, widget): 
    685         """ Return all widget descendants of `widget` 
    686         """ 
    687         queue = [widget] 
    688         queue_set = set(queue) 
    689          
    690         index = self.widgets.index(widget) 
    691         for i in range(index, len(self.widgets)): 
    692             widget = self.widgets[i] 
    693             if widget not in queue: 
    694                 continue 
    695             linked = [link.widgetTo for link in self.links.get(widget, []) if link.enabled] 
     688        """ Return all widget descendants of `widget`. 
     689 
     690        .. note:: 
     691            Includes only widgets which are reachable by *enabled* links. 
     692 
     693        """ 
     694        queue = deque([widget]) 
     695        descendants = set() 
     696 
     697        while queue: 
     698            w = queue.popleft() 
     699            linked = [link.widgetTo for link in self.links.get(widget, []) 
     700                      if link.enabled] 
    696701            for w in linked: 
    697                 if w not in queue_set: 
    698                     queue.append(widget) 
    699                     queue_set.add(widget) 
    700         return queue 
    701      
    702      
     702                if w not in descendants: 
     703                    queue.append(w) 
     704                    descendants.add(w) 
     705 
     706        return list(descendants) 
     707 
    703708    def isWidgetBlocked(self, widget): 
    704709        """ Is this widget or any of its up-stream connected widgets blocked. 
     
    707712            return True 
    708713        else: 
    709             widgets = [link.widgetFrom for link in self.getLinks(None, widget, None, None)] 
    710             if widgets: 
    711                 return any(self.isWidgetBlocked(w) for w in widgets) 
    712             else: 
    713                 return False 
    714              
    715              
     714            widgets = [link.widgetFrom 
     715                       for link in self.getLinks(None, widget, None, None) 
     716                       if link.enabled] 
     717            return any(self.isWidgetBlocked(w) for w in widgets) 
     718 
    716719    def getBlockedWidgets(self): 
    717720        """ Return a set of all widgets that are blocked. 
     
    720723        for w in self.widgets: 
    721724            if w not in blocked and w.isBlocking(): 
    722                 blocked.update(self.widgetDescendants(w)) 
     725                blocked.update(set([w]).union(set(self.widgetDescendants(w)))) 
    723726        return blocked 
    724      
    725                  
     727 
    726728    def freeze(self, widget=None): 
    727729        """ Return a context manager that freezes the signal processing 
Note: See TracChangeset for help on using the changeset viewer.