1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
|
// Copyright 2017-2025 WIT.COM Inc. All rights reserved.
// Use of this source code is governed by the GPL 3.0
package main
import (
"errors"
"fmt"
"github.com/awesome-gocui/gocui"
"go.wit.com/log"
"go.wit.com/widget"
)
func mouseUp(g *gocui.Gui, v *gocui.View) error {
w, h := g.MousePosition()
// useful to debug everything that is being clicked on
/*
for _, tk := range findByXY(w, h) {
tk.dumpWidget("mouseUp()")
}
*/
log.Info("mouseUp() setting me.globalMouseDown = false")
me.globalMouseDown = false
currentDrag = nil
dropdownUnclicked(w, h)
return nil
}
// this is where you have to figure out what
// widget was underneath so you can active
// the right response for the toolkit user's app
func mouseDown(g *gocui.Gui, v *gocui.View) error {
log.Info("mouseDown() setting globalMouseDown = true")
me.globalMouseDown = true
if me.dropdown.active {
w, h := g.MousePosition()
log.Info("mouseDown() stopping here. dropdwon menu is in effect")
for _, tk := range findByXY(w, h) {
if (tk.node.WidgetType == widget.Flag) && (tk == me.dropdown.tk) {
log.Info("SENDING CLICK TO Flag (dropdown)")
tk.doWidgetClick(w, h)
me.dropdown.active = false
return nil
}
}
log.Info("never found dropdown at", w, h)
// me.dropdown.active = false
return nil
}
var found bool = false
w, h := g.MousePosition()
for _, tk := range findByXY(w, h) {
tk.dumpWidget("mouseDown()")
if tk.node.WidgetType == widget.Button {
log.Info("SENDING CLICK TO Button")
tk.doWidgetClick(w, h)
return nil
}
if tk.node.WidgetType == widget.Checkbox {
log.Info("SENDING CLICK TO Checkbox")
tk.doWidgetClick(w, h)
return nil
}
if tk.node.WidgetType == widget.Dropdown {
log.Info("SENDING CLICK TO Dropdown")
tk.doWidgetClick(w, h)
return nil
}
found = true
}
mx, my := g.MousePosition()
for _, tk := range findByXY(mx, my) {
if tk.node.WidgetType == widget.Window {
tk.dragW = mx - tk.gocuiSize.w0
tk.dragH = my - tk.gocuiSize.h0
if (mx-tk.gocuiSize.w0 < 3) && (my-tk.gocuiSize.h0 < 3) {
log.Info("RESIZE WINDOW", tk.dragW, tk.dragH)
}
log.Info("SENDING CLICK TO WINDOW", tk.dragW, tk.dragH)
tk.doWidgetClick(mx-tk.dragW, my-tk.dragH)
return nil
}
if tk.node.WidgetType == widget.Label {
log.Info("IGNORE LABLE")
found = false
log.Info("setting mousedown to true for label")
// msgMouseDown = true
return nil
}
/*
if tk.node.WidgetType == widget.Label {
log.Info("SENDING CLICK TO Label")
tk.doWidgetClick(mx, my)
return nil
}
*/
found = true
}
if !found {
log.Log(GOCUI, fmt.Sprintf("mouseDown() found nothing at (%d,%d)", mx, my))
}
vx0, vy0, vx1, vy1, err := g.ViewPosition("msg")
if err == nil {
if mx >= vx0 && mx <= vx1 && my >= vy0 && my <= vy1 {
return msgDown(g, v)
}
}
maxX, _ := g.Size()
// why was this here?
// findUnderMouse()
// TODO: USE THIS TO MAKE TEMPORARY HELP / INSTRUCTION DIALOGS
// this message will pop up when you click on the magic thing
// figure out how this works and make it generically useful.
msg := fmt.Sprintf("This is -222 widget demo. %d,%d", mx, my)
// dropdownClicked(mx, my)
x := mx - len(msg)/2
if x < 0 {
x = 0
} else if x+len(msg)+1 > maxX-1 {
x = maxX - 1 - len(msg) - 1
}
log.Log(GOCUI, "mouseDown() about to write out message to 'globalDown' view. msg =", msg)
if v, err := g.SetView("globalDown", x, my-1, x+len(msg)+1, my+1, 0); err != nil {
if !errors.Is(err, gocui.ErrUnknownView) {
return err
}
v.WriteString(msg)
}
return nil
}
// this needs to go
// event triggers when you push down on a mouse button
func msgDown(g *gocui.Gui, v *gocui.View) error {
w, h := g.MousePosition()
for _, tk := range findByXY(w, h) {
tk.dumpWidget("msgDown()")
}
vx, vy, _, _, err := g.ViewPosition("msg")
if err == nil {
me.stdout.mouseOffsetW = w - vx
me.stdout.mouseOffsetH = h - vy
}
// did the user click in the corner of the stdout window? If so, resize the window.
cornerW := w - vx
cornerH := h - vy
if (me.stdout.w-cornerW < 4) && (me.stdout.h-cornerH < 4) {
log.Info("Resize msg", cornerW, cornerH)
me.stdout.resize = true
} else {
log.Info("not Resize msg", cornerW, cornerH)
me.stdout.resize = false
}
log.Info("setting mousedown to true for msg")
// msgMouseDown = true
return nil
}
|