-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathedit.py
109 lines (84 loc) · 3.96 KB
/
edit.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import sys
from PySide2.QtGui import QPixmap, QImage, QIcon, QTextCursor, QColor, QTextFormat, QFont, QPainter
from PySide2.QtWidgets import QWidget, QPlainTextEdit, QApplication, QTextEdit
from PySide2.QtCore import Slot, Qt, QPoint, Signal, QEvent, QTimer, QSize, QRect
from layout import Ui_MainWindow, icon
from send_file import SendFileDialog
class LineNumberArea(QWidget):
def __init__(self, browser):
super(LineNumberArea, self).__init__(browser)
self.browser = browser
def sizeHint(self):
return QSize(self.browser.lineNumberAreaWidth(), 0)
def paintEvent(self, event):
self.browser.lineNumberAreaPaintEvent(event)
class LinePlainTextEdit(QPlainTextEdit):
def __init__(self, parent=None):
super(LinePlainTextEdit, self).__init__(parent)
self.lineNumberArea = LineNumberArea(self)
self.blockCountChanged.connect(self.updateLineNumberAreaWidth)
self.updateRequest.connect(self.updateLineNumberArea)
self.cursorPositionChanged.connect(self.highlightCurrentLine)
self.updateLineNumberAreaWidth(0)
# self.highlightCurrentLine()
def setFont(self, font):
super(LinePlainTextEdit, self).setFont(font)
self.lineNumberArea.setFont(font)
def lineNumberAreaPaintEvent(self, event):
painter = QPainter(self.lineNumberArea)
painter.fillRect(event.rect(), QColor(45, 45, 45))
block = self.firstVisibleBlock()
blockNumber = block.blockNumber()
top = round(self.blockBoundingGeometry(block).translated(self.contentOffset()).top())
bottom = top + round(self.blockBoundingRect(block).height())
a = self.blockCount()
while block.isValid() and (top <= event.rect().bottom()):
if block.isVisible() and (bottom >= event.rect().top()):
number = str(blockNumber + 1)
# painter.setPen(Qt.black)
painter.setPen(QColor(145, 145, 145))
painter.drawText(-3, top, self.lineNumberArea.width(), self.fontMetrics().height(),
Qt.AlignRight, number)
block = block.next()
top = bottom
bottom = top + round(self.blockBoundingRect(block).height())
blockNumber += 1
def lineNumberAreaWidth(self):
digits = 1
max_ = max(1, self.blockCount())
while max_ >= 10 :
max_ /= 10
digits += 1
space = 10 + self.fontMetrics().horizontalAdvance(ord('9')) * digits
return space
def resizeEvent(self, event):
super(LinePlainTextEdit, self).resizeEvent(event)
cr = self.contentsRect()
self.lineNumberArea.setGeometry(QRect(cr.left(), cr.top(), self.lineNumberAreaWidth(), cr.height()))
def updateLineNumberAreaWidth(self, newBlockCount):
self.setViewportMargins(self.lineNumberAreaWidth(), 0, 0, 0)
def highlightCurrentLine(self):
extraSelections = list()
if not self.isReadOnly() :
selection = QTextEdit.ExtraSelection()
lineColor = QColor(Qt.yellow).lighter(160)
selection.format.setBackground(lineColor)
selection.format.setProperty(QTextFormat.FullWidthSelection, True)
selection.cursor = self.textCursor()
selection.cursor.clearSelection()
extraSelections.append(selection)
self.setExtraSelections(extraSelections)
def updateLineNumberArea(self, rect, dy):
if dy:
self.lineNumberArea.scroll(0, dy)
else:
self.lineNumberArea.update(0, rect.y(), self.lineNumberArea.width(), rect.height())
if rect.contains(self.viewport().rect()):
self.updateLineNumberAreaWidth(0)
def main():
app = QApplication(sys.argv)
w = LinePlainTextEdit()
w.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()