TextBox has double-click to select word

This commit is contained in:
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
}
}