Changeset 1902:a909124bd644 in orange-bioinformatics


Ignore:
Timestamp:
11/11/13 16:19:12 (5 months ago)
Author:
Ales Erjavec <ales.erjavec@…>
Branch:
default
Message:

Save/restore changed input set titles and selected attributes.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • orangecontrib/bio/widgets/OWVennDiagram.py

    r1901 r1902  
    3838 
    3939_InputData = namedtuple("_InputData", ["key", "name", "table"]) 
    40 _ItemSet = namedtuple("_ItemSet", ["key", "name", "items"]) 
     40_ItemSet = namedtuple("_ItemSet", ["key", "name", "title", "items"]) 
    4141 
    4242 
    4343class OWVennDiagram(OWWidget): 
    44     settingsList = ["selection", "autocommit"] 
     44    settingsList = ["selection", "autocommit", "inputhints"] 
    4545 
    4646    def __init__(self, parent=None, signalManager=None, 
     
    5353        self.selection = [] 
    5454 
     55        # Stored input set hints 
     56        # {(index, inputname, attributes): (selectedattrname, itemsettitle)} 
     57        self.inputhints = {} 
     58 
    5559        self.loadSettings() 
    5660 
     
    5963        # Diagram update is in progress 
    6064        self._updating = False 
     65        # Input update is in progress 
     66        self._inputUpdate = False 
    6167 
    6268        # Input datasets 
     
    112118    def setData(self, data, key=None): 
    113119        self.error(0) 
     120        if not self._inputUpdate: 
     121            self._storeHints() 
     122            self._inputUpdate = True 
     123 
    114124        if key in self.data: 
    115125            if data is None: 
     
    119129                # Update existing item 
    120130                self._update(key, data) 
    121                 self._invalidate([key]) 
    122131        else: 
    123132            # TODO: Allow setting more them 5 inputs and let the user 
     
    130139 
    131140    def handleNewSignals(self): 
     141        self._inputUpdate = False 
     142        incremental = all(inc for _, inc in self._queue) 
     143 
     144        if incremental: 
     145            self._updateItemsets() 
     146        else: 
     147            self._createItemsets() 
     148            self._restoreHints() 
     149            self._updateItemsets() 
     150 
     151        del self._queue[:] 
     152 
    132153        self._createDiagram() 
    133154        if self.data: 
     
    138159        OWWidget.handleNewSignals(self) 
    139160 
    140     def _invalidate(self, keys=None): 
     161    def _invalidate(self, keys=None, incremental=True): 
    141162        """ 
    142163        Invalidate input for a list of input keys. 
     
    145166            keys = self.data.keys() 
    146167 
    147         self._queue.extend(keys) 
     168        self._queue.extend((key, incremental) for key in keys) 
    148169 
    149170    def itemsetAttr(self, key): 
     
    183204        self._setAttributes(index, attrs) 
    184205 
    185         self._invalidate([key]) 
     206        self._invalidate([key], incremental=False) 
    186207 
    187208        item = self.inputsBox.layout().itemAt(index) 
     
    209230            box.setTitle(title) 
    210231 
    211         self._invalidate(None) 
     232        self._invalidate(None, incremental=False) 
    212233 
    213234    def _update(self, key, table): 
     
    225246        box.setTitle("Input: {}".format(name)) 
    226247 
    227     def _updateItemSets(self): 
    228         if self._queue: 
    229             # TODO: Update itemsets  only if changed. 
    230             self.itemsets.clear() 
    231             for key, input in self.data.items(): 
    232                 attr = self.itemsetAttr(key) 
    233                 items = [str(inst[attr]) for inst in input.table 
    234                          if not inst[attr].is_special()] 
    235  
    236                 if key in self.itemsets: 
    237                     item = self.itemsets[key] 
    238                     item = item._replace(items=items) 
    239                 else: 
    240                     item = _ItemSet(key=key, name=input.name, items=items) 
    241  
    242                 self.itemsets[key] = item 
    243  
    244             del self._queue[:] 
     248    def _updateItemsets(self): 
     249        assert self.data.keys() == self.itemsets.keys() 
     250        for key, input in self.data.items(): 
     251            attr = self.itemsetAttr(key) 
     252            items = [str(inst[attr]) for inst in input.table 
     253                     if not inst[attr].is_special()] 
     254 
     255            item = self.itemsets[key] 
     256            item = item._replace(items=items) 
     257            if item.name != input.name: 
     258                item = item._replace(name=input.name, title=input.name) 
     259            self.itemsets[key] = item 
     260 
     261    def _createItemsets(self): 
     262        olditemsets = dict(self.itemsets) 
     263        self.itemsets.clear() 
     264        for key, input in self.data.items(): 
     265            attr = self.itemsetAttr(key) 
     266            items = [str(inst[attr]) for inst in input.table 
     267                     if not inst[attr].is_special()] 
     268 
     269            title = input.name 
     270            if key in olditemsets and olditemsets[key].name == input.name: 
     271                title = olditemsets[key].title 
     272 
     273            itemset = _ItemSet(key=key, name=input.name, title=title, 
     274                               items=items) 
     275            self.itemsets[key] = itemset 
     276 
     277    def _storeHints(self): 
     278        if self.data: 
     279            self.inputhints.clear() 
     280            for i, (key, input) in enumerate(self.data.items()): 
     281                attrs = string_attributes(input.table.domain) 
     282                attrs = tuple(attr.name for attr in attrs) 
     283                selected = self.itemsetAttr(key) 
     284                itemset = self.itemsets[key] 
     285                self.inputhints[(i, input.name, attrs)] = \ 
     286                    (selected.name, itemset.title) 
     287 
     288    def _restoreHints(self): 
     289        settings = [] 
     290        for i, (key, input) in enumerate(self.data.items()): 
     291            attrs = string_attributes(input.table.domain) 
     292            attrs = tuple(attr.name for attr in attrs) 
     293            hint = self.inputhints.get((i, input.name, attrs), None) 
     294            if hint is not None: 
     295                attr, name = hint 
     296                attr_ind = attrs.index(attr) 
     297                settings.append((attr_ind, name)) 
     298            else: 
     299                return 
     300 
     301        # all inputs match the stored hints 
     302        for i, key in enumerate(self.itemsets): 
     303            attr, itemtitle = settings[i] 
     304            self.itemsets[key] = self.itemsets[key]._replace(title=itemtitle) 
     305            _, cb = self._controlAtIndex(i) 
     306            cb.setCurrentIndex(attr) 
    245307 
    246308    def _createDiagram(self): 
     
    248310 
    249311        oldselection = list(self.selection) 
    250  
    251         self._updateItemSets() 
    252312 
    253313        self.vennwidget.clear() 
     
    259319 
    260320        for i, (key, item) in enumerate(self.itemsets.items()): 
    261             gr = VennSetItem(text=item.name, count=len(item.items)) 
     321            gr = VennSetItem(text=item.title, count=len(item.items)) 
    262322            color = colors[i] 
    263323            color.setAlpha(100) 
     
    330390 
    331391        self._invalidate([key]) 
     392        self._updateItemsets() 
    332393        self._createDiagram() 
    333394 
     
    335396        text = str(text) 
    336397        key = self.itemsets.keys()[index] 
    337         self.itemsets[key] = self.itemsets[key]._replace(name=text) 
     398        self.itemsets[key] = self.itemsets[key]._replace(title=text) 
    338399 
    339400    def invalidateOutput(self): 
     
    376437        dlg = OWChooseImageSizeDlg(self.scene, parent=self) 
    377438        dlg.exec_() 
     439 
     440    def getSettings(self, *args, **kwargs): 
     441        self._storeHints() 
     442        return OWWidget.getSettings(self, *args, **kwargs) 
    378443 
    379444 
Note: See TracChangeset for help on using the changeset viewer.