summaryrefslogtreecommitdiff
path: root/eventBindings.go
blob: 5eda90b8a8df2c31b893adc2db5127ad5ae2673a (plain)
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
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
// Copyright 2017-2025 WIT.COM Inc. All rights reserved.
// Use of this source code is governed by the GPL 3.0

package main

import (
	"syscall"

	"github.com/awesome-gocui/gocui"
	"go.wit.com/log"
	"go.wit.com/widget"
)

//    THIS IS A STANDARD.

// register how the 'gocui' will work as a GO toolkit plugin
// all applications will use these keys. they are universal.

// tells 'gocui' where to send events
func registerHandlers(g *gocui.Gui) {
	keyForced, modForced := gocui.MustParse("ctrl+z") // setup ctrl+z

	// mouse handlers
	g.SetKeybinding("", gocui.MouseLeft, gocui.ModNone, mouseDown)     // normal left mouse down
	g.SetKeybinding("", gocui.MouseLeft, gocui.ModMouseCtrl, ctrlDown) // mouse with the ctrl key held down
	g.SetKeybinding("", gocui.MouseRelease, gocui.ModNone, mouseUp)    // mouse button release

	// Ctrl key handlers
	g.SetKeybinding("", gocui.KeyCtrlC, gocui.ModNone, doExit)        // CTRL-C : exits the application
	g.SetKeybinding("", gocui.KeyCtrlV, gocui.ModNone, doPanic)       // CTRL-V : force a panic()
	g.SetKeybinding("", gocui.KeyCtrlD, gocui.ModNone, openDebuggger) // CTRL-D : open the (D)ebugger
	g.SetKeybinding("", keyForced, modForced, handle_ctrl_z)          // CTRL-Z :cleverly let's you background gocui (breaks cursor mouse on return)

	// regular keys
	g.SetKeybinding("", '?', gocui.ModNone, theHelp)       // '?' toggles on and off the help menu
	g.SetKeybinding("", 'w', gocui.ModNone, doWindow)      // 'w' close all windows
	g.SetKeybinding("", 'r', gocui.ModNone, widgetRefresh) // 'r' screen refresh
	g.SetKeybinding("", 'q', gocui.ModNone, doExit)        // 'q' exit

	// debugging
	g.SetKeybinding("", 'f', gocui.ModNone, theFind)             // 'f' shows what is under your mouse
	g.SetKeybinding("", 'S', gocui.ModNone, setSuperMouse)       // 'S' Super Mouse mode!
	g.SetKeybinding("", 'h', gocui.ModNone, theHide)             // 'h' hide all widgets
	g.SetKeybinding("", 'M', gocui.ModNone, dumpWidgetPlacement) // 'M' list all widgets with positions
	g.SetKeybinding("", 'L', gocui.ModNone, dumpWidgets)         // 'L' list all widgets in tree view
	g.SetKeybinding("", 'd', gocui.ModNone, theLetterD)          // 'd' toggles on and off debugging buttons
	g.SetKeybinding("", '2', gocui.ModNone, theNotsure)          // '2' for testing new ideas
	g.SetKeybinding("", 'q', gocui.ModNone, quit)                // 'q' only exits gocui. plugin stays alive (?)
}

// flips on 'super mouse' mode
// while this is turned on, it will print out every widget found under the mouse
func setSuperMouse(g *gocui.Gui, v *gocui.View) error {
	if me.supermouse {
		log.Log(GOCUI, "supermouse off")
		me.supermouse = false
	} else {
		me.supermouse = true
		log.Log(GOCUI, "supermouse on")
	}
	return nil
}

var wtf bool

// use this to test code ideas
func theNotsure(g *gocui.Gui, v *gocui.View) error {
	log.Info("got keypress 2. now what?")
	// closes anything under your mouse
	w, h := g.MousePosition()
	for _, tk := range findByXY(w, h) {
		if tk.node.WidgetType == widget.Stdout {
			tk.dumpWidget("theNotsure() DrawAt STDOUT")
			tk.DrawAt(10, 10)
			if wtf {
				log.Log(GOCUI, "set visible false")
				tk.deleteView()
				// tk.SetVisible(false)
				wtf = false
			} else {
				log.Log(GOCUI, "set visible true")
				tk.drawView()
				// tk.SetVisible(true)
				wtf = true
			}
			continue
		}
	}

	/* closes anything under your mouse
	w, h := g.MousePosition()
	for _, tk := range findByXY(w, h) {
		if tk.node.WidgetType == widget.Stdout {
			tk.dumpWidget("theNotsure() SKIP STDOUT")
			continue
		}
		tk.dumpWidget("theNotsure() HIDDING")
		tk.Hide()
	}
	*/
	return nil
}

func theHide(g *gocui.Gui, v *gocui.View) error {
	var w *guiWidget
	w = me.treeRoot.TK.(*guiWidget)
	w.hideWidgets()
	return nil
}

func theShow(g *gocui.Gui, v *gocui.View) error {
	var w *guiWidget
	w = me.treeRoot.TK.(*guiWidget)
	w.showWidgets()
	return nil
}

func doExit(g *gocui.Gui, v *gocui.View) error {
	standardExit()
	return nil
}

func doPanic(g *gocui.Gui, v *gocui.View) error {
	log.Log(GOCUI, "do panic() here")
	standardClose()
	panic("forced panic in gocui")
	return nil
}

func dumpWidgets(g *gocui.Gui, v *gocui.View) error {
	me.treeRoot.ListWidgets()

	tk := me.logStdout
	// msg := fmt.Sprintf("test out kb %d\n", ecount)
	// tk.Write([]byte(msg))
	if tk == nil {
		log.Log(ERROR, "tk = nil")
	}
	if tk.v == nil {
		log.Log(ERROR, "tk.v = nil")
	} else {
		log.Log(ERROR, "setting log.CaptureMode(tk.v)")
		log.Log(ERROR, "setting log.CaptureMode(tk.v)")
		log.CaptureMode(tk)
	}
	return nil
}

func dumpWidgetPlacement(g *gocui.Gui, v *gocui.View) error {
	w := me.treeRoot.TK.(*guiWidget)
	w.dumpTree("MM")
	return nil
}

func openDebuggger(g *gocui.Gui, v *gocui.View) error {
	me.myTree.SendEnableDebugger()
	return nil
}

func theFind(g *gocui.Gui, v *gocui.View) error {
	w, h := g.MousePosition()
	for _, tk := range findByXY(w, h) {
		tk.dumpWidget("theFind()")
	}
	return nil
}

// is run whenever anyone hits 'd' (in an open space)
func theLetterD(g *gocui.Gui, v *gocui.View) error {
	// widgets that don't have physical existance in
	// a display toolkit are hidden. In the case
	// of gocui, they are set as not 'visible' and put offscreen
	// or have the size set to zero
	// (hopefully anyway) lots of things with the toolkit
	// still don't work

	fakeStartWidth = me.FakeW
	fakeStartHeight = me.TabH + me.FramePadH
	if showDebug {
		showFake()
		showDebug = false
	} else {
		hideFake()
		showDebug = true
	}
	return nil
}

func theHelp(g *gocui.Gui, v *gocui.View) error {
	if me.showHelp {
		helplayout()
		me.showHelp = false
		if me.dropdownV == nil {
			log.Info("FIXME: MADE me.dropdownV AGAIN")
			me.dropdownV = makeDropdownView("addWidget() ddview")
		}
		// me.dropdownV.Show()
	} else {
		me.baseGui.DeleteView("help")
		me.showHelp = true
		// me.dropdownV.Hide()
	}
	return nil
}

func widgetRefresh(g *gocui.Gui, v *gocui.View) error {
	log.Log(GOCUI, "todo: refresh windows here")
	return nil
}

func doWindow(g *gocui.Gui, v *gocui.View) error {
	log.Log(GOCUI, "todo: close all windows here")
	return nil
}

// todo: find and give credit to the person that I found this patch in their forked repo
// handle ctrl+z
func handle_ctrl_z(g *gocui.Gui, v *gocui.View) error {
	gocui.Suspend()
	log.Info("got ctrl+z")
	syscall.Kill(syscall.Getpid(), syscall.SIGSTOP)
	log.Info("got ctrl+z syscall() done")
	gocui.Resume()
	return nil
}