Esempio n. 1
0
 def findEndOFFile(self):
     q = QLabel('Text not found !')
     q.setPixmap(QPixmap(':/images/icons/wrap.png'))
     self.statusBar.addWidget(q)
     self.statusBar.showMessage(
         '     End of page found, restart from top !', 2000)
     QTimer.singleShot(2000, lambda: self.statusBar.removeWidget(q))
Esempio n. 2
0
        def __init__(self, orientation, parent, item):
            QWidget.__init__(self, parent)
            self.setFocusPolicy(Qt.StrongFocus)
            self.setMinimumHeight(20)
            horizontalLayout = QHBoxLayout(self)
            horizontalLayout.setContentsMargins(0, 0, 0, 0)
            self.label = QLabel(self)
            horizontalLayout.addWidget(self.label)
            self.slider = QSlider(orientation, self)
            horizontalLayout.addWidget(self.slider)
            self.item = item
            scalar = item.scalar
            self.isfloat = scalar.isFloat()
            if item.scalar.isFloat():
                self.spinBox = QDoubleSpinBox(self)
                self.spinBox.setSingleStep(0.1**scalar.decimals)
            else:
                self.spinBox = QSpinBox(self)
            self.spinBox.setMinimumHeight(20)
            horizontalLayout.addWidget(self.spinBox)
            self.spinBox.hide()
            #self.slider.hide()
            self.chgButton = QPushButton('O', self)
            self.chgButton.setMaximumWidth(15)
            self.chgButton.setMinimumWidth(15)
            horizontalLayout.addWidget(self.chgButton)
            self.setRange(scalar.minvalue, scalar.maxvalue)
            self.label.setMinimumWidth(self.labelwidth)
            self.setValue(scalar.value)
            self.locked = False

            if self.isfloat:
                self.slider.valueChanged.connect(
                    self.updateInt2FloatItem
                )  # QObject.connect(self.slider,SIGNAL('valueChanged(int)'),self.updateInt2FloatItem)
                self.spinBox.valueChanged.connect(
                    self.updateItem
                )  # QObject.connect(self.spinBox,SIGNAL('valueChanged(double)'),self.updateItem)
            else:
                self.slider.valueChanged.connect(
                    self.updateItem
                )  # QObject.connect(self.slider,SIGNAL('valueChanged(int)'),self.updateItem)
                self.spinBox.valueChanged.connect(
                    self.updateItem
                )  # QObject.connect(self.spinBox,SIGNAL('valueChanged(int)'),self.updateItem)
            self.chgButton.pressed.connect(
                self.changeEditor
            )  # QObject.connect(self.chgButton,SIGNAL('pressed()'),self.changeEditor)
Esempio n. 3
0
    def initWithEditor(self, lpyeditor):
        self.editor = lpyeditor
        self.findEdit = lpyeditor.findEdit
        self.frameFind = lpyeditor.frameFind
        self.gotoEdit = lpyeditor.gotoEdit
        self.matchCaseButton = lpyeditor.matchCaseButton
        self.wholeWordButton = lpyeditor.wholeWordButton
        self.nextButton = lpyeditor.findNextButton
        self.previousButton = lpyeditor.findPreviousButton
        self.replaceEdit = lpyeditor.replaceEdit
        self.replaceButton = lpyeditor.replaceButton
        self.replaceAllButton = lpyeditor.replaceAllButton
        self.statusBar = lpyeditor.statusBar()
        self.positionLabel = QLabel(self.statusBar)
        self.statusBar.addPermanentWidget(self.positionLabel)
        self.findEdit.textEdited.connect(self.findText)

        lpyeditor.actionFind.triggered.connect(self.focusFind)
        self.findEdit.returnPressed.connect(self.setFocus)
        self.gotoEdit.returnPressed.connect(self.gotoLineFromEdit)
        self.gotoEdit.returnPressed.connect(self.setFocus)
        self.previousButton.pressed.connect(self.findPreviousText)
        self.nextButton.pressed.connect(self.findNextText)
        self.replaceButton.pressed.connect(self.replaceText)
        self.replaceAllButton.pressed.connect(self.replaceAllText)
        self.cursorPositionChanged.connect(self.printCursorPosition)
        lpyeditor.actionZoomIn.triggered.connect(self.zoomInEvent)
        lpyeditor.actionZoomOut.triggered.connect(self.zoomOutEvent)
        lpyeditor.actionNoZoom.triggered.connect(self.resetZoom)
        lpyeditor.actionGoto.triggered.connect(self.setLineInEdit)

        self.defaultEditionFont = self.currentFont()
        self.defaultPointSize = self.currentFont().pointSize()
        self.setViewportMargins(50, 0, 0, 0)
        self.sidebar = Margin(self, self)
        self.sidebar.setGeometry(0, 0, 50, 100)
        self.sidebar.defineMarker(
            ErrorMarker, QPixmap(':/images/icons/warningsErrors16.png'))
        self.sidebar.defineMarker(BreakPointMarker,
                                  QPixmap(':/images/icons/BreakPoint.png'))
        self.sidebar.defineMarker(CodePointMarker,
                                  QPixmap(':/images/icons/greenarrow16.png'))
        self.sidebar.show()
        self.sidebar.lineClicked.connect(self.checkLine)
Esempio n. 4
0
class LpyCodeEditor(QTextEdit):
    def __init__(self,parent):
        QTextEdit.__init__(self,parent)
        self.editor = None
        self.setAcceptDrops(True)
        self.setWordWrapMode(QTextOption.WrapAnywhere)
        self.findEdit = None
        self.gotoEdit = None
        self.matchCaseButton = None
        self.wholeWordButton = None
        self.nextButton = None
        self.previousButton = None
        self.replaceEdit = None
        self.replaceButton = None
        self.replaceAllButton = None
        self.replaceTab = True
        self.indentation = '  '
        self.hasError = False
        self.defaultdoc = self.document().clone()
        self.setDocument(self.defaultdoc)
        self.syntaxhighlighter = LpySyntaxHighlighter(self)
        self.zoomFactor = 0
        self.editionFont = None
        #self.syntaxhighlighter.setDocument(self.defaultdoc)
    def initWithEditor(self,lpyeditor):
        self.editor = lpyeditor
        self.findEdit = lpyeditor.findEdit
        self.frameFind = lpyeditor.frameFind
        self.gotoEdit = lpyeditor.gotoEdit
        self.matchCaseButton = lpyeditor.matchCaseButton
        self.wholeWordButton = lpyeditor.wholeWordButton
        self.nextButton = lpyeditor.findNextButton
        self.previousButton = lpyeditor.findPreviousButton
        self.replaceEdit = lpyeditor.replaceEdit
        self.replaceButton = lpyeditor.replaceButton
        self.replaceAllButton = lpyeditor.replaceAllButton
        self.statusBar = lpyeditor.statusBar()
        self.positionLabel = QLabel(self.statusBar)
        self.statusBar.addPermanentWidget(self.positionLabel)
        self.findEdit.textEdited.connect(self.findText)

        lpyeditor.actionFind.triggered.connect(self.focusFind)
        self.findEdit.returnPressed.connect(self.setFocus)
        self.gotoEdit.returnPressed.connect(self.gotoLineFromEdit)
        self.gotoEdit.returnPressed.connect(self.setFocus)
        self.previousButton.pressed.connect(self.findPreviousText)
        self.nextButton.pressed.connect(self.findNextText)
        self.replaceButton.pressed.connect(self.replaceText)
        self.replaceAllButton.pressed.connect(self.replaceAllText)
        self.cursorPositionChanged.connect(self.printCursorPosition)
        lpyeditor.actionZoomIn.triggered.connect(self.zoomInEvent)
        lpyeditor.actionZoomOut.triggered.connect(self.zoomOutEvent)
        lpyeditor.actionNoZoom.triggered.connect(self.resetZoom)
        lpyeditor.actionGoto.triggered.connect(self.setLineInEdit)

        self.defaultEditionFont = self.currentFont()
        self.defaultPointSize = self.currentFont().pointSize()
        self.setViewportMargins(50,0,0,0)
        self.sidebar = Margin(self,self)
        self.sidebar.setGeometry(0,0,50,100)
        self.sidebar.defineMarker(ErrorMarker,QPixmap(':/images/icons/warningsErrors16.png'))
        self.sidebar.defineMarker(BreakPointMarker,QPixmap(':/images/icons/BreakPoint.png'))
        self.sidebar.defineMarker(CodePointMarker,QPixmap(':/images/icons/greenarrow16.png'))
        self.sidebar.show() 
        self.sidebar.lineClicked.connect(self.checkLine)
    def checkLine(self,line):
        self.statusBar.showMessage("Line "+str(line)+" clicked",2000)
        if self.sidebar.hasMarkerAt(line):
            if self.hasError and self.errorLine == line:
                self.clearErrorHightlight()
            elif self.sidebar.hasMarkerTypeAt(line,BreakPointMarker):
                self.sidebar.removeMarkerTypeAt(line,BreakPointMarker)
            else:
                self.sidebar.appendMarkerAt(line,BreakPointMarker)
        else:
            self.sidebar.setMarkerAt(line,BreakPointMarker)
    def resizeEvent(self,event):
        self.sidebar.setGeometry(0,0,48,self.height())
        QTextEdit.resizeEvent(self,event)
    def scrollContentsBy(self,dx,dy):
        self.sidebar.update()
        self.sidebar.setFont(QFont(self.currentFont()))
        QTextEdit.scrollContentsBy(self,dx,dy)
    def focusInEvent ( self, event ):
        if self.editor : self.editor.currentSimulation().monitorfile()
        return QTextEdit.focusInEvent ( self, event )
    def setReplaceTab(self,value):
        self.replaceTab = value
    def tabSize(self):
        return len(self.indentation)
    def setTabSize(self, value):
        assert value > 0
        self.indentation = ' '*value
        self.setTabStopWidth(value*self.currentFont().pointSize())
    def setLpyDocument(self,document):
        self.syntaxhighlighter.setDocument(document)
        LpyCodeEditor.setDocument(self,document)
        self.syntaxhighlighter.rehighlight()
        self.applyZoom()
        if not self.editionFont is None and self.editionFont!= document.defaultFont() :
            document.setDefaultFont(self.editionFont)
    def zoomInEvent(self):
        self.zoomFactor += 1
        self.zoomIn()
    def zoomOutEvent(self):
        self.zoomFactor -= 1
        self.zoomOut()
    def resetZoom(self):
        if self.zoomFactor > 0:
            self.zoomOut(self.zoomFactor)
        elif self.zoomFactor < 0:
            self.zoomIn(-self.zoomFactor)
        self.zoomFactor = 0
    def applyZoom(self):
        self.zoomIn()
        self.zoomOut()
    def printCursorPosition(self):
        cursor = self.textCursor()
        self.positionLabel.setText('Line '+str(cursor.blockNumber()+1)+', Column '+str(cursor.columnNumber())+' ('+str(cursor.position())+')')
    def keyPressEvent(self,event):
        if self.hasError:
            self.clearErrorHightlight()
        lcursor = self.textCursor()
        bbn = lcursor.blockNumber()
        if lcursor.selectionStart() == lcursor.selectionEnd() and (event.key() == Qt.Key_Delete or event.key() == Qt.Key_Backspace):
            if event.key() == Qt.Key_Backspace:
                lcursor.movePosition(QTextCursor.PreviousCharacter,QTextCursor.KeepAnchor)
            else:
                lcursor.movePosition(QTextCursor.NextCharacter,QTextCursor.KeepAnchor)
        if event.key() == Qt.Key_Tab and lcursor.hasSelection():
            if event.modifiers() == Qt.NoModifier:
                self.tab()
            else:
                self.untab()
        else:
            seltxt = lcursor.selection().toPlainText()
            sbn = seltxt.count('\n')
            rev = self.document().revision()
            QTextEdit.keyPressEvent(self,event)
            if event.key() == Qt.Key_Return or event.key() == Qt.Key_Enter:
                self.returnEvent()
                sbn -=1
            elif event.key() == Qt.Key_Tab :
                self.tabEvent()
            if rev != self.document().revision():
                self.sidebar.decalMarkers(bbn+sbn,-sbn)        
    def returnEvent(self):
        cursor = self.textCursor()
        beg = cursor.selectionStart()
        end = cursor.selectionEnd()
        if beg == end:
            pos = cursor.position()
            ok = cursor.movePosition(QTextCursor.PreviousBlock,QTextCursor.MoveAnchor)
            if not ok: return
            txtok = True
            txt = ''
            while txtok:
                ok = cursor.movePosition(QTextCursor.NextCharacter,QTextCursor.KeepAnchor)
                if not ok: break
                txt2 = str(cursor.selection().toPlainText())
                txtok = (txt2[-1] in ' \t')
                if txtok:
                    txt = txt2
            cursor.setPosition(pos)
            ok = cursor.movePosition(QTextCursor.PreviousBlock,QTextCursor.MoveAnchor)
            if ok:
                ok = cursor.movePosition(QTextCursor.EndOfBlock,QTextCursor.MoveAnchor)
                if ok:
                    txtok = True
                    while txtok:
                        ok = cursor.movePosition(QTextCursor.PreviousCharacter,QTextCursor.KeepAnchor)
                        if not ok: break
                        txt2 = str(cursor.selection().toPlainText())
                        txtok = (txt2[0] in ' \t')
                        if not txtok:
                            if txt2[0] == ':':
                                txt += self.indentation
            cursor.setPosition(pos)
            cursor.joinPreviousEditBlock()
            cursor.insertText(txt)
            cursor.endEditBlock()
    def tabEvent(self):
        if self.replaceTab:
            cursor = self.textCursor()
            if cursor.hasSelection():
                cursor.joinPreviousEditBlock()
                cursor.deletePreviousChar() 
                self.tab(cursor)
                cursor.endEditBlock()        
            else:
                cursor.joinPreviousEditBlock()
                cursor.deletePreviousChar() 
                cursor.insertText(self.indentation)
                cursor.endEditBlock()        
    def getFindOptions(self):
        options = QTextDocument.FindFlags()
        if self.matchCaseButton.isChecked():
            options |= QTextDocument.FindCaseSensitively
        if self.wholeWordButton.isChecked():
            options |= QTextDocument.FindWholeWords
        return options
    def cursorAtStart(self):
        cursor = self.textCursor()
        cursor.setPosition(0,QTextCursor.MoveAnchor)
        self.setTextCursor(cursor)            
    def focusFind(self):
        if not self.frameFind.isVisible():
            self.setfindEditColor(QColor(255,255,255))
            self.frameFind.show()
            cursor = self.textCursor()
            if cursor.hasSelection() :
                self.findEdit.setText(cursor.selectedText())
            self.findEdit.selectAll()
            self.findEdit.setFocus()
        else:
            cursor = self.textCursor()
            if not cursor.hasSelection() or cursor.selectedText() == self.findEdit.text():
                self.findNextText()
            elif cursor.hasSelection():
                self.findEdit.setText(cursor.selectedText())
                self.findEdit.selectAll()
                self.findEdit.setFocus()
            
    def findNextText(self):        
        txt = self.findEdit.text()
        found = self.find(txt,self.getFindOptions())
        if found:
            self.setFocus()
            self.setfindEditColor(QColor(255,255,255))
        else:
            #self.statusBar.showMessage('Text not found !',2000)
            self.findEndOFFile()
            self.cursorAtStart()
            self.setfindEditColor(QColor(255,100,100))
    def setfindEditColor(self,color):
        palette = self.findEdit.palette()
        palette.setColor(QPalette.Base,color)
        self.findEdit.setPalette(palette)
    def findEndOFFile(self):
            q = QLabel('Text not found !')
            q.setPixmap(QPixmap(':/images/icons/wrap.png'))
            self.statusBar.addWidget(q)
            self.statusBar.showMessage('     End of page found, restart from top !',2000)
            QTimer.singleShot(2000,lambda : self.statusBar.removeWidget(q))            
    def findPreviousText(self):
        txt = self.findEdit.text()
        found = self.find(txt,QTextDocument.FindBackward|self.getFindOptions())
        if found:
            self.setFocus()
        else:
            
            self.findEndOFFile()
            self.cursorAtStart()
    def findText(self,txt):
        cursor = self.textCursor()
        cursor.setPosition(0,QTextCursor.MoveAnchor)
        self.setTextCursor(cursor)
        self.find(txt,self.getFindOptions())
    def replaceText(self):
        txt = self.findEdit.text()
        cursor = self.textCursor()
        if cursor.selectedText() == txt:
            cursor.beginEditBlock()
            cursor.removeSelectedText() 
            cursor.insertText(self.replaceEdit.text())
            cursor.endEditBlock()
            self.find(txt,self.getFindOptions())
        else:
            self.findNextText()
    def replaceAllText(self):
        txt = self.findEdit.text()
        cursor = self.textCursor()
        if cursor.selectedText() == txt:        
            nboccurrence = 1
            cursor.beginEditBlock()
            cursor.removeSelectedText()
            cursor.insertText(self.replaceEdit.text())
            found = self.find(txt,self.getFindOptions())
            while found :
                nboccurrence += 1
                cursor = self.textCursor()
                cursor.removeSelectedText()
                cursor.insertText(self.replaceEdit.text())
                found = self.find(txt,self.getFindOptions())            
            cursor.endEditBlock()
            self.statusBar.showMessage('Replace '+str(nboccurrence)+' occurrences.',5000)
            self.cursorAtStart()
        else:
            self.findNextText()
    def setSyntaxHighLightActivation(self,value):
        self.syntaxhighlighter.setActivation(value)
    def isSyntaxHighLightActivated(self):
        return self.syntaxhighlighter.activated
    def setTabHighLightActivation(self,value):
        self.syntaxhighlighter.setTabViewActivation(value)
    def isTabHighLightActivated(self):
        return self.syntaxhighlighter.tabviewactivated
    def canInsertFromMimeData(self,source):
        if source.hasUrls():
            return True
        else: return source.hasText()
            # return qt.QtGui.QTextEdit.canInsertFromMimeData(self,source)
    def insertFromMimeData(self,source):
        if source.hasUrls():
            if not self.editor is None:
                url = source.urls()[0]
                if len(url.host()) == 0 and url.path().startswith("/.file/id="):
                    import os
                    cmd = """osascript -e 'get posix path of posix file "{}" -- kthxbai'""".format(url.path())
                    path = os.popen(cmd).read().strip()
                else:
                    path = url.toLocalFile()
                self.editor.openfile(path)
        else : 
            nsource = QMimeData()
            nsource.setText(source.text())
            return QTextEdit.insertFromMimeData(self,nsource)
    def comment(self):
        cursor = self.textCursor()
        beg = cursor.selectionStart()
        end = cursor.selectionEnd()
        pos = cursor.position()
        cursor.beginEditBlock() 
        cursor.setPosition(beg,QTextCursor.MoveAnchor)
        cursor.movePosition(QTextCursor.StartOfBlock,QTextCursor.MoveAnchor)
        while cursor.position() <= end:
            cursor.insertText('#')
            oldpos = cursor.position()
            cursor.movePosition(QTextCursor.NextBlock,QTextCursor.MoveAnchor)
            if cursor.position() == oldpos:
                break
            end+=1
        cursor.endEditBlock()
        cursor.setPosition(pos,QTextCursor.MoveAnchor)
    def uncomment(self):
        cursor = self.textCursor()
        beg = cursor.selectionStart()
        end = cursor.selectionEnd()
        pos = cursor.position()
        cursor.beginEditBlock()
        cursor.setPosition(beg,QTextCursor.MoveAnchor)
        cursor.movePosition(QTextCursor.StartOfBlock,QTextCursor.MoveAnchor)
        while cursor.position() <= end:
            m = cursor.movePosition(QTextCursor.NextCharacter,QTextCursor.KeepAnchor)
            if True:
                if cursor.selectedText() == '#':
                        cursor.deleteChar()
                end-=1
            cursor.movePosition(QTextCursor.Down,QTextCursor.MoveAnchor)
            cursor.movePosition(QTextCursor.Left,QTextCursor.MoveAnchor)
        cursor.endEditBlock()
        cursor.setPosition(pos,QTextCursor.MoveAnchor)
    def tab(self, initcursor = None):
        if initcursor == False:
            initcursor = None
        cursor = self.textCursor() if initcursor is None else initcursor
        beg = cursor.selectionStart()
        end = cursor.selectionEnd()
        pos = cursor.position()
        if not initcursor : cursor.beginEditBlock()
        cursor.setPosition(beg,QTextCursor.MoveAnchor)
        cursor.movePosition(QTextCursor.StartOfBlock,QTextCursor.MoveAnchor)
        while cursor.position() <= end :
            if self.replaceTab:
                cursor.insertText(self.indentation)
                end+=len(self.indentation)
            else:
                cursor.insertText('\t')
                end+=1
            oldpos = cursor.position()
            cursor.movePosition(QTextCursor.NextBlock,QTextCursor.MoveAnchor)
            if cursor.position() == oldpos:
                break
        if not initcursor : cursor.endEditBlock()
        cursor.setPosition(pos,QTextCursor.MoveAnchor)
    def untab(self):
        cursor = self.textCursor()
        beg = cursor.selectionStart()
        end = cursor.selectionEnd()
        pos = cursor.position()
        cursor.beginEditBlock()
        cursor.setPosition(beg,QTextCursor.MoveAnchor)
        cursor.movePosition(QTextCursor.StartOfBlock,QTextCursor.MoveAnchor)
        while cursor.position() <= end:
            m = cursor.movePosition(QTextCursor.NextCharacter,QTextCursor.KeepAnchor)
            if cursor.selectedText() == '\t':
                cursor.deleteChar()
            else:
                for i in range(len(self.indentation)-1):
                    b = cursor.movePosition(QTextCursor.NextCharacter,QTextCursor.KeepAnchor)
                    if not b : break
                if cursor.selectedText() == self.indentation:
                    cursor.removeSelectedText()                    
            end-=1
            cursor.movePosition(QTextCursor.Down,QTextCursor.MoveAnchor)
            cursor.movePosition(QTextCursor.StartOfBlock,QTextCursor.MoveAnchor)
        cursor.endEditBlock()
        cursor.setPosition(pos,QTextCursor.MoveAnchor)
    def hightlightError(self,lineno):
        if self.editor : self.editor.textEditionWatch = False
        if self.hasError:
            self.clearErrorHightlight()
        self.sidebar.addMarkerAt(lineno,ErrorMarker)
        self.errorLine = lineno
        cursor = self.textCursor()
        cursor.setPosition(0)
        cursor.movePosition(QTextCursor.NextBlock,QTextCursor.MoveAnchor,lineno-1)
        cursor.movePosition(QTextCursor.EndOfBlock,QTextCursor.KeepAnchor)
        errorformat = QTextCharFormat() 
        errorformat.setBackground(Qt.yellow)
        cursor.setCharFormat(errorformat)
        self.gotoLine(lineno)
        self.hasError = True
        if self.editor : self.editor.textEditionWatch = True
    def clearErrorHightlight(self):
        cursor = self.textCursor()
        self.undo()
        self.setTextCursor(cursor)
        self.hasError = False  
        self.sidebar.removeCurrentMarkerAt(self.errorLine)
    def setEditionFontFamily(self,font):
        font.setPointSize( self.currentFont().pointSize() )
        self.setEditionFont(font)
    def setEditionFontSize(self,p):
        f = self.editionFont
        if self.editionFont is None:
            f = QFont(self.defaultEditionFont)
        f.setPointSize( p )
        self.setEditionFont(f)
    def setEditionFont(self,font):
        self.editionFont = font
        self.document().setDefaultFont(font)
    def isFontToDefault(self):
        if self.editionFont is None : return True
        return str(self.editionFont.family()) == str(self.defaultEditionFont.family()) and self.editionFont.pointSize() == self.defaultEditionFont.pointSize()
    def gotoLine(self,lineno):
        cursor = self.textCursor()
        cursor.setPosition(0)
        cursor.movePosition(QTextCursor.NextBlock,QTextCursor.MoveAnchor,lineno-1)
        self.setTextCursor(cursor)
        self.ensureCursorVisible()
    def gotoLineFromEdit(self):
        self.gotoLine(int(self.gotoEdit.text()))
    def setLineInEdit(self):
        self.gotoEdit.setText(str(self.textCursor().blockNumber()+1))
        self.gotoEdit.selectAll()
    def restoreSimuState(self,simu):
        if self.hasError:
            self.clearErrorHightlight()
        firstinit = simu.textdocument is None
        if firstinit:            
            simu.textdocument = self.document().clone()
        self.setLpyDocument(simu.textdocument)
        if firstinit:
            self.clear()
            self.setText(simu.code)
        if not simu.cursor is None:
            self.setTextCursor(simu.cursor)
            self.horizontalScrollBar().setValue(simu.hvalue)
            self.verticalScrollBar().setValue(simu.vvalue)
        self.sidebar.restoreState(simu)
    def saveSimuState(self,simu):
        simu.code = self.getCode()
        if simu.textdocument is None:
            print('custom document clone')
            simu.textdocument = self.document().clone()
        simu.cursor = self.textCursor()
        simu.hvalue = self.horizontalScrollBar().value()
        simu.vvalue = self.verticalScrollBar().value()
        self.sidebar.saveState(simu)

    def getCode(self):
        return str(self.toPlainText()).encode('iso-8859-1','replace').decode('iso-8859-1')

    def codeToExecute(self):
        cursor = self.textCursor()
        curpos = cursor.position()
        selbegin = cursor.selectionStart()
        selend   = cursor.selectionEnd()
        cursor.setPosition(selbegin)
        cursor.movePosition(QTextCursor.StartOfLine)
        cursor.setPosition(selend, QTextCursor.KeepAnchor)
        cursor.movePosition(QTextCursor.EndOfLine, QTextCursor.KeepAnchor)
        cmd = cursor.selectedText()
        if False : #len(cmd) > 0:
            lines = cmd.splitlines()
            fline = lines[0]
            nfline = fline.lstrip()
            torem = len(fline) - len(nfline)
            nlines = [l[torem:] for l in lines]
            cmd = '\n'.join(nlines)
        return cmd
Esempio n. 5
0
    class ItemSlider(QWidget):

        valueChanged = pyqtSignal('PyQt_PyObject')

        def __init__(self, orientation, parent, item):
            QWidget.__init__(self, parent)
            self.setFocusPolicy(Qt.StrongFocus)
            self.setMinimumHeight(20)
            horizontalLayout = QHBoxLayout(self)
            horizontalLayout.setContentsMargins(0, 0, 0, 0)
            self.label = QLabel(self)
            horizontalLayout.addWidget(self.label)
            self.slider = QSlider(orientation, self)
            horizontalLayout.addWidget(self.slider)
            self.item = item
            scalar = item.scalar
            self.isfloat = scalar.isFloat()
            if item.scalar.isFloat():
                self.spinBox = QDoubleSpinBox(self)
                self.spinBox.setSingleStep(0.1**scalar.decimals)
            else:
                self.spinBox = QSpinBox(self)
            self.spinBox.setMinimumHeight(20)
            horizontalLayout.addWidget(self.spinBox)
            self.spinBox.hide()
            #self.slider.hide()
            self.chgButton = QPushButton('O', self)
            self.chgButton.setMaximumWidth(15)
            self.chgButton.setMinimumWidth(15)
            horizontalLayout.addWidget(self.chgButton)
            self.setRange(scalar.minvalue, scalar.maxvalue)
            self.label.setMinimumWidth(self.labelwidth)
            self.setValue(scalar.value)
            self.locked = False

            if self.isfloat:
                self.slider.valueChanged.connect(
                    self.updateInt2FloatItem
                )  # QObject.connect(self.slider,SIGNAL('valueChanged(int)'),self.updateInt2FloatItem)
                self.spinBox.valueChanged.connect(
                    self.updateItem
                )  # QObject.connect(self.spinBox,SIGNAL('valueChanged(double)'),self.updateItem)
            else:
                self.slider.valueChanged.connect(
                    self.updateItem
                )  # QObject.connect(self.slider,SIGNAL('valueChanged(int)'),self.updateItem)
                self.spinBox.valueChanged.connect(
                    self.updateItem
                )  # QObject.connect(self.spinBox,SIGNAL('valueChanged(int)'),self.updateItem)
            self.chgButton.pressed.connect(
                self.changeEditor
            )  # QObject.connect(self.chgButton,SIGNAL('pressed()'),self.changeEditor)

        def updateInt2FloatItem(self, value):
            a = 10.**self.item.scalar.decimals
            self.updateItem(value / a)

        def updateItem(self, value):
            if self.item.scalar.value != value and not self.locked:
                self.locked = True
                self.item.scalar.value = value
                self.setValue(value)
                self.item.setText(str(value))
                self.label.setMinimumWidth(self.labelwidth)
                self.valueChanged.emit(
                    self.item.scalar
                )  # self.emit(SIGNAL('valueChanged(PyQt_PyObject)'),self.item.scalar) # AUTO SIGNAL TRANSLATION
                self.locked = False

        def setRange(self, minv, maxv):
            if self.isfloat:
                a = 10**self.item.scalar.decimals
                self.labelwidth = self.fontMetrics().width(' ' +
                                                           str(int(a * maxv)) +
                                                           '. ')
                self.slider.setRange(int(minv * a), int(maxv * a))
            else:
                self.slider.setRange(minv, maxv)
                self.labelwidth = self.fontMetrics().width(' ' + str(maxv) +
                                                           ' ')
            self.spinBox.setRange(minv, maxv)
            self.label.setText(' ' * (2 + len(str(maxv))))

        def setValue(self, value):
            if self.isfloat:
                a = 10**self.item.scalar.decimals
                nv = int(value * a)
                if self.slider.value() != nv:
                    self.slider.setValue(value * a)
            else:
                if self.slider.value() != value:
                    self.slider.setValue(value)
            if self.spinBox.value() != value:
                self.spinBox.setValue(value)

        def changeEditor(self):
            if self.spinBox.isHidden():
                self.slider.hide()
                self.label.hide()
                self.spinBox.show()
                self.spinBox.move(0, 0)
            else:
                self.slider.show()
                self.label.show()
                self.spinBox.hide()