Changeset 3484:1bdeaf2b26c1 in orange


Ignore:
Timestamp:
04/04/07 13:28:56 (7 years ago)
Author:
Gregor <Gregor@…>
Branch:
default
Convert:
cf173c252460f847bc12f9b20500c8df582de8d1
Message:
  • added handleNewSignals
  • added isDataWithClass()
  • removed ExampleTableWithClass
File:
1 edited

Legend:

Unmodified
Added
Removed
  • orange/OrangeWidgets/OWBaseWidget.py

    r3412 r3484  
    2222        print "unable to set setting ", name, " to value ", value 
    2323    else: 
    24         if hasattr(grandparent, "__setattr__"): 
     24        if hasattr(grandparent, "__setattr__") and isinstance(obj, grandparent): 
    2525            grandparent.__setattr__(obj, lastname,  value) 
    2626        else: 
     
    4545                if controlledAttributes: 
    4646                    fullName = myself + "." + name 
    47                      
     47 
    4848                    controlCallback = controlledAttributes.get(fullName, None) 
    4949                    if controlCallback: 
     
    7272    pass 
    7373 
    74 class ExampleTableWithClass(ExampleTable): 
    75     pass 
     74#class ExampleTableWithClass(ExampleTable): 
     75#    pass 
    7676 
    7777class AttributeList(list): 
     
    9595        if savePosition: 
    9696            self.settingsList = getattr(self, "settingsList", []) + ["widgetWidth", "widgetHeight", "widgetXPosition", "widgetYPosition", "widgetShown"] 
    97          
     97 
    9898        self.title = title.replace("&","") 
    9999 
    100100        QDialog.__init__(self, parent, self.title, modal, Qt.WStyle_Customize + Qt.WStyle_NormalBorder + Qt.WStyle_Title + Qt.WStyle_SysMenu + Qt.WStyle_Minimize + Qt.WStyle_Maximize) 
    101          
     101 
    102102        # directories are better defined this way, otherwise .ini files get written in many places 
    103103        self.widgetDir = os.path.dirname(__file__) + "/" 
    104104 
    105105        # create output directory for widget settings 
    106         if os.name == "nt": self.outputDir = self.widgetDir 
    107         else:               self.outputDir = os.path.join(user.home, "Orange") 
     106        if os.name == "nt": 
     107            self.outputDir = os.path.join(os.path.join(user.home, "Application Data"), "Orange")                  # directory for saving settings and stuff 
     108        else: 
     109            self.outputDir = os.path.join(user.home, "Orange")                  # directory for saving settings and stuff 
    108110        if not os.path.exists(self.outputDir): os.mkdir(self.outputDir) 
    109111        self.outputDir = os.path.join(self.outputDir, "widgetSettings") 
    110112        if not os.path.exists(self.outputDir): os.mkdir(self.outputDir) 
    111          
     113 
    112114        self.loadContextSettings() 
    113          
     115 
    114116        self.captionTitle = title.replace("&","")     # used for widget caption 
    115117 
     
    137139        self.callbackDeposit = [] 
    138140        self.startTime = time.time()    # used in progressbar 
    139          
     141 
    140142        self.widgetStateHandler = None 
    141143        self.widgetState = {"Info":{}, "Warning":{}, "Error":{}} 
    142      
     144 
    143145        #the title 
    144146        self.setCaption(self.captionTitle) 
     
    171173        return OWGUI.getAttributeIcons() 
    172174 
     175    def isDataWithClass(self, data, wantedVarType = None): 
     176        self.error([1234, 1235]) 
     177        if not data: 
     178            return 0 
     179        if not data.domain.classVar: 
     180            self.error(1234, "A data set with a class attribute is required.") 
     181            return 0 
     182        if wantedVarType and data.domain.classVar.varType != wantedVarType: 
     183            self.error(1235, "Unable to handle %s class." % (data.domain.classVar.varType == orange.VarTypes.Discrete and "discrete" or "continuous")) 
     184            return 0 
     185        return 1 
     186 
    173187    # call processEvents(), but first remember position and size of widget in case one of the events would be move or resize 
    174188    # call this function if needed in __init__ of the widget 
     
    190204            if getattr(self, "widgetWidth", None) != None and getattr(self, "widgetHeight", None) != None: 
    191205                self.resize(self.widgetWidth, self.widgetHeight) 
    192              
     206 
    193207    # this is called in canvas when loading a schema. it opens the widgets that were shown when saving the schema 
    194208    def restoreWidgetStatus(self): 
     
    204218            self.widgetHeight = self.height() 
    205219##            print self.title, "saving resize", self.widgetWidth, self.widgetHeight 
    206              
     220 
    207221 
    208222    # when widget is moved, save new x and y position into widgetXPosition and widgetYPosition. some widgets can put this two 
     
    234248        self.captionTitle = caption     # we have to save caption title in case progressbar will change it 
    235249        self.setCaption(caption) 
    236          
     250 
    237251    # put this widget on top of all windows 
    238252    def reshow(self): 
     
    243257        if not self.hasOutputName(signalName): 
    244258            print "Warning! Signal '%s' is not a valid signal name for the '%s' widget. Please fix the signal name." % (signalName, self.title) 
    245              
     259 
    246260        if self.linksOut.has_key(signalName): 
    247261            self.linksOut[signalName][id] = value 
    248262        else: 
    249263            self.linksOut[signalName] = {id:value} 
    250              
     264 
    251265        self.signalManager.send(self, signalName, value, id) 
    252266 
     
    263277 
    264278    # Set all settings 
    265     # settings - the map with the settings        
     279    # settings - the map with the settings 
    266280    def setSettings(self,settings): 
    267281        for key in settings: 
     
    295309            return file 
    296310 
    297          
    298     # Loads settings from the widget's .ini file  
     311 
     312    # Loads settings from the widget's .ini file 
    299313    def loadSettings(self, file = None): 
    300314        file = self.getSettingsFile(file) 
     
    305319                settings = None 
    306320 
    307             # can't close everything into one big try-except since this would mask all errors in the below code                 
     321            # can't close everything into one big try-except since this would mask all errors in the below code 
    308322            if settings: 
    309323                if hasattr(self, "settingsList"): 
    310324                    self.setSettings(settings) 
    311                  
     325 
    312326                contextHandlers = getattr(self, "contextHandlers", {}) 
    313327                for contextHandler in contextHandlers.values(): 
     
    320334                            setattr(self, contextHandler.localContextName, contextHandler.globalContexts) 
    321335 
    322                      
     336 
    323337    def loadContextSettings(self, file = None): 
    324338        if not hasattr(self.__class__, "savedContextSettings"): 
     
    330344                    settings = None 
    331345 
    332                 # can't close everything into one big try-except since this would mask all errors in the below code                 
    333                 if settings:                     
     346                # can't close everything into one big try-except since this would mask all errors in the below code 
     347                if settings: 
    334348                    if settings.has_key("savedContextSettings"): 
    335349                        self.__class__.savedContextSettings = settings["savedContextSettings"] 
    336350                        return 
    337                  
     351 
    338352            self.__class__.savedContextSettings = {} 
    339353 
     
    341355    def saveSettings(self, file = None): 
    342356        settings = self.getSettings() 
    343          
     357 
    344358        contextHandlers = getattr(self, "contextHandlers", {}) 
    345359        for contextHandler in contextHandlers.values(): 
     
    347361            settings[contextHandler.localContextName] = contextHandler.globalContexts 
    348362 
    349         if settings:                     
     363        if settings: 
    350364            if file==None: 
    351365                file = os.path.join(self.outputDir, self.title + ".ini") 
     
    358372        if str == None or str == "": 
    359373            return 
    360          
     374 
    361375        settings = cPickle.loads(str) 
    362376        self.setSettings(settings) 
     
    371385        str = "" 
    372386        settings = self.getSettings() 
    373          
     387 
    374388        contextHandlers = getattr(self, "contextHandlers", {}) 
    375389        for contextHandler in contextHandlers.values(): 
     
    382396        pass 
    383397 
    384     # reimplemented in other widgets         
     398    # reimplemented in other widgets 
    385399    def setOptions(self): 
    386400        pass 
     
    416430        #QWidget.connect(control, signal, method)        # ordinary connection useful for dialogs and windows that don't send signals to other widgets 
    417431 
    418    
     432 
    419433    def disconnect(self, control, signal, method): 
    420434        wrapper = self.connections[(control, signal)] 
    421435        QDialog.disconnect(control, signal, wrapper) 
    422436 
    423    
     437 
    424438    def signalIsOnlySingleConnection(self, signalName): 
    425439        for i in self.inputs: 
     
    432446                handler = self.inputs[i][2] 
    433447                break 
    434              
     448 
    435449        existing = [] 
    436450        if self.linksIn.has_key(signalName): 
     
    457471            input = InputSignal(*i) 
    458472            if input.name == signal and not input.single: return None 
    459              
     473 
    460474        for signalName in self.linksIn.keys(): 
    461475            if signalName == signal: 
     
    463477                del self.linksIn[signalName] 
    464478                return widget 
    465                 
     479 
    466480        return None 
    467481 
     
    469483    def processSignals(self): 
    470484        if self.processingHandler: self.processingHandler(self, 1)    # focus on active widget 
    471          
     485 
    472486        # we define only a way to handle signals that have defined a handler function 
    473         for key in self.linksIn.keys(): 
    474             for i in range(len(self.linksIn[key])): 
    475                 (dirty, widgetFrom, handler, signalData) = self.linksIn[key][i] 
    476                 if not (handler and dirty): continue 
    477                  
    478                 qApp.setOverrideCursor(QWidget.waitCursor) 
    479                 try:                     
    480                     for (value, id, nameFrom) in signalData: 
    481                         if self.signalIsOnlySingleConnection(key): 
    482                             self.printEvent("ProcessSignals: Calling %s with %s" % (handler, value), eventVerbosity = 2) 
    483                             handler(value) 
    484                         else: 
    485                             self.printEvent("ProcessSignals: Calling %s with %s (%s, %s)" % (handler, value, nameFrom, id), eventVerbosity = 2) 
    486                             handler(value, (widgetFrom, nameFrom, id)) 
    487                 except: 
    488                     type, val, traceback = sys.exc_info() 
    489                     sys.excepthook(type, val, traceback)  # we pretend that we handled the exception, so that we don't crash other widgets 
    490  
    491                 qApp.restoreOverrideCursor() 
    492                 self.linksIn[key][i] = (0, widgetFrom, handler, []) # clear the dirty flag 
     487        for signal in self.inputs:        # we go from the first to the last defined input 
     488            key = signal[0] 
     489            if self.linksIn.has_key(key): 
     490                for i in range(len(self.linksIn[key])): 
     491                    (dirty, widgetFrom, handler, signalData) = self.linksIn[key][i] 
     492                    if not (handler and dirty): continue 
     493 
     494                    qApp.setOverrideCursor(QWidget.waitCursor) 
     495                    try: 
     496                        for (value, id, nameFrom) in signalData: 
     497                            if self.signalIsOnlySingleConnection(key): 
     498                                self.printEvent("ProcessSignals: Calling %s with %s" % (handler, value), eventVerbosity = 2) 
     499                                handler(value) 
     500                            else: 
     501                                self.printEvent("ProcessSignals: Calling %s with %s (%s, %s)" % (handler, value, nameFrom, id), eventVerbosity = 2) 
     502                                handler(value, (widgetFrom, nameFrom, id)) 
     503                    except: 
     504                        type, val, traceback = sys.exc_info() 
     505                        sys.excepthook(type, val, traceback)  # we pretend that we handled the exception, so that we don't crash other widgets 
     506 
     507                    qApp.restoreOverrideCursor() 
     508                    self.linksIn[key][i] = (0, widgetFrom, handler, []) # clear the dirty flag 
     509 
     510        if hasattr(self, "handleNewSignals"): 
     511            self.handleNewSignals() 
    493512 
    494513        if self.processingHandler: 
     
    523542        self.setCaption(self.captionTitle + " (0% complete)") 
    524543        if self.progressBarHandler: self.progressBarHandler(self, -1) 
    525          
     544 
    526545    def progressBarSet(self, value): 
    527546        if value > 0: 
     
    566585    def printEvent(self, text, eventVerbosity = 1): 
    567586        self.signalManager.addEvent(self.captionTitle[3:] + ": " + text, eventVerbosity = eventVerbosity) 
    568         if self.eventHandler:  
     587        if self.eventHandler: 
    569588            self.eventHandler(self.captionTitle[3:] + ": " + text, eventVerbosity) 
    570589 
     
    592611            pass 
    593612 
    594          
     613 
    595614    def keyPressEvent(self, e): 
    596615        if e.key() == 0x1030: 
    597616            self.openWidgetHelp() 
    598 #            e.ignore()             
     617#            e.ignore() 
    599618        else: 
    600619            QDialog.keyPressEvent(self, e) 
     
    602621    def information(self, id = 0, text = None): 
    603622        self.setState("Info", id, text) 
    604          
     623 
    605624    def warning(self, id = 0, text = ""): 
    606625        self.setState("Warning", id, text) 
    607          
     626 
    608627    def error(self, id = 0, text = ""): 
    609628        self.setState("Error", id, text) 
    610          
     629 
    611630    def setState(self, stateType, id, text): 
    612         if type(id) == str: 
    613             text = id; id = 0       # if we call information(), warning(), or error() function with only one parameter - a string - then set id = 0 
    614         if not text: 
    615             if self.widgetState[stateType].has_key(id): 
    616                 self.widgetState[stateType].pop(id) 
     631        if type(id) == list: 
     632            for val in id: 
     633                if self.widgetState[stateType].has_key(val): 
     634                    self.widgetState[stateType].pop(val) 
    617635        else: 
    618             self.widgetState[stateType][id] = text 
    619          
     636            if type(id) == str: 
     637                text = id; id = 0       # if we call information(), warning(), or error() function with only one parameter - a string - then set id = 0 
     638            if not text: 
     639                if self.widgetState[stateType].has_key(id): 
     640                    self.widgetState[stateType].pop(id) 
     641            else: 
     642                self.widgetState[stateType][id] = text 
     643 
    620644        if self.widgetStateHandler: 
    621645            self.widgetStateHandler() 
     
    669693            prefix += parts[0] 
    670694            controlledName = parts[1] 
    671          
     695 
    672696    def __setattr__(self, name, value): 
    673697        return unisetattr(self, name, value, QDialog) 
     
    675699    def randomlyChangeSettings(self, verboseMode = 0): 
    676700        if len(self._guiElements) == 0: return 
    677          
     701 
    678702        try: 
    679703            index = random.randint(0, len(self._guiElements)-1) 
     
    683707                widget.randomChange() 
    684708                return 
    685              
     709 
    686710            if not widget.isEnabled(): return 
    687711            newValue = "" 
     
    753777            for i, setting in enumerate(getattr(self, "settingsList", [])): 
    754778                sys.stderr.write("%30s: %7s\n" % (setting, str(self.getdeepattr(setting)))) 
    755                  
    756  
    757 if __name__ == "__main__":   
     779 
     780 
     781if __name__ == "__main__": 
    758782    a=QApplication(sys.argv) 
    759783    oww=OWBaseWidget() 
Note: See TracChangeset for help on using the changeset viewer.