summaryrefslogtreecommitdiff
path: root/eventMouse.go
blob: 1d1895eb88bfda71b3e5794525b8a86411dd35ca (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
// 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()")
		}
	*/

	dropdownUnclicked(w, h)

	if msgMouseDown {
		log.Info("setting mousedown to false")
		msgMouseDown = false
	} else if globalMouseDown {
		globalMouseDown = false
		g.DeleteView("globalDown")
	}
	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 {
	mx, my := g.MousePosition()

	var found bool = false
	for _, tk := range findByXY(mx, my) {
		tk.dumpWidget("mouseDown()")
		if tk.node.WidgetType == widget.Window {
			log.Info("SENDING CLICK TO WINDOW")
			tk.doWidgetClick(mx, my)
			return nil
		}
		if tk.node.WidgetType == widget.Button {
			log.Info("SENDING CLICK TO Button")
			tk.doWidgetClick(mx, my)
			return nil
		}
		if tk.node.WidgetType == widget.Checkbox {
			log.Info("SENDING CLICK TO Checkbox")
			tk.doWidgetClick(mx, my)
			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)
		}
	}
	globalMouseDown = true

	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 {
	initialMouseX, initialMouseY = g.MousePosition()

	w := initialMouseX
	h := initialMouseY

	for _, tk := range findByXY(w, h) {
		tk.dumpWidget("msgDown()")
	}

	vx, vy, _, _, err := g.ViewPosition("msg")
	if err == nil {
		xOffset = initialMouseX - vx
		yOffset = initialMouseY - vy
	}
	log.Info("setting mousedown to true")
	msgMouseDown = true
	return nil
}