TextBox has double-click to select word
This commit is contained in:
		
							parent
							
								
									50d7d74097
								
							
						
					
					
						commit
						8c03b516e3
					
				@ -130,8 +130,7 @@ func (element *File) HandleMouseDown (x, y int, button input.Button) {
 | 
				
			|||||||
func (element *File) HandleMouseUp (x, y int, button input.Button) {
 | 
					func (element *File) HandleMouseUp (x, y int, button input.Button) {
 | 
				
			||||||
	if button != input.ButtonLeft { return }
 | 
						if button != input.ButtonLeft { return }
 | 
				
			||||||
	element.pressed = false
 | 
						element.pressed = false
 | 
				
			||||||
	within := image.Point { x, y }.
 | 
						within := image.Point { x, y }.In(element.Bounds())
 | 
				
			||||||
		In(element.Bounds())
 | 
					 | 
				
			||||||
	if time.Since(element.lastClick) < element.config.DoubleClickDelay() {
 | 
						if time.Since(element.lastClick) < element.config.DoubleClickDelay() {
 | 
				
			||||||
		if element.Enabled() && within && element.onChoose != nil {
 | 
							if element.Enabled() && within && element.onChoose != nil {
 | 
				
			||||||
			element.onChoose()
 | 
								element.onChoose()
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,7 @@
 | 
				
			|||||||
package elements
 | 
					package elements
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import "io"
 | 
					import "io"
 | 
				
			||||||
 | 
					import "time"
 | 
				
			||||||
import "image"
 | 
					import "image"
 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo"
 | 
					import "git.tebibyte.media/sashakoshka/tomo"
 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/data"
 | 
					import "git.tebibyte.media/sashakoshka/tomo/data"
 | 
				
			||||||
@ -22,9 +23,10 @@ type TextBox struct {
 | 
				
			|||||||
	core core.CoreControl
 | 
						core core.CoreControl
 | 
				
			||||||
	focusableControl core.FocusableCoreControl
 | 
						focusableControl core.FocusableCoreControl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dragging bool
 | 
						lastClick   time.Time
 | 
				
			||||||
	dot    textmanip.Dot
 | 
						dragging    int
 | 
				
			||||||
	scroll int
 | 
						dot         textmanip.Dot
 | 
				
			||||||
 | 
						scroll      int
 | 
				
			||||||
	placeholder string
 | 
						placeholder string
 | 
				
			||||||
	text        []rune
 | 
						text        []rune
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
@ -81,23 +83,50 @@ func (element *TextBox) HandleMouseDown (x, y int, button input.Button) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	if button == input.ButtonLeft {
 | 
						if button == input.ButtonLeft {
 | 
				
			||||||
		runeIndex := element.atPosition(image.Pt(x, y))
 | 
							runeIndex := element.atPosition(image.Pt(x, y))
 | 
				
			||||||
		element.dragging = true
 | 
							if runeIndex == -1 { return }
 | 
				
			||||||
		if runeIndex > -1 {
 | 
							
 | 
				
			||||||
 | 
							if time.Since(element.lastClick) < element.config.DoubleClickDelay() {
 | 
				
			||||||
 | 
								element.dragging = 2
 | 
				
			||||||
 | 
								element.dot = textmanip.WordAround(element.text, runeIndex)
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								element.dragging = 1
 | 
				
			||||||
			element.dot = textmanip.EmptyDot(runeIndex)
 | 
								element.dot = textmanip.EmptyDot(runeIndex)
 | 
				
			||||||
			element.redo()
 | 
								element.lastClick = time.Now()
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							element.redo()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (element *TextBox) HandleMotion (x, y int) {
 | 
					func (element *TextBox) HandleMotion (x, y int) {
 | 
				
			||||||
	if !element.Enabled() { return }
 | 
						if !element.Enabled() { return }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if element.dragging {
 | 
						switch element.dragging {
 | 
				
			||||||
 | 
						case 1:
 | 
				
			||||||
		runeIndex := element.atPosition(image.Pt(x, y))
 | 
							runeIndex := element.atPosition(image.Pt(x, y))
 | 
				
			||||||
		if runeIndex > -1 {
 | 
							if runeIndex > -1 {
 | 
				
			||||||
			element.dot.End = runeIndex
 | 
								element.dot.End = runeIndex
 | 
				
			||||||
			element.redo()
 | 
								element.redo()
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
						case 2:
 | 
				
			||||||
 | 
							runeIndex := element.atPosition(image.Pt(x, y))
 | 
				
			||||||
 | 
							if runeIndex > -1 {
 | 
				
			||||||
 | 
								if runeIndex < element.dot.Start {
 | 
				
			||||||
 | 
									element.dot.End =
 | 
				
			||||||
 | 
										runeIndex -
 | 
				
			||||||
 | 
										textmanip.WordToLeft (
 | 
				
			||||||
 | 
											element.text,
 | 
				
			||||||
 | 
											runeIndex)
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									element.dot.End =
 | 
				
			||||||
 | 
										runeIndex +
 | 
				
			||||||
 | 
										textmanip.WordToRight (
 | 
				
			||||||
 | 
											element.text,
 | 
				
			||||||
 | 
											runeIndex)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								element.redo()
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -120,7 +149,7 @@ func (element *TextBox) atPosition (position image.Point) int {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func (element *TextBox) HandleMouseUp (x, y int, button input.Button) {
 | 
					func (element *TextBox) HandleMouseUp (x, y int, button input.Button) {
 | 
				
			||||||
	if button == input.ButtonLeft {
 | 
						if button == input.ButtonLeft {
 | 
				
			||||||
		element.dragging = false
 | 
							element.dragging = 0
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -13,7 +13,7 @@ func EmptyDot (position int) Dot {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// Canon places the lesser value at the start, and the greater value at the end.
 | 
					// Canon places the lesser value at the start, and the greater value at the end.
 | 
				
			||||||
// Note that a canonized dot does not in all cases correspond directly to the
 | 
					// Note that a canonized dot does not in all cases correspond directly to the
 | 
				
			||||||
// original.
 | 
					// original, because there is a semantic value to the start and end positions.
 | 
				
			||||||
func (dot Dot) Canon () Dot {
 | 
					func (dot Dot) Canon () Dot {
 | 
				
			||||||
	if dot.Start > dot.End {
 | 
						if dot.Start > dot.End {
 | 
				
			||||||
		return Dot { dot.End, dot.Start }
 | 
							return Dot { dot.End, dot.Start }
 | 
				
			||||||
@ -35,7 +35,7 @@ func (dot Dot) Add (delta int) Dot {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Add shifts the dot to the left by the specified amount.
 | 
					// Sub shifts the dot to the left by the specified amount.
 | 
				
			||||||
func (dot Dot) Sub (delta int) Dot {
 | 
					func (dot Dot) Sub (delta int) Dot {
 | 
				
			||||||
	return Dot {
 | 
						return Dot {
 | 
				
			||||||
		dot.Start - delta,
 | 
							dot.Start - delta,
 | 
				
			||||||
@ -103,8 +103,8 @@ func WordToRight (text []rune, position int) (length int) {
 | 
				
			|||||||
// WordAround returns a dot that surrounds the word at the specified position.
 | 
					// WordAround returns a dot that surrounds the word at the specified position.
 | 
				
			||||||
func WordAround (text []rune, position int) (around Dot) {
 | 
					func WordAround (text []rune, position int) (around Dot) {
 | 
				
			||||||
	return Dot {
 | 
						return Dot {
 | 
				
			||||||
		WordToLeft(text, position),
 | 
							position - WordToLeft(text, position),
 | 
				
			||||||
		WordToRight(text, position),
 | 
							position + WordToRight(text, position),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user