Compare commits

...

5 Commits
v0.2.0 ... main

5 changed files with 56 additions and 15 deletions

17
README.md Normal file
View File

@ -0,0 +1,17 @@
# TUIMenu
**TUIMenu** is a lightweight library designed to create terminal user interface menus.
## Features
- **Customizable Title**
- **Customizable Commands**
- **Grouping/Functional/Stepping Commands**
- **No third-party dependency**
### Planned Features
The following features will be introduced in future updates:
- **Cursor manipulations**: Moving cursor and clearing data displayed on the screen like [NCurses](https://invisible-island.net/ncurses/ncurses-intro.html)
- **Widgets Display Buffer**: Pre-created widgets using ASCII symbols will be seen as structs with methods like `Widget.Erase()`

View File

@ -5,7 +5,7 @@ import (
"log"
"time"
"git.qowevisa.me/Qowevisa/tuimenu/simple"
"git.qowevisa.me/qowevisa/tuimenu/simple"
)
func main() {

2
go.mod
View File

@ -1,3 +1,3 @@
module git.qowevisa.me/Qowevisa/tuimenu
module git.qowevisa.me/qowevisa/tuimenu
go 1.23.0

View File

@ -97,7 +97,7 @@ type Menu struct {
counterForIDs uint
cmdTree *commandTree
//
interrupt chan func(m *Menu)
interrupt chan *MenuInterrupt
resumeSignal chan struct{}
inputChan chan string
errorChan chan error
@ -118,7 +118,7 @@ func CreateMenu(options ...SimpleMenuOption) *Menu {
lineCounter: 0,
counterForIDs: 1,
cmdTree: createCommandTree(),
interrupt: make(chan func(m *Menu)),
interrupt: make(chan *MenuInterrupt),
resumeSignal: make(chan struct{}),
inputChan: make(chan string),
errorChan: make(chan error),
@ -276,14 +276,9 @@ func (m *Menu) readInput() {
func (m *Menu) GetInput(prompt string) string {
nlCount := strings.Count(prompt, "\n")
fmt.Printf(prompt)
m.lineCounter += uint(nlCount)
stdinReader := bufio.NewReader(os.Stdin)
rawMsg, err := stdinReader.ReadString('\n')
if err != nil {
// fmt.Printf("Error: ReadString: %v\n", err)
m.errorChan <- err
return ""
}
rawMsg := <-m.inputChan
m.lineCounter++
msg := strings.TrimRight(rawMsg, "\n")
return msg
@ -300,18 +295,33 @@ func (m *Menu) iteration() {
m.handleInput(msg)
case err := <-m.errorChan:
m.Log.Logf("err: %v", err)
case f := <-m.interrupt:
case intr := <-m.interrupt:
if m.usingEscapeCodes {
m.clearLines()
}
log.Printf("Interrupt")
f(m)
intr.Func(m)
if intr.Status&IntrOptStatus_ClearAfterFinish > 0 {
m.clearLines()
}
}
// }
}
func (m *Menu) SendInterrupt(f func(m *Menu)) {
m.interrupt <- f
type MenuInterrupt struct {
Func func(m *Menu)
Status IntrOptStatus
}
func (m *Menu) SendInterrupt(f func(m *Menu), intrOptions ...InterruptOption) {
intr := &MenuInterrupt{
Func: f,
Status: 0,
}
for _, opt := range intrOptions {
opt(intr)
}
m.interrupt <- intr
}
func (m *Menu) Start() {

View File

@ -19,3 +19,17 @@ func WithUsageOfEscapeCodes() SimpleMenuOption {
conf.UsingEscapeCodes = true
}
}
type InterruptOption func(intr *MenuInterrupt)
type IntrOptStatus uint32
const (
IntrOptStatus_ClearAfterFinish IntrOptStatus = 1 << iota
)
func ClearAfterFinishingFunc() InterruptOption {
return func(intr *MenuInterrupt) {
intr.Status |= IntrOptStatus_ClearAfterFinish
}
}