summaryrefslogtreecommitdiff
path: root/toolkit/andlabs/plugin.go
blob: 5bc40a01745a83e0391b989c331965e43098301b (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
package main

// if you include more than just this import
// then your plugin might be doing something un-ideal (just a guess from 2023/02/27)
import "git.wit.org/wit/gui/toolkit"

// import "github.com/andlabs/ui"
// import _ "github.com/andlabs/ui/winmanifest"

//
// This should be called ?
// Pass() ?
// This handles all interaction between the wit/gui package (what golang knows about)
// and this plugin that talks to the OS and does scary and crazy things to make
// a GUI on whatever OS or whatever GUI toolkit you might have (GTK, QT, WASM, libcurses)
//
// Once you are here, you should be in a protected goroutine created by the golang wit/gui package
//
// TODO: make sure you can't escape this goroutine
//
func Send(p *toolkit.Widget, c *toolkit.Widget) {
	if (p == nil) {
		log(debugPlugin, "Send() parent = nil")
	} else {
		log(debugPlugin, "Send() parent =", p.Name, ",", p.Type)
	}
	log(debugPlugin, "Send() child  =", c.Name, ",", c.Action, ",", c.Type)

	switch c.Type {
	case toolkit.Window:
		newWindow(c)
	case toolkit.Tab:
		newTab(p, c)
	case toolkit.Group:
		newGroup(p, c)
	case toolkit.Button:
		doButton(p, c)
	case toolkit.Checkbox:
		doCheckbox(p, c)
	case toolkit.Label:
		newLabel(p, c)
	case toolkit.Textbox:
		doTextbox(p, c)
	case toolkit.Slider:
		newSlider(p, c)
	case toolkit.Spinner:
		newSpinner(p, c)
	default:
		log(true, "unknown parent =", p.Name, p.Type)
		log(true, "unknown child  =", c.Name, c.Type)
		log(true, "Don't know how to do", c.Type, "yet")
	}
}

// delete the child widget from the parent
// p = parent, c = child
func destroy(p *toolkit.Widget, c *toolkit.Widget) {
	log(true, "delete()", c.Name, c.Type)

	pt := mapToolkits[p]
	ct := mapToolkits[c]
	if (ct == nil) {
		log(true, "delete FAILED (ct = mapToolkit[c] == nil) for c", c.Name, c.Type)
		// this pukes out a whole universe of shit
		// listMap()
		return
	}

	switch ct.Type {
	case toolkit.Button:
		log(true, "Should delete Button here:", c.Name)
		log(true, "Parent:")
		pt.Dump(true)
		log(true, "Child:")
		ct.Dump(true)
		if (pt.uiBox == nil) {
			log(true, "Don't know how to destroy this")
		} else {
			log(true, "Fuck it, destroy the whole box", pt.Name)
			// pt.uiBox.Destroy() // You have a bug: You cannot destroy a uiControl while it still has a parent.
			pt.uiBox.SetPadded(false)
			pt.uiBox.Delete(4)
			ct.uiButton.Disable()
			// ct.uiButton.Hide()
			ct.uiButton.Destroy()
		}

	case toolkit.Window:
		log(true, "Should delete Window here:", c.Name)
	default:
		log(true, "Don't know how to delete c =", c.Type, c.Name)
		log(true, "Don't know how to delete pt =", pt.Type, pt.Name, pt.uiButton)
		log(true, "Don't know how to delete ct =", ct.Type, ct.Name, ct.uiButton)
		log(true, "Parent:")
		pt.Dump(true)
		log(true, "Child:")
		ct.Dump(true)
		log(true, "Fuckit, let's destroy a button", c.Name, c.Type)
		if (ct.uiButton != nil) {
			pt.uiBox.Delete(4)
			ct.uiButton.Destroy()
		}
	}
}