ref: bee85da05585c5f6d73208d10659f5860d3d8524
parent: ca677a50fd03b97e8421d5ddcc9c793338c81058
author: Philip Silva <philip.silva@protonmail.com>
date: Sun Jul 20 13:06:53 EDT 2025
up/down button events
--- a/events/mouse/mouse.go
+++ b/events/mouse/mouse.go
@@ -8,7 +8,10 @@
Enter Type = 1 << iota
Leave
Click
+ Down
)
+
+const Up = Click
// Mouse Point in local coordinates though
//
--- a/field/field.go
+++ b/field/field.go
@@ -38,6 +38,8 @@
// Position of the cursor
Pos int
+ // Position of the selection
+ Pos2 int
// Offsets of the characters
Offsets []int
@@ -78,10 +80,21 @@
f.hover = true
case mouse.Leave:
f.hover = false
- case mouse.Click:
+ case mouse.Down:
f.Pos, _ = slices.BinarySearch(f.Offsets, tev.Point.X)
f.Pos = slices.Max([]int{0, f.Pos-1})f.updateTextImgs()
+ //log.Printf("f.Pos=%d", f.Pos)+ case mouse.Up:
+ f.Pos2, _ = slices.BinarySearch(f.Offsets, tev.Point.X)
+ if f.Pos2 < f.Pos {+ f.Pos2, f.Pos = f.Pos, f.Pos2
+ }
+ f.Pos2 = clamp(0, f.Pos2-1, len(f.Text)-1)
+ f.Pos2 = slices.Max([]int{0, f.Pos2-1})+ //log.Printf("f.Pos2=%d", f.Pos2)+ //log.Printf("selected %d/%d: %s", f.Pos, f.Pos2, f.Text[f.Pos:f.Pos2+1])+ //f.updateTextImgs()
}
if f.cb != nil {@@ -117,6 +130,12 @@
//log.Printf("event: call updateTextImgs")f.updateTextImgs()
}
+}
+
+func clamp(a, x, b int) int {+ x = slices.Min([]int{x, b})+ x = slices.Max([]int{a, x})+ return x
}
func (f *Field) Render() *memdraw.Image {--- a/xui.go
+++ b/xui.go
@@ -152,6 +152,7 @@
})()
}
}()
+ btns := 0
for { select {case m := <-x.mousectl.C:
@@ -167,8 +168,13 @@
var ev mouse.Event
if m.Buttons&1 > 0 {+ if btns&1 == 0 {+ ev.Type |= mouse.Down
+ }
+ } else if btns&1 > 0 {ev.Type |= mouse.Click
}
+ btns = m.Buttons
if x.root != nil {@@ -183,7 +189,7 @@
x.mu.Lock()
defer x.mu.Unlock()
- log.Printf("KEY %v", k)+ //log.Printf("KEY %v", k) ev := keyboard.Event{}ev.Type = keyboard.Pressed
--
⑨