def __onDeleteKey(self,event): if self.selectedTextManager().getSelectedTextIndexPos() != None: self.deleteSelectText(True) return curCursorIndexPos = self.cursor().getCursorIndexPos() if FUF.hasModifier(event.modifiers()) == False: if event.key() == QtCore.Qt.Key_Delete: newCursorIndexPos = self.document().moveIndexPosRight(curCursorIndexPos) else: newCursorIndexPos = self.document().moveIndexPosLeft(curCursorIndexPos) elif FUF.onlyCtrlModifier(event.modifiers()): if event.key() == QtCore.Qt.Key_Delete: newCursorIndexPos = self.document().moveIndexPosRightByWord(curCursorIndexPos) else: newCursorIndexPos = self.document().moveIndexPosLeftByWord(curCursorIndexPos) else: return distance = self.document().calcIndexPosDistance(curCursorIndexPos, newCursorIndexPos, False) if distance > 0: self.cursor().setGlobalCursorPos(curCursorIndexPos) self.document().deleteText(curCursorIndexPos,distance ) elif distance < 0: self.cursor().setGlobalCursorPos(newCursorIndexPos) self.document().deleteText(newCursorIndexPos,-distance ) self.update()
def __onDirectionKey(self,event): key = event.key() modifiers = event.modifiers() oldCursorIndexPos = self.cursor().getCursorIndexPos() if ( FUF.hasModifier(modifiers) == False ) or ( FUF.hasCtrlModifier(modifiers) == False ): dictMap = { str(QtCore.Qt.Key_Left) :self.document().moveIndexPosLeft , \ str(QtCore.Qt.Key_Right):self.document().moveIndexPosRight , \ str(QtCore.Qt.Key_Up) :self.document().moveIndexPosUp , \ str(QtCore.Qt.Key_Down) :self.document().moveIndexPosDown } newCursorIndexPos = dictMap[str(key)](oldCursorIndexPos) elif FUF.hasCtrlModifier(modifiers): if key == QtCore.Qt.Key_Up: self.showLineNumberAsTop(self.settings().getStartDisLineNumber()-1) return elif key == QtCore.Qt.Key_Down: self.showLineNumberAsTop(self.settings().getStartDisLineNumber()+1) return if key == QtCore.Qt.Key_Left: newCursorIndexPos = self.document().moveIndexPosLeftByWord(oldCursorIndexPos) elif key == QtCore.Qt.Key_Right: newCursorIndexPos = self.document().moveIndexPosRightByWord(oldCursorIndexPos) self.cursor().setGlobalCursorPos(newCursorIndexPos) if FUF.hasShiftModifier(event.modifiers()) == True: self.selectedTextManager().addSelectTextIndexPos(oldCursorIndexPos, newCursorIndexPos) else: self.selectedTextManager().clearSelectedText() self.update()
def __onDisplayLetterKey(self,event): if (FUF.hasModifier(event.modifiers()) == False) or (FUF.onlyShiftModifier(event.modifiers()) == True): self.deleteSelectText(False) indexPos = self.document().insertText(self.cursor().getCursorIndexPos(), event.text()) self.cursor().setGlobalCursorPos(indexPos) self.update() elif FUF.onlyCtrlModifier(event.modifiers()): self.onQuickCtrlKeySignal.emit(event.key()) elif FUF.onlyAltModifier(event.modifiers()): self.onQuickAltKeySignal.emit(event.key())
def keyPressEvent(self, event): #print (hex(event.key()).upper(), hex(ord(event.text())) ) self.document().operateCache().startRecord() if FUF.isEventKeyIsDirectionKey(event.key()): self.__onDirectionKey(event) # BackSpace和Delete键 elif FUF.isEventKeyIsDeleteKey(event.key()): self.__onDeleteKey(event) # enter键 elif FUF.isEventKeyIsEnterKey(event.key()): self.__onEnterKey(event) # tab键 elif FUF.isEventKeyIsTabKey(event.key()): self.__onTabKey(event) # 数字键、其它可见字符 elif FUF.isEventKeyIsNumber(event.key()) or FUF.isSingleCharKey(event.key()): self.__onDisplayCharKey(event) # 字母 elif FUF.isEventKeyIsChar(event.key()): self.__onDisplayLetterKey(event) # PageUp、PageDown、Home、End elif FUF.isEventKeyIsPageUpDownKey(event.key()): self.__onPageKey(event) elif FUF.isEventKeyIsHomeEndKey(event.key()): self.__onHomeEndKey(event) self.document().operateCache().endRecord()
def setSelectTextIndexPos(self,startIndexPosTuple,endIndexPosTuple): if self.__selectedTextIndexPos != None: if FUF.isIndexPosEqual( startIndexPosTuple,self.__selectedTextIndexPos[0] ) and \ FUF.isIndexPosEqual( endIndexPosTuple,self.__selectedTextIndexPos[1] ): return if FUF.isIndexPosEqual( startIndexPosTuple,endIndexPosTuple ) == True: self.__selectedTextIndexPos = None else: self.__selectedTextIndexPos = (startIndexPosTuple,endIndexPosTuple) self.selectedTextChangedSignal.emit()
def addSelectTextIndexPos(self,startIndexPosTuple,endIndexPosTuple): if self.__selectedTextIndexPos == None: self.__selectedTextIndexPos = (startIndexPosTuple,endIndexPosTuple) else: if FUF.isIndexPosEqual(self.__selectedTextIndexPos[1],startIndexPosTuple ): self.__selectedTextIndexPos = ( self.__selectedTextIndexPos[0],endIndexPosTuple ) else: self.__selectedTextIndexPos = ( endIndexPosTuple,self.__selectedTextIndexPos[1] ) if FUF.isIndexPosEqual(self.__selectedTextIndexPos[0],self.__selectedTextIndexPos[1]): self.__selectedTextIndexPos = None self.selectedTextChangedSignal.emit()
def onSelectedTextChanged(self): selectedTextSearcher = None selectedTextIndexPosRangeTuple = self.selectedTextManager().getSelectedTextIndexPosSorted() if selectedTextIndexPosRangeTuple != None: startIndexPos,endIndexPos = selectedTextIndexPosRangeTuple if startIndexPos[1] == endIndexPos[1]: lineText = self.document().getLineText(startIndexPos[1]) if FUF.isTextIsAFullWord(lineText, (startIndexPos[0],endIndexPos[0]) ): word = lineText[ startIndexPos[0]:endIndexPos[0] ] selectedTextSearcher = FUF.generateFullWordSearcher(word) self.settings().setUserDataByKey('selectedTextSearcher',selectedTextSearcher) self.update()
def generateCharMatchedSettings(self,lineIndex): lineStr = self.getLineText(lineIndex) retuArr = [] arr = len(lineStr) * [0] for metaObj in re.finditer( r'\b[a-zA-Z]+\b' , lineStr): if keyword.kwlist.count( lineStr[metaObj.span()[0]:metaObj.span()[1]] ) != 0: for index in range( metaObj.span()[0],metaObj.span()[1] ): arr[index] = 1 descPos = self.getDescPosByYPos(lineIndex) for descPos in descPos: for i in range( descPos[0],len(self.getLineText(lineIndex)) ): arr[i] = 2 strPos = self.getStrPosByYPos(lineIndex) for index in range( int(len(strPos)/2) ): start = strPos[index*2] end = strPos[index*2+1] for i in range( start[0],end[0] ): arr[i] = 3 for index in range(len(arr)): if FUF.isChineseChar(lineStr[index]): font = self.getChineseCharFont() else: font = self.getFont() retuArr.append( ( PythonTextDocument.PENARR[ arr[index] ] ,font) ) return retuArr
def getSelectedTextIndexPosSorted(self): selectedTextIndexPosRange = self.getSelectedTextIndexPos() if selectedTextIndexPosRange == None: return None selectedStart,selectedEnd = selectedTextIndexPosRange sortedInfoDict = FUF.sortedIndexPos( selectedStart , selectedEnd ) return ( sortedInfoDict['first'],sortedInfoDict['second'] )
def __onHomeEndKey(self,event): if FUF.hasModifier(event.modifiers()) == False: curIndexPos = self.cursor().getCursorIndexPos() if event.key() == QtCore.Qt.Key_Home: newIndexPos = ( 0,curIndexPos[1] ) else: newIndexPos = ( len(self.document().getLineText(curIndexPos[1])),curIndexPos[1] ) self.cursor().setGlobalCursorPos( newIndexPos ) else: if FUF.onlyCtrlModifier(event.modifiers()): if event.key() == QtCore.Qt.Key_Home: lineIndex = 0 newIndexPos = ( 0,0 ) else: lineIndex = self.calcMaxStartDisLineNumber() lineCount = self.document().getLineCount()-1 newIndexPos = ( len(self.document().getLineText(lineCount)),lineCount ) self.cursor().setGlobalCursorPos( newIndexPos ) self.showLineNumberAsTop(lineIndex)
def __onPageKey(self,event): if FUF.hasModifier(event.modifiers()) == False: if event.key() == QtCore.Qt.Key_PageUp: newLineNumber = max([ self.settings().getStartDisLineNumber()-self.calcDisLineNumber(),0 ]) elif event.key() == QtCore.Qt.Key_PageDown: newLineNumber = min([ self.settings().getStartDisLineNumber()+self.calcDisLineNumber(),self.document().getLineCount()-1 ]) else: if FUF.onlyCtrlModifier(event.modifiers()): if event.key() == QtCore.Qt.Key_PageUp: newLineNumber = 0 elif event.key() == QtCore.Qt.Key_PageDown: newLineNumber = self.calcMaxStartDisLineNumber() else: return curIndexPos = self.cursor().getCursorIndexPos() newIndexPos = self.document().formatIndexPos( (curIndexPos[0],curIndexPos[1] - (self.settings().getStartDisLineNumber() - newLineNumber)) ) self.showLineNumberAsTop( newLineNumber ) self.cursor().setGlobalCursorPos( newIndexPos )
def calcIndexPosDistance(self,indexPos1,indexPos2,absValue = True): sortedIndexPosDict = FUF.sortedIndexPos(indexPos1, indexPos2) positiveSign = -1 if (sortedIndexPosDict['changed'] == True) and (absValue == False) else 1 indexPosA = sortedIndexPosDict['first'] indexPosB = sortedIndexPosDict['second'] if indexPosA[1] == indexPosB[1]: absV = indexPosB[0] - indexPosA[0] else: absV = len(self.getLineText(indexPosA[1])) - indexPosA[0] + 1 absV += indexPosB[0] for index in range( indexPosA[1]+1,indexPosB[1] ): absV += len(self.getLineText(index)) + 1 return positiveSign * absV
def __insertText(self,xyIndexPosTuple,text): splitedTexts = FUF.splitTextToLines(text)['splitedTexts'] indexPos = xyIndexPosTuple operateRecords = [] for index in range(len( splitedTexts )-1): retuDict = self.__insertTextWithoutLineBreak( indexPos , splitedTexts[index]) indexPos = retuDict['newXYIndexPos'] operateRecords.append( retuDict['operateRecord'] ) retuDict = self.__insertLineBreak( indexPos) indexPos = retuDict['newXYIndexPos'] operateRecords.append( retuDict['operateRecord'] ) retuDict = self.__insertTextWithoutLineBreak( indexPos , splitedTexts[-1]) indexPos = retuDict['newXYIndexPos'] operateRecords.append( retuDict['operateRecord'] ) return RetuInfo.info( indexPos = indexPos,operateRecords = operateRecords )
def __onTabKey(self,event): if self.selectedTextManager().getSelectedTextIndexPos() == None: insertSpaceLen = 4 - (self.cursor().getCursorIndexPos()[0] % 4) indexPos = self.document().insertText(self.cursor().getCursorIndexPos(), ' '*insertSpaceLen) self.cursor().setGlobalCursorPos(indexPos) else: curSelectedIndexPos = self.selectedTextManager().getSelectedTextIndexPos() retuSortedPoses = FUF.sortedIndexPos( curSelectedIndexPos[0],curSelectedIndexPos[1]) affectedLineIndexList = list(range( retuSortedPoses['first'][1],retuSortedPoses['second'][1]+1 )) for lineIndex in affectedLineIndexList: self.document().insertText( (0,lineIndex),' '*CEGD.spaceToInsertTOL ) curCursorPos = self.cursor().getCursorIndexPos() if affectedLineIndexList.count(curCursorPos[1]) != 0: self.cursor().setGlobalCursorPos( (curCursorPos[0]+CEGD.spaceToInsertTOL,curCursorPos[1]) ) self.selectedTextManager().setSelectTextIndexPos( (curSelectedIndexPos[0][0]+CEGD.spaceToInsertTOL,curSelectedIndexPos[0][1]) ,\ (curSelectedIndexPos[1][0]+CEGD.spaceToInsertTOL,curSelectedIndexPos[1][1]) ) self.update()
def transUserClickedPixelPosToIndexPos(self,xyClickedPixelPosTuple): x,y = xyClickedPixelPosTuple x = max([x,0]) lineIndex = self.settings().getStartDisLineNumber() + int((y-CEGD.TextYOff)/self.settings().getFontMetrics().lineSpacing()) lineIndex = FUF.calcMidNumberByRange(0, lineIndex, self.__textDocument.getLineCount()-1) charWidthArray = self.__textDocument.getLineCharWidthArrayByIndex(lineIndex) startX = 0 - self.settings().getStartDisLetterXOff() xIndex = 0 while xIndex < len(charWidthArray): charWidth = charWidthArray[xIndex] startX += charWidth + CEGD.CharDistancePixel xIndex += 1 if startX >= x: break if startX > x: if ( startX - (charWidth + CEGD.CharDistancePixel)/2 > x ): startX -= (charWidth + CEGD.CharDistancePixel) xIndex -= 1 return RetuInfo.info( indexPos = ( xIndex,lineIndex ) , offset = x-startX )
def setSelectedCode(self, code): code = FUF.calcMidNumberByRange(0, code, 0xFFFF) if code != self.__selectedCode: self.__selectedCode = code self.selectedCodeChanged.emit(code)
def setStartDisCode(self, newStartDisCode): code = FUF.calcMidNumberByRange(0, newStartDisCode, 0xFFFF) code = (code // 16) * 16 if code != self.__startDisCode: self.__startDisCode = code self.startDisCodeChanged.emit(code)
def showLineNumberAsTop(self,lineNumber,update=True): suitedLineNumber = FUF.calcMidNumberByRange( 0,lineNumber,self.document().getLineCount()-1 ) self.settings().setStartDisLineNumber(suitedLineNumber,update)