mirror of
https://github.com/taigrr/wtf
synced 2026-04-02 02:28:55 -07:00
Add gerrit widget
This commit is contained in:
90
vendor/github.com/rivo/tview/textview.go
generated
vendored
90
vendor/github.com/rivo/tview/textview.go
generated
vendored
@@ -104,6 +104,10 @@ type TextView struct {
|
||||
// during re-indexing. Set to -1 if there is no current highlight.
|
||||
fromHighlight, toHighlight int
|
||||
|
||||
// The screen space column of the highlight in its first line. Set to -1 if
|
||||
// there is no current highlight.
|
||||
posHighlight int
|
||||
|
||||
// A set of region IDs that are currently highlighted.
|
||||
highlights map[string]struct{}
|
||||
|
||||
@@ -171,6 +175,7 @@ func NewTextView() *TextView {
|
||||
align: AlignLeft,
|
||||
wrap: true,
|
||||
textColor: Styles.PrimaryTextColor,
|
||||
regions: false,
|
||||
dynamicColors: false,
|
||||
}
|
||||
}
|
||||
@@ -503,7 +508,7 @@ func (t *TextView) reindexBuffer(width int) {
|
||||
return // Nothing has changed. We can still use the current index.
|
||||
}
|
||||
t.index = nil
|
||||
t.fromHighlight, t.toHighlight = -1, -1
|
||||
t.fromHighlight, t.toHighlight, t.posHighlight = -1, -1, -1
|
||||
|
||||
// If there's no space, there's no index.
|
||||
if width < 1 {
|
||||
@@ -522,8 +527,9 @@ func (t *TextView) reindexBuffer(width int) {
|
||||
colorTags [][]string
|
||||
escapeIndices [][]int
|
||||
)
|
||||
strippedStr := str
|
||||
if t.dynamicColors {
|
||||
colorTagIndices, colorTags, escapeIndices, str, _ = decomposeString(str)
|
||||
colorTagIndices, colorTags, escapeIndices, strippedStr, _ = decomposeString(str)
|
||||
}
|
||||
|
||||
// Find all regions in this line. Then remove them.
|
||||
@@ -534,14 +540,18 @@ func (t *TextView) reindexBuffer(width int) {
|
||||
if t.regions {
|
||||
regionIndices = regionPattern.FindAllStringIndex(str, -1)
|
||||
regions = regionPattern.FindAllStringSubmatch(str, -1)
|
||||
str = regionPattern.ReplaceAllString(str, "")
|
||||
if !t.dynamicColors {
|
||||
// We haven't detected escape tags yet. Do it now.
|
||||
escapeIndices = escapePattern.FindAllStringIndex(str, -1)
|
||||
str = escapePattern.ReplaceAllString(str, "[$1$2]")
|
||||
}
|
||||
strippedStr = regionPattern.ReplaceAllString(strippedStr, "")
|
||||
}
|
||||
|
||||
// Find all escape tags in this line. Escape them.
|
||||
if t.dynamicColors || t.regions {
|
||||
escapeIndices = escapePattern.FindAllStringIndex(str, -1)
|
||||
strippedStr = escapePattern.ReplaceAllString(strippedStr, "[$1$2]")
|
||||
}
|
||||
|
||||
// We don't need the original string anymore for now.
|
||||
str = strippedStr
|
||||
|
||||
// Split the line if required.
|
||||
var splitLines []string
|
||||
if t.wrap && len(str) > 0 {
|
||||
@@ -585,15 +595,53 @@ func (t *TextView) reindexBuffer(width int) {
|
||||
|
||||
// Shift original position with tags.
|
||||
lineLength := len(splitLine)
|
||||
remainingLength := lineLength
|
||||
tagEnd := originalPos
|
||||
totalTagLength := 0
|
||||
for {
|
||||
if colorPos < len(colorTagIndices) && colorTagIndices[colorPos][0] <= originalPos+lineLength {
|
||||
// Which tag comes next?
|
||||
nextTag := make([][3]int, 0, 3)
|
||||
if colorPos < len(colorTagIndices) {
|
||||
nextTag = append(nextTag, [3]int{colorTagIndices[colorPos][0], colorTagIndices[colorPos][1], 0}) // 0 = color tag.
|
||||
}
|
||||
if regionPos < len(regionIndices) {
|
||||
nextTag = append(nextTag, [3]int{regionIndices[regionPos][0], regionIndices[regionPos][1], 1}) // 1 = region tag.
|
||||
}
|
||||
if escapePos < len(escapeIndices) {
|
||||
nextTag = append(nextTag, [3]int{escapeIndices[escapePos][0], escapeIndices[escapePos][1], 2}) // 2 = escape tag.
|
||||
}
|
||||
minPos := -1
|
||||
tagIndex := -1
|
||||
for index, pair := range nextTag {
|
||||
if minPos < 0 || pair[0] < minPos {
|
||||
minPos = pair[0]
|
||||
tagIndex = index
|
||||
}
|
||||
}
|
||||
|
||||
// Is the next tag in range?
|
||||
if tagIndex < 0 || minPos >= tagEnd+remainingLength {
|
||||
break // No. We're done with this line.
|
||||
}
|
||||
|
||||
// Advance.
|
||||
strippedTagStart := nextTag[tagIndex][0] - originalPos - totalTagLength
|
||||
tagEnd = nextTag[tagIndex][1]
|
||||
tagLength := tagEnd - nextTag[tagIndex][0]
|
||||
if nextTag[tagIndex][2] == 2 {
|
||||
tagLength = 1
|
||||
}
|
||||
totalTagLength += tagLength
|
||||
remainingLength = lineLength - (tagEnd - originalPos - totalTagLength)
|
||||
|
||||
// Process the tag.
|
||||
switch nextTag[tagIndex][2] {
|
||||
case 0:
|
||||
// Process color tags.
|
||||
originalPos += colorTagIndices[colorPos][1] - colorTagIndices[colorPos][0]
|
||||
foregroundColor, backgroundColor, attributes = styleFromTag(foregroundColor, backgroundColor, attributes, colorTags[colorPos])
|
||||
colorPos++
|
||||
} else if regionPos < len(regionIndices) && regionIndices[regionPos][0] <= originalPos+lineLength {
|
||||
case 1:
|
||||
// Process region tags.
|
||||
originalPos += regionIndices[regionPos][1] - regionIndices[regionPos][0]
|
||||
regionID = regions[regionPos][1]
|
||||
_, highlighted = t.highlights[regionID]
|
||||
|
||||
@@ -602,23 +650,21 @@ func (t *TextView) reindexBuffer(width int) {
|
||||
line := len(t.index)
|
||||
if t.fromHighlight < 0 {
|
||||
t.fromHighlight, t.toHighlight = line, line
|
||||
t.posHighlight = runewidth.StringWidth(splitLine[:strippedTagStart])
|
||||
} else if line > t.toHighlight {
|
||||
t.toHighlight = line
|
||||
}
|
||||
}
|
||||
|
||||
regionPos++
|
||||
} else if escapePos < len(escapeIndices) && escapeIndices[escapePos][0] <= originalPos+lineLength {
|
||||
case 2:
|
||||
// Process escape tags.
|
||||
originalPos++
|
||||
escapePos++
|
||||
} else {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
// Advance to next line.
|
||||
originalPos += lineLength
|
||||
originalPos += lineLength + totalTagLength
|
||||
|
||||
// Append this line.
|
||||
line.NextPos = originalPos
|
||||
@@ -683,6 +729,16 @@ func (t *TextView) Draw(screen tcell.Screen) {
|
||||
// No, let's move to the start of the highlights.
|
||||
t.lineOffset = t.fromHighlight
|
||||
}
|
||||
|
||||
// If the highlight is too far to the right, move it to the middle.
|
||||
if t.posHighlight-t.columnOffset > 3*width/4 {
|
||||
t.columnOffset = t.posHighlight - width/2
|
||||
}
|
||||
|
||||
// If the highlight is off-screen on the left, move it on-screen.
|
||||
if t.posHighlight-t.columnOffset < 0 {
|
||||
t.columnOffset = t.posHighlight - width/4
|
||||
}
|
||||
}
|
||||
t.scrollToHighlights = false
|
||||
|
||||
|
||||
Reference in New Issue
Block a user