Add multi-line text inputs
This commit is contained in:
		
							parent
							
								
									c7887c5ea4
								
							
						
					
					
						commit
						92e4eb970d
					
				
							
								
								
									
										60
									
								
								textinput.go
									
									
									
									
									
								
							
							
						
						
									
										60
									
								
								textinput.go
									
									
									
									
									
								
							@ -10,27 +10,47 @@ var _ tomo.ContentObject = new(TextInput)
 | 
			
		||||
 | 
			
		||||
// TextInput is a single-line editable text box.
 | 
			
		||||
type TextInput struct {
 | 
			
		||||
	box  tomo.TextBox
 | 
			
		||||
	text []rune
 | 
			
		||||
	box       tomo.TextBox
 | 
			
		||||
	text      []rune
 | 
			
		||||
	multiline bool
 | 
			
		||||
	on struct {
 | 
			
		||||
		valueChange event.FuncBroadcaster
 | 
			
		||||
		confirm     event.FuncBroadcaster
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewTextInput creates a new text input containing the specified text.
 | 
			
		||||
func NewTextInput (text string) *TextInput {
 | 
			
		||||
	textInput := &TextInput { box: tomo.NewTextBox() }
 | 
			
		||||
func newTextInput (text string, multiline bool) *TextInput {
 | 
			
		||||
	textInput := &TextInput {
 | 
			
		||||
		box:       tomo.NewTextBox(),
 | 
			
		||||
		multiline: multiline,
 | 
			
		||||
	}
 | 
			
		||||
	textInput.box.SetRole(tomo.R("objects", "TextInput"))
 | 
			
		||||
	textInput.box.SetAttr(tomo.AAlign(tomo.AlignStart, tomo.AlignMiddle))
 | 
			
		||||
	textInput.box.SetAttr(tomo.AOverflow(true, false))
 | 
			
		||||
	textInput.box.SetTag("multiline", multiline)
 | 
			
		||||
	if multiline {
 | 
			
		||||
		textInput.box.SetAttr(tomo.AOverflow(false, true))
 | 
			
		||||
		textInput.box.SetAttr(tomo.AAlign(tomo.AlignStart, tomo.AlignStart))
 | 
			
		||||
	} else {
 | 
			
		||||
		textInput.box.SetAttr(tomo.AOverflow(true, false))
 | 
			
		||||
		textInput.box.SetAttr(tomo.AAlign(tomo.AlignStart, tomo.AlignMiddle))
 | 
			
		||||
	}
 | 
			
		||||
	textInput.SetValue(text)
 | 
			
		||||
	textInput.box.SetFocusable(true)
 | 
			
		||||
	textInput.box.SetSelectable(true)
 | 
			
		||||
	textInput.box.OnKeyDown(textInput.handleKeyDown)
 | 
			
		||||
	textInput.box.OnKeyUp(textInput.handleKeyUp)
 | 
			
		||||
	textInput.box.OnScroll(textInput.handleScroll)
 | 
			
		||||
	return textInput
 | 
			
		||||
	return textInput	
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewTextInput creates a new text input containing the specified text.
 | 
			
		||||
func NewTextInput (text string) *TextInput {
 | 
			
		||||
	return newTextInput(text, false)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewMultilineTextInput creates a new multiline text input containing the
 | 
			
		||||
// specified text.
 | 
			
		||||
func NewMultilineTextInput (text string) *TextInput {
 | 
			
		||||
	return newTextInput(text, true)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetBox returns the underlying box.
 | 
			
		||||
@ -123,6 +143,19 @@ func (this *TextInput) handleKeyDown (key input.Key, numpad bool) bool {
 | 
			
		||||
		}
 | 
			
		||||
	} ()
 | 
			
		||||
 | 
			
		||||
	typ := func () {
 | 
			
		||||
		this.text, dot = text.Type(this.text, dot, rune(key))
 | 
			
		||||
		changed = true
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if this.multiline && !modifiers.Control {
 | 
			
		||||
		switch {
 | 
			
		||||
		case key == '\n', key == '\t':
 | 
			
		||||
			typ()
 | 
			
		||||
			return true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	switch {
 | 
			
		||||
	case isConfirmationKey(key):
 | 
			
		||||
		this.on.confirm.Broadcast()
 | 
			
		||||
@ -136,8 +169,7 @@ func (this *TextInput) handleKeyDown (key input.Key, numpad bool) bool {
 | 
			
		||||
		changed = true
 | 
			
		||||
		return true
 | 
			
		||||
	case key.Printable() && !modifiers.Control:
 | 
			
		||||
		this.text, dot = text.Type(this.text, dot, rune(key))
 | 
			
		||||
		changed = true
 | 
			
		||||
		typ()
 | 
			
		||||
		return true
 | 
			
		||||
	default:
 | 
			
		||||
		return false
 | 
			
		||||
@ -146,6 +178,14 @@ func (this *TextInput) handleKeyDown (key input.Key, numpad bool) bool {
 | 
			
		||||
 | 
			
		||||
func (this *TextInput) handleKeyUp (key input.Key, numpad bool) bool {
 | 
			
		||||
	modifiers := this.box.Window().Modifiers()
 | 
			
		||||
 | 
			
		||||
	if this.multiline && !modifiers.Control {
 | 
			
		||||
		switch {
 | 
			
		||||
		case key == '\n', key == '\t':
 | 
			
		||||
			return true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	switch {
 | 
			
		||||
	case isConfirmationKey(key):
 | 
			
		||||
		return true
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user