Fix native terminal paste and custom form widgets
This commit is contained in:
parent
e48ff5bea4
commit
d1b62b854c
@ -62,6 +62,10 @@ type AdvancedInputField struct {
|
|||||||
// The text color of the placeholder.
|
// The text color of the placeholder.
|
||||||
placeholderTextColor tcell.Color
|
placeholderTextColor tcell.Color
|
||||||
|
|
||||||
|
// The screen width of the label area. A value of 0 means use the width of
|
||||||
|
// the label text.
|
||||||
|
labelWidth int
|
||||||
|
|
||||||
// The screen width of the input area. A value of 0 means extend as much as
|
// The screen width of the input area. A value of 0 means extend as much as
|
||||||
// possible.
|
// possible.
|
||||||
fieldWidth int
|
fieldWidth int
|
||||||
@ -132,6 +136,13 @@ func (field *AdvancedInputField) SetLabel(label string) *AdvancedInputField {
|
|||||||
return field
|
return field
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SetLabelWidth sets the screen width of the label. A value of 0 will cause the
|
||||||
|
// primitive to use the width of the label string.
|
||||||
|
func (field *AdvancedInputField) SetLabelWidth(width int) *AdvancedInputField {
|
||||||
|
field.labelWidth = width
|
||||||
|
return field
|
||||||
|
}
|
||||||
|
|
||||||
// GetLabel returns the text to be displayed before the input area.
|
// GetLabel returns the text to be displayed before the input area.
|
||||||
func (field *AdvancedInputField) GetLabel() string {
|
func (field *AdvancedInputField) GetLabel() string {
|
||||||
return field.label
|
return field.label
|
||||||
@ -168,8 +179,8 @@ func (field *AdvancedInputField) SetPlaceholderExtColor(color tcell.Color) *Adva
|
|||||||
}
|
}
|
||||||
|
|
||||||
// SetFormAttributes sets attributes shared by all form items.
|
// SetFormAttributes sets attributes shared by all form items.
|
||||||
func (field *AdvancedInputField) SetFormAttributes(label string, labelColor, bgColor, fieldTextColor, fieldBgColor tcell.Color) tview.FormItem {
|
func (field *AdvancedInputField) SetFormAttributes(labelWidth int, labelColor, bgColor, fieldTextColor, fieldBgColor tcell.Color) tview.FormItem {
|
||||||
field.label = label
|
field.labelWidth = labelWidth
|
||||||
field.labelColor = labelColor
|
field.labelColor = labelColor
|
||||||
field.SetBackgroundColor(bgColor)
|
field.SetBackgroundColor(bgColor)
|
||||||
field.fieldTextColor = fieldTextColor
|
field.fieldTextColor = fieldTextColor
|
||||||
@ -314,8 +325,18 @@ func (field *AdvancedInputField) Draw(screen tcell.Screen) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
_, drawnWidth := tview.Print(screen, field.label, x, y, rightLimit-x, tview.AlignLeft, field.labelColor)
|
// Draw label.
|
||||||
x += drawnWidth
|
if field.labelWidth > 0 {
|
||||||
|
labelWidth := field.labelWidth
|
||||||
|
if labelWidth > rightLimit-x {
|
||||||
|
labelWidth = rightLimit - x
|
||||||
|
}
|
||||||
|
tview.Print(screen, field.label, x, y, labelWidth, tview.AlignLeft, field.labelColor)
|
||||||
|
x += labelWidth
|
||||||
|
} else {
|
||||||
|
_, drawnWidth := tview.Print(screen, field.label, x, y, rightLimit-x, tview.AlignLeft, field.labelColor)
|
||||||
|
x += drawnWidth
|
||||||
|
}
|
||||||
|
|
||||||
fieldWidth := field.drawInput(screen, rightLimit, x, y)
|
fieldWidth := field.drawInput(screen, rightLimit, x, y)
|
||||||
text := field.prepareText(screen, fieldWidth, x, y)
|
text := field.prepareText(screen, fieldWidth, x, y)
|
||||||
@ -349,7 +370,11 @@ func (field *AdvancedInputField) setCursor(screen tcell.Screen) {
|
|||||||
y++
|
y++
|
||||||
rightLimit -= 2
|
rightLimit -= 2
|
||||||
}
|
}
|
||||||
x = x + tview.StringWidth(field.label) + field.cursorOffset - field.viewOffset
|
labelWidth := field.labelWidth
|
||||||
|
if labelWidth == 0 {
|
||||||
|
labelWidth = tview.StringWidth(field.label)
|
||||||
|
}
|
||||||
|
x = x + labelWidth + field.cursorOffset - field.viewOffset
|
||||||
if x >= rightLimit {
|
if x >= rightLimit {
|
||||||
x = rightLimit - 1
|
x = rightLimit - 1
|
||||||
} else if x < origX {
|
} else if x < origX {
|
||||||
@ -484,6 +509,18 @@ func (field *AdvancedInputField) InputHandler() func(event *tcell.EventKey, setF
|
|||||||
return field.WrapInputHandler(field.inputHandler)
|
return field.WrapInputHandler(field.inputHandler)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (field *AdvancedInputField) PasteHandler() func(event *tcell.EventPaste) {
|
||||||
|
return field.WrapPasteHandler(field.pasteHandler)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (field *AdvancedInputField) pasteHandler(event *tcell.EventPaste) {
|
||||||
|
defer field.handleInputChanges(field.text)
|
||||||
|
clip := event.Text()
|
||||||
|
leftPart := SubstringBefore(field.text, field.cursorOffset)
|
||||||
|
field.text = leftPart + clip + field.text[len(leftPart):]
|
||||||
|
field.cursorOffset += runewidth.StringWidth(clip)
|
||||||
|
}
|
||||||
|
|
||||||
func (field *AdvancedInputField) inputHandler(event *tcell.EventKey, setFocus func(p tview.Primitive)) {
|
func (field *AdvancedInputField) inputHandler(event *tcell.EventKey, setFocus func(p tview.Primitive)) {
|
||||||
defer field.handleInputChanges(field.text)
|
defer field.handleInputChanges(field.text)
|
||||||
|
|
||||||
|
@ -29,7 +29,7 @@ func (ftv *FormTextView) GetLabel() string {
|
|||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ftv *FormTextView) SetFormAttributes(label string, labelColor, bgColor, fieldTextColor, fieldBgColor tcell.Color) tview.FormItem {
|
func (ftv *FormTextView) SetFormAttributes(labelWidth int, labelColor, bgColor, fieldTextColor, fieldBgColor tcell.Color) tview.FormItem {
|
||||||
return ftv
|
return ftv
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user