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