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) {
if button != input.ButtonLeft { return }
element.pressed = false
within := image.Point { x, y }.
In(element.Bounds())
within := image.Point { x, y }.In(element.Bounds())
if time.Since(element.lastClick) < element.config.DoubleClickDelay() {
if element.Enabled() && within && element.onChoose != nil {
element.onChoose()

View File

@ -1,6 +1,7 @@
package elements
import "io"
import "time"
import "image"
import "git.tebibyte.media/sashakoshka/tomo"
import "git.tebibyte.media/sashakoshka/tomo/data"
@ -22,9 +23,10 @@ type TextBox struct {
core core.CoreControl
focusableControl core.FocusableCoreControl
dragging bool
dot textmanip.Dot
scroll int
lastClick time.Time
dragging int
dot textmanip.Dot
scroll int
placeholder string
text []rune
@ -81,23 +83,50 @@ func (element *TextBox) HandleMouseDown (x, y int, button input.Button) {
if button == input.ButtonLeft {
runeIndex := element.atPosition(image.Pt(x, y))
element.dragging = true
if runeIndex > -1 {
if runeIndex == -1 { return }
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.redo()
element.lastClick = time.Now()
}
element.redo()
}
}
func (element *TextBox) HandleMotion (x, y int) {
if !element.Enabled() { return }
if element.dragging {
switch element.dragging {
case 1:
runeIndex := element.atPosition(image.Pt(x, y))
if runeIndex > -1 {
element.dot.End = runeIndex
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) {
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.
// 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 {
if dot.Start > dot.End {
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 {
return Dot {
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.
func WordAround (text []rune, position int) (around Dot) {
return Dot {
WordToLeft(text, position),
WordToRight(text, position),
position - WordToLeft(text, position),
position + WordToRight(text, position),
}
}