TextEdit: Colorscheme "Column" style + changed column appearance
This commit is contained in:
parent
cdeb3be359
commit
baafcf3d5c
@ -4,6 +4,7 @@ type Syntax uint8
|
|||||||
|
|
||||||
const (
|
const (
|
||||||
Default Syntax = iota
|
Default Syntax = iota
|
||||||
|
Column // Not necessarily a Syntax; useful for Colorscheming editor column
|
||||||
Keyword
|
Keyword
|
||||||
String
|
String
|
||||||
Special
|
Special
|
||||||
|
@ -45,11 +45,10 @@ type TextEdit struct {
|
|||||||
curx, cury int // Zero-based: cursor points before the character at that position.
|
curx, cury int // Zero-based: cursor points before the character at that position.
|
||||||
prevCurCol int // Previous maximum column the cursor was at, when the user pressed left or right
|
prevCurCol int // Previous maximum column the cursor was at, when the user pressed left or right
|
||||||
scrollx, scrolly int // X and Y offset of view, known as scroll
|
scrollx, scrolly int // X and Y offset of view, known as scroll
|
||||||
|
theme *Theme
|
||||||
|
|
||||||
selection Region // Selection: selectMode determines if it should be used
|
selection Region // Selection: selectMode determines if it should be used
|
||||||
selectMode bool // Whether the user is actively selecting text
|
selectMode bool // Whether the user is actively selecting text
|
||||||
|
|
||||||
Theme *Theme
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// New will initialize the buffer using the given 'contents'. If the 'filePath' or 'FilePath' is empty,
|
// New will initialize the buffer using the given 'contents'. If the 'filePath' or 'FilePath' is empty,
|
||||||
@ -62,8 +61,9 @@ func NewTextEdit(screen *tcell.Screen, filePath string, contents []byte, theme *
|
|||||||
UseHardTabs: true,
|
UseHardTabs: true,
|
||||||
TabSize: 4,
|
TabSize: 4,
|
||||||
FilePath: filePath,
|
FilePath: filePath,
|
||||||
|
|
||||||
screen: screen,
|
screen: screen,
|
||||||
Theme: theme,
|
theme: theme,
|
||||||
}
|
}
|
||||||
te.SetContents(contents)
|
te.SetContents(contents)
|
||||||
return te
|
return te
|
||||||
@ -117,6 +117,7 @@ loop:
|
|||||||
|
|
||||||
colorscheme := &buffer.Colorscheme{
|
colorscheme := &buffer.Colorscheme{
|
||||||
buffer.Default: tcell.Style{}.Foreground(tcell.ColorLightGray).Background(tcell.ColorBlack),
|
buffer.Default: tcell.Style{}.Foreground(tcell.ColorLightGray).Background(tcell.ColorBlack),
|
||||||
|
buffer.Column: tcell.Style{}.Foreground(tcell.ColorDarkGray).Background(tcell.ColorBlack),
|
||||||
buffer.Comment: tcell.Style{}.Foreground(tcell.ColorGray).Background(tcell.ColorBlack),
|
buffer.Comment: tcell.Style{}.Foreground(tcell.ColorGray).Background(tcell.ColorBlack),
|
||||||
buffer.String: tcell.Style{}.Foreground(tcell.ColorOlive).Background(tcell.ColorBlack),
|
buffer.String: tcell.Style{}.Foreground(tcell.ColorOlive).Background(tcell.ColorBlack),
|
||||||
buffer.Keyword: tcell.Style{}.Foreground(tcell.ColorNavy).Background(tcell.ColorBlack),
|
buffer.Keyword: tcell.Style{}.Foreground(tcell.ColorNavy).Background(tcell.ColorBlack),
|
||||||
@ -359,10 +360,10 @@ func (t *TextEdit) CursorRight() {
|
|||||||
|
|
||||||
// getColumnWidth returns the width of the line numbers column if it is present.
|
// getColumnWidth returns the width of the line numbers column if it is present.
|
||||||
func (t *TextEdit) getColumnWidth() int {
|
func (t *TextEdit) getColumnWidth() int {
|
||||||
columnWidth := 0
|
var columnWidth int
|
||||||
if t.LineNumbers {
|
if t.LineNumbers {
|
||||||
// Set columnWidth to max count of line number digits
|
// Set columnWidth to max count of line number digits
|
||||||
columnWidth = Max(2, len(strconv.Itoa(t.Buffer.Lines()))) // Column has minimum width of 2
|
columnWidth = Max(3, 1+len(strconv.Itoa(t.Buffer.Lines()))) // Column has minimum width of 2
|
||||||
}
|
}
|
||||||
return columnWidth
|
return columnWidth
|
||||||
}
|
}
|
||||||
@ -383,8 +384,8 @@ func (t *TextEdit) Draw(s tcell.Screen) {
|
|||||||
columnWidth := t.getColumnWidth()
|
columnWidth := t.getColumnWidth()
|
||||||
bufferLines := t.Buffer.Lines()
|
bufferLines := t.Buffer.Lines()
|
||||||
|
|
||||||
selectedStyle := t.Theme.GetOrDefault("TextEditSelected")
|
selectedStyle := t.theme.GetOrDefault("TextEditSelected")
|
||||||
columnStyle := t.Theme.GetOrDefault("TextEditColumn")
|
columnStyle := t.Highlighter.Colorscheme.GetStyle(buffer.Column)
|
||||||
|
|
||||||
t.Highlighter.UpdateInvalidatedLines(t.scrolly, t.scrolly+(t.height-1))
|
t.Highlighter.UpdateInvalidatedLines(t.scrolly, t.scrolly+(t.height-1))
|
||||||
|
|
||||||
@ -408,22 +409,7 @@ func (t *TextEdit) Draw(s tcell.Screen) {
|
|||||||
var origLineBytes []byte = t.Buffer.Line(line)
|
var origLineBytes []byte = t.Buffer.Line(line)
|
||||||
var lineBytes []byte = origLineBytes // Line to be drawn
|
var lineBytes []byte = origLineBytes // Line to be drawn
|
||||||
|
|
||||||
// When iterating lineTabs: the value at i is
|
|
||||||
// the rune index the tab was found at.
|
|
||||||
// var lineTabs [128]int // Rune index for each hard tab '\t' in lineBytes
|
|
||||||
// var tabs int // Length of lineTabs (number of hard tabs)
|
|
||||||
if t.UseHardTabs {
|
if t.UseHardTabs {
|
||||||
// var ri int // rune index
|
|
||||||
// var i int
|
|
||||||
// for i < len(lineBytes) {
|
|
||||||
// r, size := utf8.DecodeRune(lineBytes[i:])
|
|
||||||
// if r == '\t' {
|
|
||||||
// lineTabs[tabs] = ri
|
|
||||||
// tabs++
|
|
||||||
// }
|
|
||||||
// i += size
|
|
||||||
// ri++
|
|
||||||
// }
|
|
||||||
lineBytes = bytes.ReplaceAll(lineBytes, []byte{'\t'}, tabBytes)
|
lineBytes = bytes.ReplaceAll(lineBytes, []byte{'\t'}, tabBytes)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -435,7 +421,6 @@ func (t *TextEdit) Draw(s tcell.Screen) {
|
|||||||
col := t.x + columnWidth
|
col := t.x + columnWidth
|
||||||
var runeIdx int // Index into lineStr (as runes) we draw the next character at
|
var runeIdx int // Index into lineStr (as runes) we draw the next character at
|
||||||
|
|
||||||
// REWRITE OF SCROLL FUNC:
|
|
||||||
for runeIdx < t.scrollx && byteIdx < len(lineBytes) {
|
for runeIdx < t.scrollx && byteIdx < len(lineBytes) {
|
||||||
_, size := utf8.DecodeRune(lineBytes[byteIdx:]) // Respect UTF-8
|
_, size := utf8.DecodeRune(lineBytes[byteIdx:]) // Respect UTF-8
|
||||||
byteIdx += size
|
byteIdx += size
|
||||||
@ -545,7 +530,7 @@ func (t *TextEdit) Draw(s tcell.Screen) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
columnStr := fmt.Sprintf("%s%s", strings.Repeat(" ", columnWidth-len(lineNumStr)), lineNumStr) // Right align line number
|
columnStr := fmt.Sprintf("%s%s│", strings.Repeat(" ", columnWidth-len(lineNumStr)-1), lineNumStr) // Right align line number
|
||||||
|
|
||||||
DrawStr(s, t.x, lineY, columnStr, columnStyle) // Draw column
|
DrawStr(s, t.x, lineY, columnStr, columnStyle) // Draw column
|
||||||
}
|
}
|
||||||
@ -566,7 +551,7 @@ func (t *TextEdit) SetFocused(v bool) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (t *TextEdit) SetTheme(theme *Theme) {
|
func (t *TextEdit) SetTheme(theme *Theme) {
|
||||||
t.Theme = theme
|
t.theme = theme
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPos gets the position of the TextEdit.
|
// GetPos gets the position of the TextEdit.
|
||||||
|
@ -39,7 +39,6 @@ var DefaultTheme = Theme{
|
|||||||
"TabContainer": tcell.Style{}.Foreground(tcell.ColorGray).Background(tcell.ColorBlack),
|
"TabContainer": tcell.Style{}.Foreground(tcell.ColorGray).Background(tcell.ColorBlack),
|
||||||
"TabContainerFocused": tcell.Style{}.Foreground(tcell.ColorSilver).Background(tcell.ColorBlack),
|
"TabContainerFocused": tcell.Style{}.Foreground(tcell.ColorSilver).Background(tcell.ColorBlack),
|
||||||
"TextEdit": tcell.Style{}.Foreground(tcell.ColorSilver).Background(tcell.ColorBlack),
|
"TextEdit": tcell.Style{}.Foreground(tcell.ColorSilver).Background(tcell.ColorBlack),
|
||||||
"TextEditColumn": tcell.Style{}.Foreground(tcell.ColorBlack).Background(tcell.ColorGray),
|
|
||||||
"TextEditSelected": tcell.Style{}.Foreground(tcell.ColorBlack).Background(tcell.ColorSilver),
|
"TextEditSelected": tcell.Style{}.Foreground(tcell.ColorBlack).Background(tcell.ColorSilver),
|
||||||
"Window": tcell.Style{}.Foreground(tcell.ColorBlack).Background(tcell.ColorDarkGray),
|
"Window": tcell.Style{}.Foreground(tcell.ColorBlack).Background(tcell.ColorDarkGray),
|
||||||
"WindowHeader": tcell.Style{}.Foreground(tcell.ColorBlack).Background(tcell.ColorSilver),
|
"WindowHeader": tcell.Style{}.Foreground(tcell.ColorBlack).Background(tcell.ColorSilver),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user