TextBox has double-click to select word

This commit is contained in:
Sasha Koshka 2023-03-31 20:28:53 -04:00
parent 50d7d74097
commit 8c03b516e3
3 changed files with 42 additions and 14 deletions

View File

@ -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()

View File

@ -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
} }
} }

View File

@ -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),
} }
} }