gocui/eventMouseClick.go

166 lines
4.3 KiB
Go
Raw Normal View History

2025-02-01 11:42:31 -06:00
// 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 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) {
2025-02-08 08:07:03 -06:00
tk.dumpWidget(fmt.Sprintf("doWidgetClick(%d,%d)", w, h))
2025-02-01 14:55:25 -06:00
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:
me.myTree.SendFromUser(tk.node)
case widget.Combobox:
tk.showDropdown()
case widget.Dropdown:
tk.showDropdown()
case widget.Textbox:
tk.showTextbox()
case widget.Flag:
2025-02-01 15:57:29 -06:00
tk.dropdownClicked(w, h)
case widget.Stdout:
tk.dumpWidget("stdout click()")
default:
2025-02-06 05:41:51 -06:00
tk.dumpWidget("undef click()")
}
}
2025-02-08 08:36:08 -06:00
// handles a mouse click
func doMouseClick(w int, h int) {
2025-02-08 10:00:12 -06:00
// 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
2025-02-08 09:25:09 -06:00
for _, tk := range findByXY(w, h) {
2025-02-08 10:00:12 -06:00
if tk.node.WidgetId == me.dropdown.wId {
log.Info("got dropdwon click", w, h, tk.cuiName)
tk.dropdownClicked(w, h)
2025-02-08 15:01:36 -06:00
return
2025-02-08 09:25:09 -06:00
}
2025-02-08 10:30:19 -06:00
if tk.node.WidgetId == me.textbox.wId {
log.Info("got textbox click", w, h, tk.cuiName)
textboxClosed()
2025-02-08 15:01:36 -06:00
return
2025-02-08 10:30:19 -06:00
}
}
2025-02-08 15:01:36 -06:00
log.Info("a dropdown or textbox is active. you can't click anywhere else (otherwise hit ESC)", w, h)
2025-02-08 10:00:12 -06:00
return
}
2025-02-08 17:19:41 -06:00
win := findWindowUnderMouse()
if win != nil {
// look in this window for widgets
// widgets have priority. send the click here first
for _, tk := range win.findByXYreal(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)
return
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
2025-02-08 10:30:19 -06:00
}
2025-02-03 18:50:17 -06:00
}
2025-02-09 03:00:10 -06:00
if win.checkWindowClose(w, h) {
return
}
log.Info("you clicked on a window, but not any widgets. check for title / close window here", win.cuiName)
2025-02-08 17:19:41 -06:00
win.redrawWindow(win.gocuiSize.w0, win.gocuiSize.h0)
me.stdout.outputOnTop = false
setThingsOnTop()
return
2025-02-03 18:50:17 -06:00
}
2025-02-08 09:25:09 -06:00
var found bool
for _, tk := range findByXY(w, h) {
// will show you everything found on a mouse click. great for debugging!
2025-02-01 13:58:53 -06:00
// tk.dumpWidget("click()")
if tk.node.WidgetType == widget.Stdout {
2025-01-31 12:36:46 -06:00
// don't send clicks to the stdout debugging window
2025-02-08 09:25:09 -06:00
// continue
2025-01-31 12:36:46 -06:00
}
2025-02-08 09:25:09 -06:00
found = true
// tk.doWidgetClick(w, h)
return
}
if found {
2025-02-08 08:36:08 -06:00
return
}
2025-02-08 08:36:08 -06:00
log.Log(GOCUI, "click() nothing was at:", w, h)
return
}
func doMouseDoubleClick(w int, h int) {
me.mouse.double = false
2025-02-08 10:00:12 -06:00
// log.Printf("actually a double click (%d,%d)", w, h)
2025-02-08 15:01:36 -06:00
if me.dropdown.active || me.textbox.active {
// can't drag or do anything when dropdown or textbox are visible
log.Info("can't double click. dropdown or textbox is active")
return
}
for _, tk := range findByXY(w, h) {
if tk.node.WidgetType == widget.Window {
2025-02-08 09:25:09 -06:00
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
}
}
}