Ignore:
Timestamp:
04/19/12 17:52:13 (2 years ago)
Author:
Ales Erjavec <ales.erjavec@…>
Branch:
default
rebase_source:
bd81a7962ca8a3ac697fd2b8cf47f49f215e306d
Message:

The canvas context menu now also enables widgets which can connect using dynamic channels.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • Orange/OrangeCanvas/orngTabs.py

    r9671 r10823  
    77import os.path, sys 
    88from string import strip, count, replace 
    9 import orngDoc, orngOutput, orngRegistry 
    10 from orngSignalManager import InputSignal, OutputSignal 
     9import orngDoc, orngOutput, orngRegistry, orngSignalManager 
     10from orngSignalManager import InputSignal, OutputSignal, resolveSignal 
    1111import OWGUIEx 
    1212import orngHelp 
     
    579579        self.suggestItems = [QListWidgetItem(self.canvasDlg.getWidgetIcon(widget), widget.name) for widget in self.suggestDict.values()] 
    580580        self.categoriesYOffset = 0 
     581        self._canConnectCache = {} 
    581582                 
    582583    def showEvent(self, ev): 
     
    610611                    obj = obj.category 
    611612                    obj.setEnabled(True) 
    612             else:  
     613            else: 
    613614                act.setEnabled(False) 
    614      
     615 
     616    def selectInputActions(self, widgetInfo): 
     617        """Enable widgets which can consume the output from `widgetInfo`'s 
     618        output channels. 
     619         
     620        """ 
     621        for cat in self.allCatActions: 
     622            cat.setEnabled(False) 
     623 
     624        for act in self.allActions: 
     625            if self.canConnect(widgetInfo, act.widgetInfo): 
     626                act.setEnabled(True) 
     627                obj = act 
     628                while hasattr(obj, "category"): 
     629                    obj = obj.category 
     630                    obj.setEnabled(True) 
     631            else: 
     632                act.setEnabled(False) 
     633 
     634    def selectOutputActions(self, widgetInfo): 
     635        """Enable widgets which can produce the input for `widgetInfo`'s 
     636        input channels. 
     637          
     638        """ 
     639        for cat in self.allCatActions: 
     640            cat.setEnabled(False) 
     641 
     642        for act in self.allActions: 
     643            if self.canConnect(act.widgetInfo, widgetInfo): 
     644                act.setEnabled(True) 
     645                obj = act 
     646                while hasattr(obj, "category"): 
     647                    obj = obj.category 
     648                    obj.setEnabled(True) 
     649            else: 
     650                act.setEnabled(False) 
     651 
     652    def canConnect(self, outWidgetDesc, inWidgetDesc): 
     653        """Can connect any output from outWidgetDesc to input 
     654        from inWidgetDesc. 
     655         
     656        """ 
     657        if (outWidgetDesc, inWidgetDesc) not in self._canConnectCache: 
     658            ret = any(orngSignalManager.canConnect( 
     659                        resolveSignal(out), 
     660                        resolveSignal(in_), dynamic=True) \ 
     661                      for out in outWidgetDesc.outputs \ 
     662                      for in_ in inWidgetDesc.inputs 
     663                      ) 
     664            self._canConnectCache[(outWidgetDesc, inWidgetDesc)] = ret 
     665        return self._canConnectCache[(outWidgetDesc, inWidgetDesc)] 
     666 
    615667    def updateWidgesByOutputs(self, widgetInfo): 
    616         self.selectActions("outputClasses", widgetInfo.inputClasses) 
    617          
     668        self.selectOutputActions(widgetInfo) 
     669 
    618670    def updateWidgetsByInputs(self, widgetInfo): 
    619         self.selectActions("inputClasses", widgetInfo.outputClasses) 
    620      
     671        self.selectInputActions(widgetInfo) 
     672 
    621673    def updatePredictedWidgets(self, widgets, actClassesAttr, ioClasses=None): 
    622674        self.candidates = [] 
Note: See TracChangeset for help on using the changeset viewer.