Changeset 6987:ca2bad151445 in orange


Ignore:
Timestamp:
09/24/10 14:31:47 (4 years ago)
Author:
ales_erjavec <ales.erjavec@…>
Branch:
default
Convert:
250b05c589edace59ccd05fc638fbdd2772b4368
Message:
  • added script Library to PythonScript
Location:
orange/OrangeWidgets
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • orange/OrangeWidgets/OWItemModels.py

    r6972 r6987  
    123123    def __bool__(self): 
    124124        return len(self) != 0 
     125     
     126    def emitDataChanged(self, indexList): 
     127        if isinstance(indexList, int): 
     128            indexList = [indexList] 
     129        for ind in indexList: 
     130            self.emit(SIGNAL("dataChanged(QModelIndex, QModelIndex)"), self.index(ind), self.index(ind)) 
     131             
    125132 
    126133import OWGUI 
  • orange/OrangeWidgets/Prototypes/OWPythonScript.py

    r6970 r6987  
    205205            QPlainTextEdit.keyPressEvent(self, event) 
    206206             
    207 #    def mousePressEvent(self, event): 
    208 #        pos = event.pos() 
    209 #        cursor = self.cursorForPosition(pos) 
    210 #        if cursor.position() <= self.newPromptPos: 
    211 #            self.cursorPosAtMousePress = cursor.position() 
    212 #        QPlainTextEdit.mousePressEvent(self, event) 
    213 #         
    214 #    def mouseReleaseEvent(self, event): 
    215 #        pos = event.pos() 
    216 #        cursor = self.cursorForPosition(pos) 
    217 #        pos = cursor.position() 
    218 #        QPlainTextEdit.mousePressEvent(self, event) 
    219 #        if cursor.position() <= self.newPromptPos: 
    220 #            cursor = QTextCursor(self.textCursor()) 
    221 #            cursor.setPosition(self.cursorPosAtMousePress) 
    222 ##            cursor.movePosition(QTextCursor.End) 
    223 #            self.setTextCursor(cursor) 
    224              
    225207    def historyUp(self): 
    226208        self.setLine(self.history[self.historyInd]) 
     
    233215    def complete(self): 
    234216        pass 
    235  
     217     
     218from OWItemModels import PyListModel, ModelActionsWidget 
     219 
     220class Script(object): 
     221    Modified = 1 
     222    MissingFromFilesystem = 2  
     223    def __init__(self, name, script, flags=0, sourceFileName=None): 
     224        self.name = name 
     225        self.script = script 
     226        self.flags = flags 
     227        self.sourceFileName = sourceFileName 
     228        self.modifiedScript = None 
     229 
     230class ScriptItemDelegate(QStyledItemDelegate): 
     231    def __init__(self, parent): 
     232        QStyledItemDelegate.__init__(self, parent) 
     233         
     234    def displayText(self, variant, locale): 
     235        script = variant.toPyObject() 
     236        return QString(script.name) 
     237     
     238    def paint(self, painter, option, index): 
     239        script = index.data(Qt.DisplayRole).toPyObject() 
     240        if script.flags & Script.Modified: 
     241            painter.save() 
     242            painter.setBrush(QBrush(Qt.red)) 
     243            painter.drawRect(option.rect) 
     244            painter.restore() 
     245        QStyledItemDelegate.paint(self, painter, option, index) 
     246         
     247    def createEditor(self, parent, option, index): 
     248        return QLineEdit(parent) 
     249     
     250    def setEditorData(self, editor, index): 
     251        script = index.data(Qt.DisplayRole).toPyObject() 
     252        editor.setText(script.name) 
     253         
     254    def setModelData(self, editor, model, index): 
     255        model[index.row()].name = str(editor.text()) 
     256         
    236257class OWPythonScript(OWWidget): 
    237258     
    238     settingsList = ["codeFile"]  
     259    settingsList = ["codeFile", "libraryListSource", "currentScriptIndex"] 
    239260                     
    240261    def __init__(self, parent=None, signalManager=None): 
    241262        OWWidget.__init__(self, parent, signalManager, 'Python Script') 
    242263         
    243         self.inputs = [("inExampleTable", ExampleTable, self.setExampleTable), ("inDistanceMatrix", orange.SymMatrix, self.setDistanceMatrix), ("inNetwork", orngNetwork.Network, self.setNetwork), ("inLearner", orange.Learner, self.setLearner), ("inClassifier", orange.Classifier, self.setClassifier)] 
    244         self.outputs = [("outExampleTable", ExampleTable), ("outDistanceMatrix", orange.SymMatrix), ("outNetwork", orngNetwork.Network), ("outLearner", orange.Learner), ("outClassifier", orange.Classifier)] 
     264        self.inputs = [("in_data", ExampleTable, self.setExampleTable), ("in_distance", orange.SymMatrix, self.setDistanceMatrix), ("in_network", orngNetwork.Network, self.setNetwork), ("in_learner", orange.Learner, self.setLearner), ("in_classifier", orange.Classifier, self.setClassifier)] 
     265        self.outputs = [("out_data", ExampleTable), ("out_distance", orange.SymMatrix), ("out_network", orngNetwork.Network), ("out_learner", orange.Learner), ("out_classifier", orange.Classifier)] 
    245266         
    246267        self.inNetwork = None 
     
    248269        self.inDistanceMatrix = None 
    249270        self.codeFile = '' 
    250          
     271        self.libraryListSource = [Script("Hello world", "print 'Hello world'\n")] 
     272        self.currentScriptIndex = 0 
    251273        self.loadSettings() 
    252274         
     275        for s in self.libraryListSource: 
     276            s.flags = 0 
     277         
     278        self._cachedDocuments = {} 
     279         
    253280        self.infoBox = OWGUI.widgetBox(self.controlArea, 'Info') 
    254         OWGUI.label(self.infoBox, self, "Execute python script.\n\nInput variables:\n - " + \ 
    255                     "\n - ".join(t[0] for t in self.inputs) + "\n\nOutput variables:\n - " + \ 
    256                     "\n - ".join(t[0] for t in self.outputs)) 
    257          
    258         self.controlBox = OWGUI.widgetBox(self.controlArea, 'File') 
     281        OWGUI.label(self.infoBox, self, "<p>Execute python script.</p><p>Input variables:<ul><li> " + \ 
     282                    "<li>".join(t[0] for t in self.inputs) + "</ul></p><p>Output variables:<ul><li>" + \ 
     283                    "<li>".join(t[0] for t in self.outputs) + "</ul></p>") 
     284         
     285        self.libraryList = PyListModel([], self, flags=Qt.ItemIsSelectable | Qt.ItemIsEnabled | Qt.ItemIsEditable) 
     286#        self.libraryList.append(Script("Hello world", "print 'Hello world'\n")) 
     287        self.libraryList.wrap(self.libraryListSource) 
     288         
     289        self.controlBox = OWGUI.widgetBox(self.controlArea, 'Library') 
     290        self.libraryView = QListView() 
     291        self.libraryView.pyqtConfigure(editTriggers=QListView.DoubleClicked | QListView.SelectedClicked) 
     292        self.libraryView.setItemDelegate(ScriptItemDelegate(self)) 
     293        self.libraryView.setModel(self.libraryList) 
     294        self.connect(self.libraryView.selectionModel(), SIGNAL("selectionChanged(QItemSelection, QItemSelection)"), self.onSelectedScriptChanged) 
     295        self.controlBox.layout().addWidget(self.libraryView) 
     296        w = ModelActionsWidget() 
     297         
     298        action = QAction("+", self) 
     299        action.pyqtConfigure(toolTip="Add a new script to the library") 
     300        self.connect(action, SIGNAL("triggered()"), self.onAddScript) 
     301        new_empty = QAction("Add a new empty script", action) 
     302        new_from_file = QAction("Add a new script from a file", action) 
     303        self.connect(new_empty, SIGNAL("triggered()"), self.onAddScript) 
     304        self.connect(new_from_file, SIGNAL("triggered()"), self.onAddScriptFromFile) 
     305        menu = QMenu(w) 
     306        menu.addAction(new_empty) 
     307        menu.addAction(new_from_file) 
     308        action.setMenu(menu) 
     309        w.addAction(action) 
     310         
     311        action = QAction("Update", self) 
     312        action.pyqtConfigure(toolTip="Save changes in the editor to library") 
     313        self.connect(action, SIGNAL("triggered()"), self.commitChangesToLibrary) 
     314        b = w.addAction(action) 
     315        b.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Fixed) 
     316         
     317        self.removeAction = action = QAction("-", self) 
     318        action.pyqtConfigure(toolTip="Remove script from library") 
     319        self.connect(action, SIGNAL("triggered()"), self.onRemoveScript) 
     320        w.addAction(action) 
     321         
     322        self.saveAction = action = QAction("&Save", self) 
     323        action.pyqtConfigure(toolTip="Save script to file", triggered=self.onSaveScriptToFile) 
     324        action.setShortcut(QKeySequence("Control+S")) 
     325        self.connect(action, SIGNAL("triggerd()"), self.saveScript) 
     326         
     327        w.layout().addStretch(10) 
     328        self.controlBox.layout().addSpacing(0) 
     329        self.controlBox.layout().addWidget(w) 
     330                     
    259331        OWGUI.button(self.controlBox, self, "Open...", callback=self.openScript) 
    260332        OWGUI.button(self.controlBox, self, "Save...", callback=self.saveScript) 
     
    266338        self.mainArea.layout().addWidget(self.splitCanvas) 
    267339         
    268         defaultFont = "Monaco" if sys.platform == "darwin" else "Courier" 
     340        self.defaultFont = defaultFont = "Monaco" if sys.platform == "darwin" else "Courier" 
    269341        self.textBox = OWGUI.widgetBox(self, 'Python script') 
    270342        self.splitCanvas.addWidget(self.textBox) 
    271343        self.text = PythonScriptEditor(self) 
    272344        self.textBox.layout().addWidget(self.text) 
    273         self.text.document().setDefaultFont(QFont(defaultFont)) 
    274         self.highlighter = PythonSyntaxHighlighter(self.text.document()) 
     345         
    275346        self.textBox.setAlignment(Qt.AlignVCenter) 
    276347        self.text.setTabStopWidth(4) 
     348         
     349        self.connect(self.text, SIGNAL("modificationChanged(bool)"), self.onModificationChanged) 
    277350         
    278351        self.consoleBox = OWGUI.widgetBox(self, 'Console') 
     
    303376    def setClassifier(self, classifier): 
    304377        self.inClassifier = classifier 
    305      
     378         
     379    def selectedScriptIndex(self): 
     380        rows = self.libraryView.selectionModel().selectedRows() 
     381        if rows: 
     382            return  [i.row() for i in rows][0] 
     383        else: 
     384            return None 
     385         
     386    def setSelectedScript(self, index): 
     387        selection = self.libraryView.selectionModel() 
     388        selection.select(self.libraryList.index(index), QItemSelectionModel.ClearAndSelect) 
     389         
     390    def onAddScript(self, *args): 
     391        self.libraryList.append(Script("New script", "", 0)) 
     392        self.setSelectedScript(len(self.libraryList) - 1) 
     393         
     394    def onAddScriptFromFile(self, *args): 
     395        file = QFileDialog.getOpenFileName(self, 'Open Python Script', self.codeFile, 'Python files (*.py)\nAll files(*.*)') 
     396        if file: 
     397            file = str(file) 
     398            name = os.path.basename(file) 
     399            self.libraryList.append(Script(name, open(file, "rb").read(), 0)) 
     400            self.setSelectedScript(len(self.libraryList) - 1) 
     401     
     402    def onRemoveScript(self, *args): 
     403        index = self.selectedScriptIndex() 
     404        if index is not None: 
     405            del self.libraryList[index] 
     406     
     407    def onSaveScriptToFile(self, *args): 
     408        index = self.selectedScriptIndex() 
     409        if index is not None: 
     410            self.saveScript() 
     411             
     412    def onSelectedScriptChanged(self, selected, deselected): 
     413        ind = [i.row() for i in selected.indexes()] 
     414        if ind: 
     415            current = ind[0]  
     416            self.text.setDocument(self.documentForScript(current)) 
     417             
     418    def documentForScript(self, script=0): 
     419        if type(script) != Script: 
     420            script = self.libraryList[script] 
     421        if script not in self._cachedDocuments: 
     422            doc = QTextDocument(self) 
     423            doc.setDocumentLayout(QPlainTextDocumentLayout(doc)) 
     424            doc.setPlainText(script.script) 
     425            doc.setDefaultFont(QFont(self.defaultFont)) 
     426            doc.highlighter = PythonSyntaxHighlighter(doc) 
     427            self.connect(doc, SIGNAL("modificationChanged(bool)"), self.onModificationChanged) 
     428            doc.setModified(False) 
     429            self._cachedDocuments[script] = doc 
     430        return self._cachedDocuments[script] 
     431     
     432    def commitChangesToLibrary(self, *args): 
     433        ind = self.selectedScriptIndex() 
     434        if index is not None: 
     435            self.libraryList[ind].script = self.text.toPlainText() 
     436            self.text.document().setModified(False) 
     437            self.libraryList.emitDataChanged(ind) 
     438             
     439    def onModificationChanged(self, modified): 
     440        index = self.selectedScriptIndex() 
     441        if index is not None: 
     442            self.libraryList[index].flags = Script.Modified if modified else 0 
     443            self.libraryList.emitDataChanged(index) 
     444         
     445    def updateSelecetdScriptState(self): 
     446        index = self.selectedScriptIndex() 
     447        if index is not None: 
     448            script = self.libraryList[index] 
     449            self.libraryList[index] = Script(script.name, self.text.toPlainText(), 0) 
     450             
    306451    def openScript(self, filename=None): 
    307452        if filename == None: 
     
    344489    ow.show() 
    345490    appl.exec_() 
     491    ow.saveSettings() 
Note: See TracChangeset for help on using the changeset viewer.