209 lines
5.3 KiB
Go
209 lines
5.3 KiB
Go
// Copyright 2017-2025 WIT.COM Inc. All rights reserved.
|
|
// Use of this source code is governed by the GPL 3.0
|
|
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"go.wit.com/log"
|
|
"go.wit.com/widget"
|
|
)
|
|
|
|
/*
|
|
// this didn't work. panic()
|
|
func (tk *guiWidget) DeleteNode() {
|
|
p := tk.parent
|
|
for i, child := range p.children {
|
|
log.Log(GOCUI, "parent has child:", i, child.node.WidgetId, child.node.GetProgName())
|
|
if tk == child {
|
|
log.Log(GOCUI, "Found child ==", i, child.node.WidgetId, child.node.GetProgName())
|
|
log.Log(GOCUI, "Found n ==", i, tk.node.WidgetId, tk.node.GetProgName())
|
|
p.children = append(p.children[:i], p.children[i+1:]...)
|
|
}
|
|
}
|
|
for i, child := range p.children {
|
|
log.Log(TREE, "parent now has child:", i, child.WidgetId, child.GetProgName())
|
|
}
|
|
}
|
|
*/
|
|
|
|
func (tk *guiWidget) doWindowClick() {
|
|
w, h := me.baseGui.MousePosition()
|
|
tk.dumpWidget(fmt.Sprintf("doWindowClick(%d,%d)", w, h))
|
|
|
|
// compare the mouse location to the 'X' indicator to close the window
|
|
if tk.gocuiSize.inRect(w, h) {
|
|
offset := w - tk.gocuiSize.w1
|
|
if (offset < 2) && (offset > -2) {
|
|
// close enough // close the window here
|
|
tk.dumpWidget(fmt.Sprintf("Close Window(%d,%d) (off=%d)", w, h, offset))
|
|
tk.hideWindow()
|
|
n := tk.node
|
|
tk.deleteNode()
|
|
me.myTree.SendWindowCloseEvent(n)
|
|
/*
|
|
n.DeleteNode()
|
|
|
|
tk.DeleteNode()
|
|
*/
|
|
return
|
|
}
|
|
if tk.window.collapsed {
|
|
tk.dumpWidget(fmt.Sprintf("collapse = false"))
|
|
tk.window.collapsed = false
|
|
} else {
|
|
tk.dumpWidget(fmt.Sprintf("collapse = true"))
|
|
tk.window.collapsed = true
|
|
}
|
|
} else {
|
|
tk.window.collapsed = false
|
|
}
|
|
// if there is a current window, hide it
|
|
if me.currentWindow != nil {
|
|
me.currentWindow.setColor(&colorWindow)
|
|
}
|
|
|
|
// now set this window as the current window
|
|
me.currentWindow = tk
|
|
|
|
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) {
|
|
tk.dumpWidget(fmt.Sprintf("doWidgetClick(%d,%d)", w, h))
|
|
switch tk.node.WidgetType {
|
|
case widget.Window:
|
|
tk.doWindowClick()
|
|
return
|
|
case widget.Checkbox:
|
|
if tk.node.State.Checked {
|
|
log.Log(WARN, "checkbox is being set to false")
|
|
tk.node.State.Checked = false
|
|
tk.setCheckbox()
|
|
} else {
|
|
log.Log(WARN, "checkbox is being set to true")
|
|
tk.node.State.Checked = true
|
|
tk.setCheckbox()
|
|
}
|
|
me.myTree.SendUserEvent(tk.node)
|
|
case widget.Button:
|
|
me.myTree.SendFromUser(tk.node)
|
|
case widget.Combobox:
|
|
tk.showDropdown()
|
|
case widget.Dropdown:
|
|
tk.showDropdown()
|
|
case widget.Textbox:
|
|
tk.showTextbox()
|
|
case widget.Flag:
|
|
tk.dropdownClicked(w, h)
|
|
case widget.Stdout:
|
|
tk.dumpWidget("stdout click()")
|
|
default:
|
|
tk.dumpWidget("undef click()")
|
|
}
|
|
}
|
|
|
|
// handles a mouse click
|
|
func doMouseClick(w int, h int) {
|
|
// Flag widgets (dropdown menus, etc) are the highest priority. ALWAYS SEND MOUSE CLICKS THERE FIRST
|
|
// handle an open dropdown menu or text entry window first
|
|
if me.dropdown.active || me.textbox.active {
|
|
// can't drag or do anything when dropdown or textbox are visible
|
|
log.Info("can't do anything. dropdown or textbox is active")
|
|
for _, tk := range findByXY(w, h) {
|
|
if tk.node.WidgetId == me.dropdown.wId {
|
|
log.Info("got dropdwon click", w, h, tk.cuiName)
|
|
tk.dropdownClicked(w, h)
|
|
}
|
|
if tk.node.WidgetId == me.textbox.wId {
|
|
log.Info("got textbox click", w, h, tk.cuiName)
|
|
tk.textboxClosed()
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
// priority widgets. send the click here first
|
|
for _, tk := range findByXY(w, h) {
|
|
switch tk.node.WidgetType {
|
|
case widget.Checkbox:
|
|
if tk.node.State.Checked {
|
|
log.Log(WARN, "checkbox is being set to false")
|
|
tk.node.State.Checked = false
|
|
tk.setCheckbox()
|
|
} else {
|
|
log.Log(WARN, "checkbox is being set to true")
|
|
tk.node.State.Checked = true
|
|
tk.setCheckbox()
|
|
}
|
|
me.myTree.SendUserEvent(tk.node)
|
|
case widget.Button:
|
|
tk.dumpWidget("click()") // enable this to debug widget clicks
|
|
me.myTree.SendFromUser(tk.node)
|
|
return
|
|
case widget.Combobox:
|
|
tk.showDropdown()
|
|
return
|
|
case widget.Dropdown:
|
|
tk.showDropdown()
|
|
return
|
|
case widget.Textbox:
|
|
tk.showTextbox()
|
|
return
|
|
default:
|
|
// TODO: enable the GUI debugger in gocui
|
|
// tk.dumpWidget("undef click()") // enable this to debug widget clicks
|
|
}
|
|
}
|
|
|
|
var found bool
|
|
|
|
for _, tk := range findByXY(w, h) {
|
|
// will show you everything found on a mouse click. great for debugging!
|
|
// tk.dumpWidget("click()")
|
|
if tk.node.WidgetType == widget.Stdout {
|
|
// don't send clicks to the stdout debugging window
|
|
// continue
|
|
}
|
|
found = true
|
|
// tk.doWidgetClick(w, h)
|
|
return
|
|
}
|
|
if found {
|
|
return
|
|
}
|
|
|
|
log.Log(GOCUI, "click() nothing was at:", w, h)
|
|
return
|
|
}
|
|
|
|
func doMouseDoubleClick(w int, h int) {
|
|
me.mouse.double = false
|
|
// log.Printf("actually a double click (%d,%d)", w, h)
|
|
|
|
for _, tk := range findByXY(w, h) {
|
|
if tk.node.WidgetType == widget.Window {
|
|
tk.redrawWindow(tk.gocuiSize.w0, tk.gocuiSize.h0)
|
|
me.stdout.outputOnTop = false
|
|
setThingsOnTop()
|
|
return
|
|
}
|
|
|
|
if tk.node.WidgetType == widget.Stdout {
|
|
if me.stdout.outputOnTop {
|
|
me.stdout.outputOnTop = false
|
|
setThingsOnTop()
|
|
} else {
|
|
me.stdout.outputOnTop = true
|
|
setThingsOnTop()
|
|
}
|
|
return
|
|
}
|
|
}
|
|
}
|