summaryrefslogtreecommitdiff
path: root/structs.go
blob: c82cd6997a6f25878bda7db157f10d81f9c32ac4 (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
package gui

import (
	"embed"
	"sync"

	"go.wit.com/widget"
)

//
// All GUI Data Structures and functions that are external
// within the toolkit/ abstraction layer
//
// More than one Window does not exist in every GUI situtaion and
// can never be. On many toolkits you have to have 'tabs', like
// Native Windows and MacOS toolkits
//
// If that is the case, this code abstracts the concept of
// windows and makes each window a 'tab' in a single window.
//
// Reminder from Goals: This is for simple GUI's.
// For example, a "Mouse Control Panel" not the GIMP or blender.
//

var me guiConfig

// Range(1, 10) includes the values 1 and 10
// almost all toolkits use integers so there doesn't
// seem to be a good idea to use 'type any' here as it
// just makes things more complicated for no good reason
type RangeMovedToWidget struct {
	Low  int
	High int
}

// type List []string

type guiConfig struct {
	// a toolkit requirement. never allow more than one per program
	initOnce sync.Once

	// locking for the binary tree
	muTree sync.Mutex

	// This is the master node. The Binary Tree starts here
	rootNode *Node

	// A node off of rootNode for passing debugging flags
	flag *Node

	counter int // used to make unique WidgetId's

	// sets the chan for the plugins to call back too
	guiChan chan widget.Action

	// option to pass in compiled plugins as embedded files
	resFS embed.FS

	// used to beautify logging to Stdout
	//	depth      int
	//	prefix     string
}

/*
	The Node is a binary tree. This is how all GUI elements are stored
	simply the name and the size of whatever GUI element exists

	value : most widgets need 1 value. this is it.
		For a window -- the title. For a button -- the name

	hidden : this means the widget is not displayed yet. In that
		case, don't waste time trying to pass information to
		the toolkits. This makes things efficient and fast if
		the GUI does not have to display anything

	Custom() : if the user does something like click on a button,
		this function will be called. (this should probably
		be renamed Callback()

	progname : a short name to reference the widgets in the debugger
		n.NewButton("click here to send it").SetProgName("SENT")

	parent, children : the binary tree

	pad, margin, expand : re-think these names and clarify

*/

type Node struct {
	id      int  // should be unique
	hidden  bool // don't update the toolkits when it's hidden
	changed bool // do we need to inform the toolkit something changed?
	enabled bool // if false, then the the user can't click on it
	mu      sync.Mutex

	WidgetType widget.WidgetType

	// most widgets need one value, this is current alue
	// value any
	defaultS string
	newString string
	currentS string

	//
	label string

	// this can programatically identify the widget
	// The name must be unique
	progname string // a name useful for debugging

	// for widgets that a user select from a list of strings
	strings map[string]int

	// how to arrange widgets
	direction widget.Orientation

	// for widgets that have on/off things
	checked bool

	// tells the toolkits if the user should currently see it
	// state updates are only sent to the toolkits for visable widgets
	visable bool

	// borderless windows
	borderless bool

	// this function is run when there are mouse or keyboard events
	Custom func()

	parent   *Node
	children []*Node

	// RETHINK EVERYTHING BELOW HERE
	pad    bool // the toolkit may use this. it's up to the toolkit
	margin bool // the toolkit may use this. it's up to the toolkit
	expand bool // the toolkit may use this. it's up to the toolkit

	// used for Windows in toolkits measured in pixels
	width  int
	height int

	// used for anything that needs a range (for example: a slider)
	X int
	Y int

	// the grid widget max width and height
	// the max height can be implemented in the toolkit plugin
	// to restrict the number of rows to display
	W int
	H int

	// where the next widget should be put in this grid
	NextW int
	NextH int

	// if this widget is in a grid, this is the position of a widget
	AtW int
	AtH int
}