From d4c2f8cb1b7514c1afa1d85092988b3ef25cef16 Mon Sep 17 00:00:00 2001
From: Jeff Carr <jcarr@wit.com>
Date: Fri, 2 Feb 2024 11:47:32 -0600
Subject: [PATCH] crippled, but works

Signed-off-by: Jeff Carr <jcarr@wit.com>
---
 dropdown.go | 35 +++++++++++++++--------------------
 main.go     | 28 +++++++++++++++++++++++++---
 mouse.go    |  2 +-
 view.go     | 33 +++++++++++++++++++--------------
 widget.go   | 35 +++++++++++++++++++++++++----------
 5 files changed, 85 insertions(+), 48 deletions(-)

diff --git a/dropdown.go b/dropdown.go
index cb0f38d..872bc22 100644
--- a/dropdown.go
+++ b/dropdown.go
@@ -88,19 +88,6 @@ func (tk *guiWidget) showDropdown() {
 	}
 }
 
-func dropdownClicked(mouseX, mouseH int) {
-	tk := me.dropdownV
-	if tk.Visible() {
-		log.Log(NOW, "hide DDview() Mouse really down at:", mouseX, mouseH)
-		hideDDview()
-	} else {
-		log.Log(NOW, "show DDview() Mouse really down at:", mouseX, mouseH)
-		log.Log(NOW, "can you see the dropdown menu right now?")
-		log.Log(NOW, "if so, something is wrong. I think you can't see it")
-		showDDview()
-	}
-}
-
 func hideDDview() error {
 	w, h := me.baseGui.MousePosition()
 	log.Log(NOW, "hide dropdown menu() view msgMouseDown (w,h) =", w, h)
@@ -127,18 +114,26 @@ func showDDview() error {
 	return nil
 }
 
-/*
 // if there is a drop down view active, treat it like a dialog box and close it
-
-	if (hideDDview() == nil) {
-		return nil
-	}
-*/
 func (w *guiWidget) dropdownClicked(mouseW, mouseH int) {
 	log.Log(NOW, "dropdownClicked() (w,h) =", mouseW, mouseH)
-	w.SetVisible(false)
+	w.deleteView()
+
+	/*
+	tk := me.dropdownV
+	if tk.Visible() {
+		log.Log(NOW, "hide DDview() Mouse really down at:", mouseX, mouseH)
+		// hideDDview()
+	} else {
+		log.Log(NOW, "show DDview() Mouse really down at:", mouseX, mouseH)
+		log.Log(NOW, "can you see the dropdown menu right now?")
+		log.Log(NOW, "if so, something is wrong. I think you can't see it")
+		showDDview()
+	}
+	*/
 }
 
+
 func dropdownUnclicked(mouseX, mouseH int) {
 	tk := me.dropdownV
 	log.Log(NOW, "mouseUp() view msgMouseDown (check here for dropdown menu click) (w,h) =", mouseX, mouseH)
diff --git a/main.go b/main.go
index 4d4dde4..e90794e 100644
--- a/main.go
+++ b/main.go
@@ -118,9 +118,31 @@ func mainGogui() {
 // it runs SetManagerFunc which passes every input
 // event (keyboard, mouse, etc) to the function "gocuiEvent()"
 func gocuiMain() {
+	defer func() {
+		if r := recover(); r != nil {
+			log.Warn("YAHOOOO Recovered in gocuiMain()", r)
+			log.Warn("Recovered from panic:", r)
+			me.baseGui.Close()
+			panic("BUMMER 2")
+
+			// allow gocui to close if possible, then print stack
+			log.Sleep(1)
+			os.Stdout = origStdout
+			os.Stderr = origStderr
+			me.myTree.SendToolkitPanic()
+			log.Warn("Stack trace:")
+			debug.PrintStack()
+
+			// attempt to switch to the nocui toolkit
+			log.Sleep(1)
+			me.myTree.SendToolkitLoad("nocui")
+			// panic("BUMMER")
+			return
+		}
+	}()
 	g, err := gocui.NewGui(gocui.OutputNormal, true)
 	if err != nil {
-		panic(err)
+		return
 	}
 	defer g.Close()
 
@@ -135,10 +157,10 @@ func gocuiMain() {
 	g.SetManagerFunc(gocuiEvent)
 
 	if err := defaultKeybindings(g); err != nil {
-		panic(err)
+		// normally panic here
 	}
 
 	if err := g.MainLoop(); err != nil && !errors.Is(err, gocui.ErrQuit) {
-		panic(err)
+		// normally panic here
 	}
 }
diff --git a/mouse.go b/mouse.go
index eec39a0..7488a07 100644
--- a/mouse.go
+++ b/mouse.go
@@ -66,7 +66,7 @@ func mouseDown(g *gocui.Gui, v *gocui.View) error {
 	maxX, _ := g.Size()
 	findUnderMouse()
 	msg := fmt.Sprintf("mouseDown() Mouse really down at: %d,%d", mx, my)
-	dropdownClicked(mx, my)
+	// dropdownClicked(mx, my)
 	x := mx - len(msg)/2
 	if x < 0 {
 		x = 0
diff --git a/view.go b/view.go
index a78d19c..67a1e11 100644
--- a/view.go
+++ b/view.go
@@ -62,32 +62,35 @@ func (w *guiWidget) showView() {
 	}
 	log.Log(INFO, "showView() labelN =", w.labelN)
 
+	/*
 	if w.hidden {
 		w.SetVisible(false)
 		return
 	}
-
-	// if the gocui element doesn't exist, create it
-	if w.v == nil {
-		w.recreateView()
+	*/
+	if w.v != nil {
+		return
 	}
+
+	w.recreateView()
+	w.textResize()
+	w.v.Clear()
+	fmt.Fprint(w.v, w.labelN)
+	/*
 	x0, y0, x1, y1, _ := me.baseGui.ViewPosition(w.cuiName)
 	// x0, y0, x1, y1, err := me.baseGui.ViewPosition(w.cuiName)
 	// log.Log(INFO, "showView() w.v already defined for widget", w.String(), x0, y0, x1, y1, err)
 
 	// n.smartGocuiSize()
-	changed := w.textResize()
+	// changed := w.textResize()
 
-	if !changed {
-		log.Log(INFO, "showView() Clear() and Fprint() here wId =", w.cuiName)
-		w.v.Clear()
-		fmt.Fprint(w.v, w.labelN)
-		w.SetVisible(false)
-		w.SetVisible(true)
-		return
-	}
+	log.Log(INFO, "showView() Clear() and Fprint() here wId =", w.cuiName)
+	w.v.Clear()
+	fmt.Fprint(w.v, w.labelN)
 	log.Log(INFO, "showView() textResize() changed. Should recreateView here wId =", w.cuiName)
+	*/
 
+	/*
 	// if the gocui element has changed where it is supposed to be on the screen
 	// recreate it
 	if x0 != w.gocuiSize.w0 {
@@ -109,8 +112,9 @@ func (w *guiWidget) showView() {
 		w.recreateView()
 		return
 	}
+	*/
 
-	w.SetVisible(true)
+	// w.SetVisible(true)
 }
 
 // create or recreate the gocui widget visible
@@ -127,6 +131,7 @@ func (w *guiWidget) recreateView() {
 	me.baseGui.DeleteView(w.cuiName)
 	w.v = nil
 
+	w.textResize()
 	a := w.gocuiSize.w0
 	b := w.gocuiSize.h0
 	c := w.gocuiSize.w1
diff --git a/widget.go b/widget.go
index c0d6557..ec1387c 100644
--- a/widget.go
+++ b/widget.go
@@ -70,11 +70,14 @@ func setupCtrlDownWidget() {
 }
 
 func (w *guiWidget) deleteView() {
-	if w.v != nil {
-		w.v.Visible = false
-		return
-	}
+	/*
+		if w.v != nil {
+			w.v.Visible = false
+			return
+		}
+	*/
 	// make sure the view isn't really there
+	log.Log(NOW, "deleteView()", w.cuiName, w.WidgetType, w.node.WidgetId)
 	me.baseGui.DeleteView(w.cuiName)
 	w.v = nil
 }
@@ -103,12 +106,24 @@ func (tk *guiWidget) Visible() bool {
 	if tk.v == nil {
 		return false
 	}
-	return tk.v.Visible
+	// return tk.v.Visible
+	tk.v.Visible = true
+	return true
 }
 
-func (w *guiWidget) SetVisible(b bool) {
-	if w.v == nil {
-		return
-	}
-	w.v.Visible = b
+func (tk *guiWidget) Show() {
+	tk.showView()
+}
+
+func (tk *guiWidget) Hide() {
+	tk.deleteView()
+}
+
+func (tk *guiWidget) SetVisible(b bool) {
+	if b {
+		tk.Show()
+	} else {
+		tk.Hide()
+	}
+	// w.v.Visible = b
 }