summaryrefslogtreecommitdiff
path: root/toolkit/democui/structs.go
blob: 37a8f28150209def68375c9d005d40a4759314e5 (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
// LICENSE: same as the go language itself
// Copyright 2023 WIT.COM

// all structures and variables are local (aka lowercase)
// since the plugin should be isolated to access only
// by functions() to insure everything here is run
// inside a dedicated goroutine

package main

import (
	"fmt"
	"sync"
	"github.com/awesome-gocui/gocui"
	"git.wit.org/wit/gui/toolkit"
)

// const delta = 1

// It's probably a terrible idea to call this 'me'
var me config

type config struct {
	highest	int // highest widgetId
	baseGui *gocui.Gui // the main gocui handle
	widgets map[int]*cuiWidget
	callback func(int)
	helpLabel *gocui.View

	defaultBehavior bool
	defaultWidth int
	defaultHeight int
	nextW int	// where the next window or tab flag should go

	bookshelf bool // do you want things arranged in the box like a bookshelf or a stack?
	canvas bool // if set to true, the windows are a raw canvas
	menubar bool // for windows
	stretchy bool // expand things like buttons to the maximum size
	padded bool // add space between things like buttons
	margin bool // add space around the frames of windows
}

/*
// This is a map between the widgets in wit/gui and the internal structures of gocui
var viewWidget map[*gocui.View]*toolkit.Widget
var stringWidget map[string]*toolkit.Widget
*/

var (
//	g *gocui.Gui
//	Custom func(string)

	initialMouseX, initialMouseY, xOffset, yOffset int
	globalMouseDown, msgMouseDown, movingMsg bool

//	err error
)

// the gocui way
// the logical size of the widget
// corner starts at in the upper left corner
type rectType struct {
	// this is the gocui way
	w0, h0, w1, h1 int      // left top right bottom
}

/*
type realSizeT struct {
	width, height int
}
*/


type cuiWidget struct {
	id int	// widget ID
	parentId int
	widgetType   toolkit.WidgetType

	name   string // a descriptive name of the widget
	text   string // the current text being displayed

	visable bool // widget types like 'box' are 'false'
	realWidth int // the real width
	realHeight int // the real height
	realSize rectType  // the display size of this widget
	logicalSize rectType  // the logical size. Includes all the child widgets

	nextX	int
	nextY	int

	// horizontal=true  means layout widgets like books on a bookshelf
	// horizontal=false means layout widgets like books in a stack
	horizontal bool `default:false`

	tainted bool
	v *gocui.View
	baseGui *gocui.Gui // use gogui.Manager ? as 'workspaces?'

	// writeMutex protects locks the write process
	writeMutex sync.Mutex

	// deprecate
	// logicalWidth int  `default:8`
	// logicalHeight int  `default:2`
	// rect   rectType
	// current rectType // the logical size. Includes all the child widgets
	// width  int
	// height int
}

// from the gocui devs:
// Write appends a byte slice into the view's internal buffer. Because
// View implements the io.Writer interface, it can be passed as parameter
// of functions like fmt.Fprintf, fmt.Fprintln, io.Copy, etc. Clear must
// be called to clear the view's buffer.

func (w *cuiWidget) Write(p []byte) (n int, err error) {
	w.tainted = true
	w.writeMutex.Lock()
	defer w.writeMutex.Unlock()
	// v.makeWriteable(v.wx, v.wy)
	// v.writeRunes(bytes.Runes(p))
	fmt.Fprintln(w.v, p)
	log(logNow, "widget.Write()")

	return len(p), nil
}