Ignore:
Timestamp:
05/28/13 19:02:57 (11 months ago)
Author:
Martin Frlin <martin.frlin@…>
Branch:
default
Message:

Added undo and redo but it is still buggy at the moment.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • Orange/OrangeWidgets/Data/OWPaintData.py

    r11566 r11567  
    77""" 
    88import orange 
     9 
     10import copy 
    911 
    1012from PyQt4 import QtCore 
     
    4850            self.removeDrawingCurves() 
    4951            data = self.data 
     52 
    5053        clsValues, hasCls = (self.data.domain.classVar.values, True) if self.data.domain.classVar else ([0], False) 
    5154         
     
    708711         
    709712        self.classVariable = orange.EnumVariable("Class label", values=["Class 1", "Class 2"], baseValue=0) 
    710          
     713 
     714        ur = OWGUI.widgetBox(self.controlArea, "Undo / Redo") 
     715        undo = QAction("Undo", self) 
     716        undo.pyqtConfigure(toolTip="Undo action") 
     717        self.connect(undo, SIGNAL("triggered()"), self.undoAction) 
     718 
     719        redo = QAction("Redo", self) 
     720        redo.pyqtConfigure(toolTip="Redo action") 
     721        self.connect(redo, SIGNAL("triggered()"), self.redoAction) 
     722 
     723        actionsWidget =  ModelActionsWidget([undo, redo], self) 
     724        actionsWidget.layout().addStretch(10) 
     725        actionsWidget.layout().setSpacing(1) 
     726 
     727        ur.layout().addWidget(actionsWidget) 
     728 
     729 
    711730        w = OWGUI.widgetBox(self.controlArea, "Class Label") 
    712731         
     
    779798        self.graph.setAttribute(Qt.WA_Hover, True) 
    780799        self.mainArea.layout().addWidget(self.graph) 
     800 
    781801         
    782802        self.currentOptionsWidget = None 
     
    787807        self.onDomainChanged() 
    788808        self.toolActions.actions()[0].trigger() 
     809 
     810        self.dataHistory = [(orange.ExampleTable(self.domain), ["Class 1", "Class 2"])] 
     811        self.historyCounter = 0 
     812        self.updateHistoryBool = True 
    789813         
    790814        self.resize(800, 600) 
    791          
     815 
    792816    def addNewClassLabel(self): 
    793817        i = 1 
     
    815839         
    816840        self.removeClassLabel.setEnabled(len(self.classValuesModel) > 1) 
    817          
    818     def removeSelectedClassLabel(self): 
     841 
     842        self.updateHistory() 
     843         
     844    def removeSelectedClassLabel(self, label=None): 
    819845        index = self.selectedClassLabelIndex() 
    820846        if index is not None and len(self.classValuesModel) > 1: 
    821             label = self.classValuesModel[index] 
     847            if not label: 
     848                label = self.classValuesModel[index] 
    822849            examples = [ex for ex in self.graph.data if str(ex.getclass()) != label] 
     850            print examples 
    823851             
    824852            values = [val for val in self.classValuesModel if val != label] 
     853            print "we have values" 
    825854            newclass = orange.EnumVariable("Class label", values=values) 
    826855            newdomain = orange.Domain(self.graph.data.domain.attributes, newclass) 
     
    829858                if ex[self.classVariable] != label and ex[self.classVariable] in values: 
    830859                    newdata.append(orange.Example(newdomain, [ex[a] for a in ex.domain.attributes] + [str(ex.getclass())])) 
    831                  
     860 
    832861            self.classVariable = newclass 
    833862            self.classValuesModel.wrap(self.classVariable.values) 
     
    839868            self.classValuesView.selectionModel().select(newindex, QItemSelectionModel.ClearAndSelect) 
    840869             
    841             self.removeClassLabel.setEnabled(len(self.classValuesModel) > 1)  
     870            self.removeClassLabel.setEnabled(len(self.classValuesModel) > 1) 
     871 
     872            self.updateHistory() 
    842873         
    843874    def selectedClassLabelIndex(self): 
     
    865896            self.connect(newtool, SIGNAL("editing()"), self.onDataChanged) 
    866897            self.connect(newtool, SIGNAL("editingFinished()"), self.commitIf) 
     898            self.connect(newtool, SIGNAL("editingFinished()"), self.updateHistory) 
    867899            self.toolsStackCache[tool] = (newtool, option) 
    868900         
     
    871903        self.currentTool.setGraph(self.graph) 
    872904 
    873          
     905    def updateHistory(self): 
     906        if not self.updateHistoryBool: 
     907            return 
     908        if not self.historyCounter == len(self.dataHistory)-1: 
     909            self.dataHistory = self.dataHistory[self.historyCounter:] 
     910        labels = list(self.classValuesModel) 
     911        self.dataHistory.append((copy.deepcopy(self.graph.data), labels)) 
     912        if len(self.dataHistory) > 10: 
     913            self.dataHistory.pop(0) 
     914        self.historyCounter += 1 
     915        self.historyCounter %= len(self.dataHistory) 
     916        print self.historyCounter 
     917        print self.dataHistory[self.historyCounter] 
     918 
     919    def undoAction(self): 
     920        if self.historyCounter > 0: 
     921            self.historyCounter -= 1 
     922            data, labels = self.dataHistory[self.historyCounter] 
     923            self.graph.setData(data, 0, 1) 
     924            self.updateHistoryBool = False 
     925            if len(self.classValuesModel) > len(labels): 
     926                diff = set(self.classValuesModel) - set(labels) 
     927                self.removeSelectedClassLabel(label=diff.pop()) 
     928            if len(self.classValuesModel) < len(labels): 
     929                self.addNewClassLabel() 
     930            self.updateHistoryBool = True 
     931            print self.dataHistory[self.historyCounter] 
     932 
     933    def redoAction(self): 
     934        if self.historyCounter < len(self.dataHistory)-1: 
     935            self.historyCounter += 1 
     936            data, labels = self.dataHistory[self.historyCounter] 
     937            self.graph.setData(data, 0, 1) 
     938            self.updateHistoryBool = False 
     939            if len(self.classValuesModel) > len(labels): 
     940                diff = set(self.classValuesModel) - set(labels) 
     941                self.removeSelectedClassLabel(label=diff.pop()) 
     942            if len(self.classValuesModel) < len(labels): 
     943                self.addNewClassLabel() 
     944            self.updateHistoryBool = True 
     945            print self.dataHistory[self.historyCounter] 
     946 
    874947    def onDomainChanged(self, *args): 
    875948        if self.variablesModel: 
     
    902975            data = orange.ExampleTable(domain, data) 
    903976        self.send("Data", data) 
     977 
    904978         
    905979         
Note: See TracChangeset for help on using the changeset viewer.