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 __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 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)
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
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()