Changeset 3593:99d425e23762 in orange


Ignore:
Timestamp:
04/26/07 15:15:40 (7 years ago)
Author:
janezd <janez.demsar@…>
Branch:
default
Convert:
d4f028660179df9792c206a3a6dffe1803f22456
Message:
  • saves contexts
  • other improvements
File:
1 edited

Legend:

Unmodified
Added
Removed
  • orange/OrangeWidgets/Prototypes/OWFeatureConstructor.py

    r3590 r3593  
    11""" 
    22<name>Feature Constructor</name> 
    3 <description>Construct a new continuous attribute computed from existing attributes with an.</description> 
     3<description>Construct a new continuous attribute computed from existing attributes.</description> 
    44<icon>icons/FeatureConstructor.png</icon> 
    55<priority>11</priority> 
     
    4040 
    4141class OWFeatureConstructor(OWWidget): 
     42    contextHandlers = {"": PerfectDomainContextHandler()} 
     43     
    4244    def __init__(self,parent=None, signalManager = None): 
    4345        OWWidget.__init__(self, parent, signalManager, "FeatureConstructor") 
     
    5456        self.selectedAttr = 0 
    5557        self.selectedFunc = 0 
    56          
    57         hb = OWGUI.widgetBox(self.controlArea, None, "horizontal") 
     58        self.autosend = True 
     59         
     60        db = OWGUI.widgetBox(self.controlArea, "Attribute definitions", addSpace = True) 
     61         
     62        OWGUI.separator(db, 4) 
     63 
     64        hb = OWGUI.widgetBox(db, None, "horizontal") 
    5865         
    5966        vb = OWGUI.widgetBox(hb, None, "vertical") 
     
    7279        OWGUI.button(hb, self, "Clear", callback = self.clearLineEdits) 
    7380         
    74         OWGUI.separator(self.controlArea, 12, 12) 
    75  
    76         hb = OWGUI.widgetBox(self.controlArea, None, "horizontal") 
     81        OWGUI.separator(db) 
     82 
     83        hb = OWGUI.widgetBox(db, None, "horizontal") 
    7784        OWGUI.button(hb, self, "Add", callback = self.addAttr) 
    7885        OWGUI.button(hb, self, "Update", callback = self.updateAttr) 
     
    8087        OWGUI.button(hb, self, "Remove All", callback = self.removeAllAttr) 
    8188         
    82         OWGUI.separator(self.controlArea) 
    83         self.lbDefinitions = OWGUI.listBox(self.controlArea, self, "selectedDef", "defLabels", callback=self.selectAttr) 
     89        OWGUI.separator(db) 
     90        self.lbDefinitions = OWGUI.listBox(db, self, "selectedDef", "defLabels", callback=self.selectAttr) 
    8491        self.lbDefinitions.setFixedHeight(160) 
    8592 
    86         OWGUI.separator(self.controlArea) 
    87         OWGUI.button(self.controlArea, self, "Apply", callback = self.apply) 
    88  
    89         self.definitions = [("x", '"petal length"+2'), ("z", "x+2"), ("u", "x+z"), ("zz", '"petal length"**3+"sepal length"')] 
    90         self.loadDefinitions() 
     93        hb = OWGUI.widgetBox(self.controlArea, "Apply", "horizontal") 
     94        OWGUI.button(hb, self, "Apply", callback = self.apply) 
     95        cb = OWGUI.checkBox(hb, self, "autosend", "Apply automatically", callback=self.enableAuto) 
     96        cb.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)) 
     97 
    9198        self.adjustSize() 
    9299 
    93100 
    94     def loadDefinitions(self): 
     101    def settingsFromWidgetCallback(self, handler, context): 
     102        context.definitions = self.definitions 
     103 
     104 
     105    def settingsToWidgetCallback(self, handler, context): 
     106        self.definitions = getattr(context, "definitions", []) 
    95107        self.defLabels = ["%s := %s" % t for t in self.definitions] 
    96108        self.selectedDef = [] 
    97109 
     110 
    98111    def setData(self, data): 
     112        self.closeContext() 
    99113        if not self.data or self.data.domain != data.domain: 
    100114            self.clearLineEdits() 
     
    105119            for attr in self.data.domain: 
    106120                self.cbAttrs.insertItem(attr.name) 
     121        self.removeAllAttr() 
     122        self.openContext("", data) 
     123        self.apply() 
    107124         
    108125         
     
    110127        self.expression = self.attrname = "" 
    111128         
     129         
    112130    def addAttr(self): 
    113         if not self.attrname: 
     131        attrname = self.attrname.strip() 
     132        if not attrname: 
    114133            self.leAttrName.setFocus() 
    115134            return 
    116         if not self.expression: 
     135         
     136        expression = self.expression.strip() 
     137        if not expression: 
    117138            self.leExpression.setFocus() 
    118139            return 
    119         self.defLabels = self.defLabels + ["%s := %s" % (self.attrname, self.expression)] 
    120         self.definitions.append((self.attrname, self.expression)) 
     140        self.defLabels = self.defLabels + ["%s := %s" % (attrname, expression)] 
     141        self.definitions.append((attrname, expression)) 
    121142        self.expression = self.attrname = "" 
     143        self.applyIf() 
     144         
    122145         
    123146    def removeAttr(self): 
     
    127150                self.defLabels = self.defLabels[:selected] + self.defLabels[selected+1:] 
    128151                del self.definitions[selected] 
     152                self.applyIf() 
     153 
    129154 
    130155    def removeAllAttr(self): 
    131156        self.defLabels = [] 
    132157        self.definitions = [] 
     158        self.selectedDef = [] 
    133159        self.clearLineEdits() 
     160        self.applyIf() 
     161         
    134162         
    135163    def updateAttr(self): 
    136         selected = self.selectedDef[0] 
    137         if 0 <= selected < self.lbDefinitions.count(): 
    138             self.defLabels = self.defLabels[:selected] + ["%s := %s" % (self.attrname, self.expression)] + self.defLabels[selected+1:] 
    139             self.definitions[selected] = (self.attrname, self.expression) 
     164        if self.selectedDef: 
     165            selected = self.selectedDef[0] 
     166            if 0 <= selected < self.lbDefinitions.count(): 
     167                self.defLabels = self.defLabels[:selected] + ["%s := %s" % (self.attrname, self.expression)] + self.defLabels[selected+1:] 
     168                self.definitions[selected] = (self.attrname, self.expression) 
     169                self.applyIf() 
     170     
    140171     
    141172    def selectAttr(self): 
     
    146177            self.attrname = self.expression = "" 
    147178         
     179         
    148180    def insertIntoExpression(self, what): 
    149181        if self.leExpression.hasMarkedText(): 
     
    153185        self.expression = self.expression[:cp] + what + self.expression[cp:] 
    154186        self.leExpression.setFocus() 
     187     
    155188     
    156189    def attrListSelected(self): 
     
    163196            self.insertIntoExpression(attr) 
    164197            self.selectedAttr = 0 
     198         
    165199         
    166200    def funcListSelected(self): 
     
    179213         
    180214     
     215    def applyIf(self): 
     216        self.dataChanged = True 
     217        if self.autosend: 
     218            self.apply() 
     219             
     220             
     221    def enableAuto(self): 
     222        if self.dataChanged: 
     223            self.apply() 
     224 
     225     
    181226    def apply(self): 
     227        self.dataChanged = False 
    182228        if not self.data: 
    183229            self.send("Examples", None) 
     
    187233 
    188234        names = [d[0] for d in self.definitions] 
     235        for name in names: 
     236            if names.count(name)>1 or name in oldDomain > 1: 
     237                self.error(1, "Multiple attributes with the same name (%s)" % name) 
     238                self.send("Examples", None) 
     239                return 
     240             
    189241        unknown = [[name, exp, set([id[0] or id[1] for id in re_identifier.findall(exp) if id[0] in names or id[1][1:-1] in names])] for name, exp in self.definitions] 
    190242        reinserted = {} 
Note: See TracChangeset for help on using the changeset viewer.