diff options
Diffstat (limited to 'widgetDraw.go')
| -rw-r--r-- | widgetDraw.go | 271 |
1 files changed, 271 insertions, 0 deletions
diff --git a/widgetDraw.go b/widgetDraw.go new file mode 100644 index 0000000..d678678 --- /dev/null +++ b/widgetDraw.go @@ -0,0 +1,271 @@ +// 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" + "strconv" + + "github.com/awesome-gocui/gocui" + log "go.wit.com/log" + "go.wit.com/widget" +) + +// don't draw widgets that are too far down the window +func (tk *guiWidget) doNotDraw() bool { + var check bool + switch tk.WidgetType() { + case widget.Button: + check = true + case widget.Label: + check = true + default: + } + if !check { + return false + } + win := tk.findParentWindow() + if win == nil { + // don't draw anything if you can't find the parent window + return true + } + + h := tk.gocuiSize.h0 - win.gocuiSize.h0 + + if h > 20 { + return true + } + + return false +} + +// page widgets in the window +func (tk *guiWidget) pageWidget() *rectType { + r := new(rectType) + + var check bool + switch tk.WidgetType() { + case widget.Button: + check = true + case widget.Label: + check = true + default: + } + if !check { + return nil + } + win := tk.findParentWindow() + if win == nil { + // don't draw anything if you can't find the parent window + return nil + } + + r.w0 = tk.gocuiSize.w0 + r.h0 = tk.gocuiSize.h0 + r.w1 = tk.gocuiSize.w1 + r.h1 = tk.gocuiSize.h1 + + // r.h0 = tk.gocuiSize.h0 - win.gocuiSize.h0 + + if r.h0 > 20 { + return r + } + + return r +} + +// display's the text of the widget in gocui +// deletes the old view if it exists and recreates it +func (tk *guiWidget) drawView() { + var err error + log.Log(INFO, "drawView() START", tk.WidgetType(), tk.String()) + if me.baseGui == nil { + log.Log(ERROR, "drawView() ERROR: me.baseGui == nil", tk) + return + } + + if tk.cuiName == "" { + log.Log(ERROR, "drawView() tk.cuiName was not set for widget", tk) + tk.cuiName = strconv.Itoa(tk.WidgetId()) + " TK" + } + log.Log(INFO, "drawView() labelN =", tk.labelN) + + // this deletes the button from gocui + me.baseGui.DeleteView(tk.cuiName) + tk.v = nil + + a := tk.gocuiSize.w0 + b := tk.gocuiSize.h0 + c := tk.gocuiSize.w1 + d := tk.gocuiSize.h1 + + /* + // testing code for paging large windows + if tk.doNotDraw() { + return + } + + if tk.window.pager != 0 { + if r := tk.pageWidget(); r == nil { + // if nil, draw whatever it is anyway + } else { + if r.Width() == 0 && r.Height() == 0 { + // don't draw empty stuff + return + } + a = r.w0 + b = r.h0 + c = r.w1 + d = r.h1 + } + } + + if tk.WidgetType() == widget.Window || tk.WidgetType() == widget.Flag { + if tk.window.pager != 0 { + if tk.gocuiSize.Height() > 40 { + tk.window.large = true + tk.gocuiSize.h1 = tk.gocuiSize.h0 + 40 + d = tk.gocuiSize.h1 + } + } + } + */ + + // this is all terrible. This sets the title. kinda + if tk.WidgetType() == widget.Window { + tk.textResize() + tk.full.w0 = tk.force.w0 + tk.full.h0 = tk.force.h0 + + // for windows, make it the full size + a = tk.full.w0 + b = tk.full.h0 + c = tk.full.w0 + tk.gocuiSize.Width() + d = tk.full.h0 + tk.gocuiSize.Height() + } else { + if tk.internal { + // do nothing + } else { + tk.textResize() // resize gocui frame to the widget text + } + a = tk.gocuiSize.w0 + b = tk.gocuiSize.h0 + c = tk.gocuiSize.w1 + d = tk.gocuiSize.h1 + } + + tk.v, err = me.baseGui.SetView(tk.cuiName, a, b, c, d, 0) + if err == nil { + tk.dumpWidget("drawView() err") + log.Log(ERROR, "drawView() internal plugin error err = nil") + return + } + + if !errors.Is(err, gocui.ErrUnknownView) { + tk.dumpWidget("drawView() err") + log.Log(ERROR, "drawView() internal plugin error error.IS()", err) + return + } + + if tk.v == nil { + log.Info("MUTEX FAIL. tk.v == nil here in drawView()") + log.Info("MUTEX FAIL. tk.v == nil here in drawView()") + log.Info("MUTEX FAIL. tk.v == nil here in drawView()") + return + } + + // this actually sends the text to display to gocui + tk.v.Wrap = true + tk.v.Frame = tk.frame + tk.v.Clear() + fmt.Fprint(tk.v, tk.labelN) + + // tmp hack to disable buttons on window open + if tk.WidgetType() == widget.Button { + if tk.IsEnabled() { + } else { + tk.setColorDisable() + } + } + + switch tk.WidgetType() { + case widget.Button: + if tk.IsEnabled() { + if tk.isWindowDense() && tk.isInGrid() { + tk.setColorButtonDense() + } else { + tk.setColorButton() + } + } else { + tk.setColorDisable() + } + default: + } + + if tk.v == nil { + log.Info("MUTEX FAIL 2. tk.v was deleted somehow tk.v == nil here in drawView()") + log.Info("MUTEX FAIL 2. tk.v == nil here in drawView()") + log.Info("MUTEX FAIL 2. tk.v == nil here in drawView()") + return + } + + // if you don't do this here, it will be black & white only + if tk.color != nil { + tk.v.FrameColor = tk.color.frame + tk.v.FgColor = tk.color.fg + tk.v.BgColor = tk.color.bg + tk.v.SelFgColor = tk.color.selFg + tk.v.SelBgColor = tk.color.selBg + } + + log.Log(INFO, "drawView() END") +} + +func (w *guiWidget) DrawAt(offsetW, offsetH int) { + // w.setColor(&colorActiveW) + w.placeWidgets(offsetW, offsetH) // compute the sizes & places for each widget + // w.dumpWidget(fmt.Sprintf("DrawAt(%d,%d)", offsetW, offsetH)) +} + +func (w *guiWidget) simpleDrawAt(offsetW, offsetH int) { + // w.setColor(&colorActiveW) + w.dumpWidget("simpleDrawAt()") +} + +// display the widgets in the binary tree +func (w *guiWidget) drawTree(draw bool) { + if w == nil { + return + } + w.dumpWidget("in drawTree()") + if draw { + // w.textResize() + w.Show() + } else { + w.Hide() + } + + for _, child := range w.children { + child.drawTree(draw) + } +} + +func (w *guiWidget) Show() { + if w.isFake { + // don't display fake widgets + return + } + + if w.Hidden() { + // recursively checks if the parent is hidden + // never show hidden widgets + return + } + if me.debug { + w.dumpWidget("drawView()") + } + + w.drawView() +} |
