diff options
| -rw-r--r-- | eventBindings.go | 61 | ||||
| -rw-r--r-- | eventMouse.go | 32 | ||||
| -rw-r--r-- | eventMouseClick.go | 31 | ||||
| -rw-r--r-- | find.go | 12 | ||||
| -rw-r--r-- | help.go | 1 | ||||
| -rw-r--r-- | init.go | 2 | ||||
| -rw-r--r-- | structs.go | 64 | ||||
| -rw-r--r-- | treeAdd.go | 5 |
8 files changed, 130 insertions, 78 deletions
diff --git a/eventBindings.go b/eventBindings.go index 183a21d..26348e5 100644 --- a/eventBindings.go +++ b/eventBindings.go @@ -32,13 +32,12 @@ func registerHandlers(g *gocui.Gui) { g.SetKeybinding("", keyForced, modForced, handle_ctrl_z) // CTRL-Z :cleverly let's you background gocui (breaks cursor mouse on return) // regular keys - g.SetKeybinding("", 'H', gocui.ModNone, theHelp) // '?' toggles on and off the help menu - g.SetKeybinding("", 'O', gocui.ModNone, theStdout) // 'o' toggle the STDOUT window - g.SetKeybinding("", 'q', gocui.ModNone, doExit) // 'q' exit + g.SetKeybinding("", 'H', gocui.ModNone, theHelp) // '?' toggles on and off the help menu + g.SetKeybinding("", 'O', gocui.ModNone, theStdout) // 'o' toggle the STDOUT window + g.SetKeybinding("", 'q', gocui.ModNone, doExit) // 'q' exit + g.SetKeybinding("", gocui.KeyTab, gocui.ModNone, tabCycleWindows) // '2' use this to test new ideas // debugging - g.SetKeybinding("", gocui.KeyTab, gocui.ModNone, theNotsure) // '2' use this to test new ideas - g.SetKeybinding("", gocui.KeyTab, gocui.ModShift, theNotsure) // '2' use this to test new ideas g.SetKeybinding("", '2', gocui.ModNone, theNotsure) // '2' use this to test new ideas g.SetKeybinding("", 'S', gocui.ModNone, theSuperMouse) // 'S' Super Mouse mode! g.SetKeybinding("", 'M', gocui.ModNone, printWidgetPlacements) // 'M' list all widgets with positions @@ -93,12 +92,60 @@ func addDropdown() *tree.Node { return addDropdownNew(-222) } +func findNextWindow() *guiWidget { + var found bool + if len(me.allwin) == 0 { + return nil + } + for _, win := range me.allwin { + if win.activeWindow { + found = true + win.activeWindow = false + continue + } + if found { + win.activeWindow = true + return win + } + } + me.allwin[0].activeWindow = true + // at the end, loop to the beginning + return me.allwin[0] +} + // use this to test code ideas // put whatever you want here and hit '2' to activate it func theNotsure(g *gocui.Gui, v *gocui.View) error { log.Info("got keypress 2. now what?") log.Info("try to switch windows here") - // w, h := g.MousePosition() - // me.newWindowTrigger <- true + if len(me.allwin) != len(findWindows()) { + me.allwin = findWindows() + } + newwin := findNextWindow() + for i, win := range me.allwin { + log.Info("Window", i, "named", win.labelN, win.activeWindow) + } + if newwin == nil { + log.Info("findNextWindow() err. returned nil") + return nil + } + newwin.doWidgetClick(newwin.gocuiSize.w0, newwin.gocuiSize.h0) + return nil +} + +func tabCycleWindows(g *gocui.Gui, v *gocui.View) error { + log.Info("try to switch windows here") + if len(me.allwin) != len(findWindows()) { + me.allwin = findWindows() + } + newwin := findNextWindow() + for i, win := range me.allwin { + log.Info("Window", i, "named", win.labelN, win.activeWindow) + } + if newwin == nil { + log.Info("findNextWindow() err. returned nil") + return nil + } + newwin.doWidgetClick(newwin.gocuiSize.w0, newwin.gocuiSize.h0) return nil } diff --git a/eventMouse.go b/eventMouse.go index eb89978..f3a223d 100644 --- a/eventMouse.go +++ b/eventMouse.go @@ -4,7 +4,6 @@ package main import ( - "errors" "fmt" "github.com/awesome-gocui/gocui" @@ -74,6 +73,11 @@ func mouseDown(g *gocui.Gui, v *gocui.View) error { tk.doWidgetClick(w, h) return nil } + if tk.node.WidgetType == widget.Textbox { + log.Info("SENDING CLICK TO Textbox") + tk.doWidgetClick(w, h) + return nil + } found = true } @@ -109,37 +113,13 @@ func mouseDown(g *gocui.Gui, v *gocui.View) error { log.Log(GOCUI, fmt.Sprintf("mouseDown() found nothing at (%d,%d)", mx, my)) } + // sort this junk out vx0, vy0, vx1, vy1, err := g.ViewPosition("msg") if err == nil { if mx >= vx0 && mx <= vx1 && my >= vy0 && my <= vy1 { return msgDown(g, v) } } - - maxX, _ := g.Size() - - // why was this here? - // findUnderMouse() - - // TODO: USE THIS TO MAKE TEMPORARY HELP / INSTRUCTION DIALOGS - - // this message will pop up when you click on the magic thing - // figure out how this works and make it generically useful. - msg := fmt.Sprintf("This is -222 widget demo. %d,%d", mx, my) - // dropdownClicked(mx, my) - x := mx - len(msg)/2 - if x < 0 { - x = 0 - } else if x+len(msg)+1 > maxX-1 { - x = maxX - 1 - len(msg) - 1 - } - log.Log(GOCUI, "mouseDown() about to write out message to 'globalDown' view. msg =", msg) - if v, err := g.SetView("globalDown", x, my-1, x+len(msg)+1, my+1, 0); err != nil { - if !errors.Is(err, gocui.ErrUnknownView) { - return err - } - v.WriteString(msg) - } return nil } diff --git a/eventMouseClick.go b/eventMouseClick.go index aa8be6e..5990f27 100644 --- a/eventMouseClick.go +++ b/eventMouseClick.go @@ -9,25 +9,30 @@ import ( "go.wit.com/widget" ) +func (tk *guiWidget) doWindowClick(w int, h int) { + // if there is a current window, hide it + if me.currentWindow != nil { + me.currentWindow.setColor(&colorWindow) + // me.currentWindow.hideWidgets() + me.currentWindow.isCurrent = false + } + + // now set this window as the current window + me.currentWindow = tk + me.currentWindow.isCurrent = true + tk.active = false + + tk.redrawWindow(w, h) + setThingsOnTop() // sets help, Stdout, etc on the top after windows have been redrawn +} + // this whole things was impossible to make but it got me where I am now // the debugging is way way better now with it being visible in the Stdout window // so now it's possible to redo all this and make it better func (tk *guiWidget) doWidgetClick(w int, h int) { switch tk.node.WidgetType { case widget.Window: - // if there is a current window, hide it - if me.currentWindow != nil { - me.currentWindow.setColor(&colorWindow) - // me.currentWindow.hideWidgets() - me.currentWindow.isCurrent = false - } - - // now set this window as the current window - me.currentWindow = tk - me.currentWindow.isCurrent = true - tk.active = false - - tk.redrawWindow(w-2, h-2) // TODO: fix these hard coded things with offsets + tk.doWindowClick(w, h) return case widget.Group: /* @@ -108,6 +108,18 @@ func (tk *guiWidget) findBG() *guiWidget { return nil } +func findWindowUnderMouse() *guiWidget { + w, h := me.baseGui.MousePosition() + + // if the stdout window is on top, check it first + if me.stdout.outputOnTop { + if me.stdout.tk.full.inRect(w, h) { + return me.stdout.tk + } + } + return nil +} + // returns the "highest priority widget under the mouse func findUnderMouse() *guiWidget { w, h := me.baseGui.MousePosition() @@ -30,6 +30,7 @@ var helpText []string = []string{"Help Menu", "S: super mouse", "M: list all widgets positions", "L: list all widgets in tree", + "Tab: toggle through windows", "q: quit()", "", } @@ -77,7 +77,7 @@ func standardExit() { log.Log(NOW, "standardExit() send back Quit()") // go sendBackQuit() // don't stall here in case the // induces a delay in case the callback channel is broken - log.Sleep(1) + time.Sleep(200 * time.Millisecond) log.Log(NOW, "standardExit() exit()") os.Exit(0) } @@ -37,37 +37,38 @@ type config struct { helpLabel *gocui.View // ? showHelp bool // toggle boolean for the help menu (deprecate?) // dropdownW *guiWidget // grab the dropdown choices from this widget - FramePadW int `default:"1" dense:"0"` // When the widget has a frame, like a button, it adds 2 lines runes on each side - FramePadH int `default:"1" dense:"0"` // When the widget has a frame, like a button, it adds 2 lines runes on each side - PadW int `default:"1" dense:"0"` // pad spacing - PadH int `default:"1" dense:"0"` // pad spacing - WindowW int `default:"8" dense:"0"` // how far down to start Window or Tab headings - WindowH int `default:"-1"` // how far down to start Window or Tab headings - TabW int `default:"5" dense:"0"` // how far down to start Window or Tab headings - TabH int `default:"1" dense:"0"` // how far down to start Window or Tab headings - WindowPadW int `default:"8" dense:"0"` // additional amount of space to put between window & tab widgets - TabPadW int `default:"4" dense:"0"` // additional amount of space to put between window & tab widgets - GroupPadW int `default:"2" dense:"1"` // additional amount of space to indent on a group - BoxPadW int `default:"2" dense:"1"` // additional amount of space to indent on a box - GridPadW int `default:"2" dense:"1"` // additional amount of space to indent on a grid - RawW int `default:"1"` // the raw beginning of each window (or tab) - RawH int `default:"5"` // the raw beginning of each window (or tab) - FakeW int `default:"20"` // offset for the hidden widgets - padded bool // add space between things like buttons - 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 - margin bool // add space around the frames of windows - writeMutex sync.Mutex // writeMutex protects writes to *guiWidget (it's global right now maybe) - ecount int // counts how many mouse and keyboard events have occurred - supermouse bool // prints out every widget found while you move the mouse around - depth int // used for listWidgets() debugging - globalMouseDown bool // yep, mouse is pressed - newWindowTrigger chan bool // work around hack to redraw windows a bit after NewWindow() - stdout stdout // information for the STDOUT window - showDebug bool // todo: move this into config struct - dropdown dropdown // the dropdown menu + FramePadW int `default:"1" dense:"0"` // When the widget has a frame, like a button, it adds 2 lines runes on each side + FramePadH int `default:"1" dense:"0"` // When the widget has a frame, like a button, it adds 2 lines runes on each side + PadW int `default:"1" dense:"0"` // pad spacing + PadH int `default:"1" dense:"0"` // pad spacing + WindowW int `default:"8" dense:"0"` // how far down to start Window or Tab headings + WindowH int `default:"-1"` // how far down to start Window or Tab headings + TabW int `default:"5" dense:"0"` // how far down to start Window or Tab headings + TabH int `default:"1" dense:"0"` // how far down to start Window or Tab headings + WindowPadW int `default:"8" dense:"0"` // additional amount of space to put between window & tab widgets + TabPadW int `default:"4" dense:"0"` // additional amount of space to put between window & tab widgets + GroupPadW int `default:"2" dense:"1"` // additional amount of space to indent on a group + BoxPadW int `default:"2" dense:"1"` // additional amount of space to indent on a box + GridPadW int `default:"2" dense:"1"` // additional amount of space to indent on a grid + RawW int `default:"1"` // the raw beginning of each window (or tab) + RawH int `default:"5"` // the raw beginning of each window (or tab) + FakeW int `default:"20"` // offset for the hidden widgets + padded bool // add space between things like buttons + 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 + margin bool // add space around the frames of windows + writeMutex sync.Mutex // writeMutex protects writes to *guiWidget (it's global right now maybe) + ecount int // counts how many mouse and keyboard events have occurred + supermouse bool // prints out every widget found while you move the mouse around + depth int // used for listWidgets() debugging + globalMouseDown bool // yep, mouse is pressed + newWindowTrigger chan bool // work around hack to redraw windows a bit after NewWindow() + stdout stdout // information for the STDOUT window + showDebug bool // todo: move this into config struct + dropdown dropdown // the dropdown menu + allwin []*guiWidget // for tracking which window is next } // settings for the stdout window @@ -145,6 +146,7 @@ type guiWidget struct { color *colorT // what color to use resize bool // the window is currently being resized isBG bool // means this is the background widget. There is only one of these + activeWindow bool // means this window is the active one } // from the gocui devs: @@ -71,6 +71,11 @@ func addWidget(n *tree.Node) { case widget.Dropdown: nw.color = &colorDropdown return + case widget.Textbox: + n.State.Label = "TEXTBOX" + nw.labelN = " " + n.State.Label + nw.color = &colorDropdown + return case widget.Combobox: nw.color = &colorCombobox return |
