Exemplo n.º 1
0
    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()
Exemplo n.º 2
0
    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()
Exemplo n.º 3
0
 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())
Exemplo n.º 4
0
    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()
Exemplo n.º 7
0
    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'] )
Exemplo n.º 10
0
 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)
Exemplo n.º 11
0
 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 )
Exemplo n.º 12
0
 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
Exemplo n.º 13
0
 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 )
Exemplo n.º 14
0
 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()
Exemplo n.º 15
0
 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)
Exemplo n.º 18
0
 def showLineNumberAsTop(self,lineNumber,update=True):
     suitedLineNumber = FUF.calcMidNumberByRange( 0,lineNumber,self.document().getLineCount()-1 )
     self.settings().setStartDisLineNumber(suitedLineNumber,update)