summaryrefslogtreecommitdiff
path: root/tui/context_menu.go
diff options
context:
space:
mode:
authorcitrons <citrons@mondecitronne.com>2025-06-07 15:58:35 -0500
committercitrons <citrons@mondecitronne.com>2025-06-07 16:02:18 -0500
commit4fd84671877754ae3b66acb8a8af8cf0935a53c9 (patch)
tree4d7b6de81bd28e0c1184037f236e1a0e3701b646 /tui/context_menu.go
parent4067adfc361e87bc4e73e31fdfc4933802f05413 (diff)
context menus
Diffstat (limited to 'tui/context_menu.go')
-rw-r--r--tui/context_menu.go75
1 files changed, 75 insertions, 0 deletions
diff --git a/tui/context_menu.go b/tui/context_menu.go
new file mode 100644
index 0000000..e6d5bb9
--- /dev/null
+++ b/tui/context_menu.go
@@ -0,0 +1,75 @@
+package tui
+
+import (
+ "github.com/rivo/uniseg"
+ "strings"
+)
+
+var menuStyle = Style {Fg: Black, Bg: Yellow}
+
+var menuState struct {
+ open bool
+ x, y int
+ width, height int
+ boxId string
+ menu []string
+ selected string
+}
+
+func MenuOption(name string) bool {
+ b := top()
+ b.contextMenu = append(b.contextMenu, name)
+ if menuState.boxId == top().id && menuState.selected == name {
+ menuState.selected = ""
+ return true
+ }
+ return false
+}
+
+func openContextMenu(x int, y int, b *Box) {
+ menuState.open = true
+ menuState.boxId = b.id
+ menuState.menu = b.contextMenu
+
+ menuState.height = len(menuState.menu)
+ for _, option := range menuState.menu {
+ menuState.width = max(menuState.width, uniseg.StringWidth(option))
+ }
+ size := Size()
+ if x + menuState.width < size.Width {
+ menuState.x = x + 1
+ } else {
+ menuState.x = x - menuState.width - 1
+ }
+ if y + menuState.height < size.Height {
+ menuState.y = y
+ } else {
+ menuState.y = y - menuState.height
+ }
+}
+
+
+func processContextMenu(ev MouseEvent) {
+ for i, option := range menuState.menu {
+ x, y := menuState.x, menuState.y + i
+ if ev.Button <= 2 && (ev.Pressed || ev.Released) &&
+ ev.X >= x && ev.X < x + menuState.width && ev.Y == y {
+ menuState.selected = option
+ menuState.open = false
+ }
+ }
+ if ev.Button <= 2 && ev.Pressed {
+ menuState.open = false
+ }
+}
+
+func drawContextMenu() {
+ if !menuState.open {
+ return
+ }
+ for i, option := range menuState.menu {
+ x, y := menuState.x, menuState.y + i
+ WriteAt(x, y, strings.Repeat(" ", menuState.width), menuStyle)
+ WriteAt(x, y, option, menuStyle)
+ }
+}