mirror of
https://github.com/Maks1mS/bubbles.git
synced 2024-12-25 15:04:39 +03:00
Use a slice of runes as the underlying textinput value
This commit is contained in:
parent
72fd4e3e3e
commit
74cc86fce5
@ -45,7 +45,7 @@ type Model struct {
|
|||||||
Width int
|
Width int
|
||||||
|
|
||||||
// Underlying text value
|
// Underlying text value
|
||||||
value string
|
value []rune
|
||||||
|
|
||||||
// Focus indicates whether user input focus should be on this input
|
// Focus indicates whether user input focus should be on this input
|
||||||
// component. When false, don't blink and ignore keyboard input.
|
// component. When false, don't blink and ignore keyboard input.
|
||||||
@ -64,10 +64,11 @@ type Model struct {
|
|||||||
|
|
||||||
// SetValue sets the value of the text input.
|
// SetValue sets the value of the text input.
|
||||||
func (m *Model) SetValue(s string) {
|
func (m *Model) SetValue(s string) {
|
||||||
if m.CharLimit > 0 && len(s) > m.CharLimit {
|
runes := []rune(s)
|
||||||
m.value = s[:m.CharLimit]
|
if m.CharLimit > 0 && len(runes) > m.CharLimit {
|
||||||
|
m.value = runes[:m.CharLimit]
|
||||||
} else {
|
} else {
|
||||||
m.value = s
|
m.value = runes
|
||||||
}
|
}
|
||||||
if m.pos > len(m.value) {
|
if m.pos > len(m.value) {
|
||||||
m.pos = len(m.value)
|
m.pos = len(m.value)
|
||||||
@ -77,7 +78,7 @@ func (m *Model) SetValue(s string) {
|
|||||||
|
|
||||||
// Value returns the value of the text input.
|
// Value returns the value of the text input.
|
||||||
func (m Model) Value() string {
|
func (m Model) Value() string {
|
||||||
return m.value
|
return string(m.value)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cursor start moves the cursor to the given position. If the position is out
|
// Cursor start moves the cursor to the given position. If the position is out
|
||||||
@ -118,7 +119,7 @@ func (m *Model) Blur() {
|
|||||||
|
|
||||||
// Reset sets the input to its default state with no input.
|
// Reset sets the input to its default state with no input.
|
||||||
func (m *Model) Reset() {
|
func (m *Model) Reset() {
|
||||||
m.value = ""
|
m.value = nil
|
||||||
m.offset = 0
|
m.offset = 0
|
||||||
m.pos = 0
|
m.pos = 0
|
||||||
m.blink = false
|
m.blink = false
|
||||||
@ -166,7 +167,7 @@ func (m *Model) wordLeft() {
|
|||||||
i := m.pos - 1
|
i := m.pos - 1
|
||||||
|
|
||||||
for i >= 0 {
|
for i >= 0 {
|
||||||
if unicode.IsSpace(rune(m.value[i])) {
|
if unicode.IsSpace(m.value[i]) {
|
||||||
m.pos--
|
m.pos--
|
||||||
i--
|
i--
|
||||||
} else {
|
} else {
|
||||||
@ -175,7 +176,7 @@ func (m *Model) wordLeft() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for i >= 0 {
|
for i >= 0 {
|
||||||
if !unicode.IsSpace(rune(m.value[i])) {
|
if !unicode.IsSpace(m.value[i]) {
|
||||||
m.pos--
|
m.pos--
|
||||||
i--
|
i--
|
||||||
} else {
|
} else {
|
||||||
@ -224,7 +225,7 @@ func NewModel() Model {
|
|||||||
CursorColor: "",
|
CursorColor: "",
|
||||||
CharLimit: 0,
|
CharLimit: 0,
|
||||||
|
|
||||||
value: "",
|
value: nil,
|
||||||
focus: false,
|
focus: false,
|
||||||
blink: true,
|
blink: true,
|
||||||
pos: 0,
|
pos: 0,
|
||||||
@ -245,7 +246,7 @@ func Update(msg tea.Msg, m Model) (Model, tea.Cmd) {
|
|||||||
fallthrough
|
fallthrough
|
||||||
case tea.KeyDelete:
|
case tea.KeyDelete:
|
||||||
if len(m.value) > 0 {
|
if len(m.value) > 0 {
|
||||||
m.value = m.value[:m.pos-1] + m.value[m.pos:]
|
m.value = append(m.value[:m.pos-1], m.value[m.pos:]...)
|
||||||
m.pos--
|
m.pos--
|
||||||
}
|
}
|
||||||
case tea.KeyLeft:
|
case tea.KeyLeft:
|
||||||
@ -272,7 +273,7 @@ func Update(msg tea.Msg, m Model) (Model, tea.Cmd) {
|
|||||||
m.CursorStart()
|
m.CursorStart()
|
||||||
case tea.KeyCtrlD: // ^D, delete char under cursor
|
case tea.KeyCtrlD: // ^D, delete char under cursor
|
||||||
if len(m.value) > 0 && m.pos < len(m.value) {
|
if len(m.value) > 0 && m.pos < len(m.value) {
|
||||||
m.value = m.value[:m.pos] + m.value[m.pos+1:]
|
m.value = append(m.value[:m.pos], m.value[m.pos+1:]...)
|
||||||
}
|
}
|
||||||
case tea.KeyCtrlE: // ^E, go to end
|
case tea.KeyCtrlE: // ^E, go to end
|
||||||
m.CursorEnd()
|
m.CursorEnd()
|
||||||
@ -298,7 +299,7 @@ func Update(msg tea.Msg, m Model) (Model, tea.Cmd) {
|
|||||||
|
|
||||||
// Input a regular character
|
// Input a regular character
|
||||||
if m.CharLimit <= 0 || len(m.value) < m.CharLimit {
|
if m.CharLimit <= 0 || len(m.value) < m.CharLimit {
|
||||||
m.value = m.value[:m.pos] + string(msg.Rune) + m.value[m.pos:]
|
m.value = append(m.value[:m.pos], append([]rune{msg.Rune}, m.value[m.pos:]...)...)
|
||||||
m.pos++
|
m.pos++
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -324,7 +325,7 @@ func View(model tea.Model) string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Placeholder text
|
// Placeholder text
|
||||||
if m.value == "" && m.Placeholder != "" {
|
if m.value == nil && m.Placeholder != "" {
|
||||||
return placeholderView(m)
|
return placeholderView(m)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -338,11 +339,11 @@ func View(model tea.Model) string {
|
|||||||
value := m.value[left:right]
|
value := m.value[left:right]
|
||||||
pos := m.pos - m.offset
|
pos := m.pos - m.offset
|
||||||
|
|
||||||
v := m.colorText(value[:pos])
|
v := m.colorText(string(value[:pos]))
|
||||||
|
|
||||||
if pos < len(value) {
|
if pos < len(value) {
|
||||||
v += cursorView(string(value[pos]), m) // cursor and text under it
|
v += cursorView(string(value[pos]), m) // cursor and text under it
|
||||||
v += m.colorText(value[pos+1:]) // text after cursor
|
v += m.colorText(string(value[pos+1:])) // text after cursor
|
||||||
} else {
|
} else {
|
||||||
v += cursorView(" ", m)
|
v += cursorView(" ", m)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user