From dd8f1fbc1fe158ec71d9581ae6f0272ef4b1e899 Mon Sep 17 00:00:00 2001 From: Leo Date: Sun, 29 Sep 2024 21:22:25 +0200 Subject: [PATCH] bug fixes and clean code --- README.md | 8 +++--- osui.gif => assets/osui.gif | Bin assets/osui.png | Bin 0 -> 12843 bytes example/main.go | 9 +++--- osui.go | 1 - ui/README.md | 5 ++-- ui/button.go | 54 ++++++++++++++++-------------------- ui/div.go | 17 +++++++----- ui/inputBox.go | 13 +++++++-- ui/menu.go | 15 +++++----- ui/paginator.go | 12 ++++++-- ui/text.go | 2 -- ui/utils.go | 41 ++++++++++----------------- utils.go | 2 +- 14 files changed, 89 insertions(+), 90 deletions(-) rename osui.gif => assets/osui.gif (100%) create mode 100644 assets/osui.png diff --git a/README.md b/README.md index f52e4a0..182c443 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ -# osui -A Component-based TUI library written in go! - -![OSUI](osui.gif) +

+

A Component-based TUI library written in go

+

+# Hello World ```go package main diff --git a/osui.gif b/assets/osui.gif similarity index 100% rename from osui.gif rename to assets/osui.gif diff --git a/assets/osui.png b/assets/osui.png new file mode 100644 index 0000000000000000000000000000000000000000..52a23aa22b7da4ab41aa2577297e4799f99ed208 GIT binary patch literal 12843 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 literal 0 HcmV?d00001 diff --git a/example/main.go b/example/main.go index dd4e864..9076f2e 100644 --- a/example/main.go +++ b/example/main.go @@ -25,9 +25,8 @@ func App() *PaginatorComponent { WithPosition(0, 0, Text("This blue square is a div. A div stores multiple components into one")), WithPosition((w-30)/2, (h-4)/2, WithSize(30, 5, - WithStyle(&DivStyle{Outline: colors.Blue}, - Div(WithPosition(4, 1, Button("Hello, World!", BtnParams{Width: 19}))), - ))), + Div(WithPosition(4, 1, Button("Hello, World!").Params(BtnParams{Width: 19}))).Params(DivParams{Style: DivStyle{Outline: colors.Blue}}), + )), WithPosition(0, h-2, Text(colors.Blue+"Navigate: Ctrl+(W/A/S/D)")), ), @@ -41,14 +40,14 @@ func App() *PaginatorComponent { // Page 4 Div( WithPosition(0, 0, Text("This is a Button. To click it press Enter. "+colors.Red+colors.Bold+"NOTE: This Button is inside a div")), - WithPosition((w-20)/2, (h-3)/2, Button("This is a button", BtnParams{OnClick: func(bc *ButtonComponent) bool { return false }})), + WithPosition((w-20)/2, (h-3)/2, Button("This is a button")), WithPosition(0, h-2, Text(colors.Blue+"Navigate: Ctrl+(W/A/S/D). Click Button: Enter")), ), // Page 5 Div( WithPosition(0, 0, Text("This is a Menu. It prompts you to select a item. "+colors.Red+colors.Bold+"NOTE: This Menu is inside a div")), - WithPosition(0, 2, Menu("Item 1", "Item 2", "Item 3", "Item 4", "Item 5").OnSelected(func(m *MenuComponent, b bool) {})), + WithPosition(0, 2, Menu("Item 1", "Item 2", "Item 3", "Item 4", "Item 5").Params(MenuParams{})), WithPosition(0, h-2, Text(colors.Blue+"Navigate: Ctrl+(W/A/S/D). Navigate Menu: W/S. Select: Enter. Exit Menu: Q. ")), ), ) diff --git a/osui.go b/osui.go index 683f4ff..02006c8 100644 --- a/osui.go +++ b/osui.go @@ -21,7 +21,6 @@ type Component interface { Render() string GetComponentData() *ComponentData Update(string) bool - SetStyle(interface{}) } type Screen struct { diff --git a/ui/README.md b/ui/README.md index ab36921..b8624e6 100644 --- a/ui/README.md +++ b/ui/README.md @@ -24,8 +24,9 @@ func (h *HelloComponent) Update(key string) bool { return false } -func (h *HelloComponent) SetStyle(c interface{}) { - h.Style = osui.SetDefaults(c.(*HelloStyle)).(*HelloStyle) +func (b *MenuComponent) Params(param MenuParams) *MenuComponent { + b.Style = osui.SetDefaults(¶m.Style).(*MenuStyle) + return b } func Hello(name string) *HelloComponent { diff --git a/ui/button.go b/ui/button.go index a62c92c..96a3b78 100644 --- a/ui/button.go +++ b/ui/button.go @@ -10,6 +10,13 @@ import ( "github.com/orus-dev/osui/isKey" ) +type BtnParams struct { + Style ButtonStyle + Toggle bool + OnClick func(*ButtonComponent) bool + Width int +} + type ButtonStyle struct { Background string `default:"" type:"bg"` Foreground string `default:"" type:"fg"` @@ -25,12 +32,12 @@ type ButtonStyle struct { } type ButtonComponent struct { - Data osui.ComponentData - Style *ButtonStyle - Text string - Toggle bool - Clicked bool - OnClick func(*ButtonComponent) bool + Data osui.ComponentData + Style *ButtonStyle + Text string + Toggle bool + Clicked bool + on_click func(*ButtonComponent) bool } func (b *ButtonComponent) Render() string { @@ -67,7 +74,7 @@ func (b *ButtonComponent) Render() string { func (b *ButtonComponent) Update(key string) bool { if isKey.Enter(key) { - if !b.OnClick(b) { + if !b.on_click(b) { if b.Toggle { b.Clicked = !b.Clicked return false @@ -85,35 +92,22 @@ func (b *ButtonComponent) GetComponentData() *osui.ComponentData { return &b.Data } -func (b *ButtonComponent) SetStyle(style interface{}) { - b.Style = osui.SetDefaults(style).(*ButtonStyle) -} - -type BtnParams struct { - Style ButtonStyle - Toggle bool - OnClick func(*ButtonComponent) bool - Width int -} - -func Button(text string, p ...BtnParams) *ButtonComponent { - if len(p) > 0 { - param := p[0] - return &ButtonComponent{Text: text, Style: osui.SetDefaults(¶m.Style).(*ButtonStyle), - Data: osui.ComponentData{ - Width: osui.LogicValueInt(param.Width == 0, 20, param.Width), - Height: 1, - }, - OnClick: fnLogicValue(param.OnClick), - } - +func (b *ButtonComponent) Params(param BtnParams) *ButtonComponent { + b.Style = osui.SetDefaults(¶m.Style).(*ButtonStyle) + if param.OnClick != nil { + b.on_click = param.OnClick } + b.Data.Width = osui.LogicValueInt(param.Width == 0, 20, param.Width) + return b +} + +func Button(text string) *ButtonComponent { return &ButtonComponent{Text: text, Style: osui.SetDefaults(&ButtonStyle{}).(*ButtonStyle), Data: osui.ComponentData{ Width: 20, Height: 1, }, - OnClick: func(bc *ButtonComponent) bool { return false }, + on_click: func(bc *ButtonComponent) bool { return false }, } } diff --git a/ui/div.go b/ui/div.go index 5f576e3..d372c0d 100644 --- a/ui/div.go +++ b/ui/div.go @@ -8,6 +8,12 @@ import ( "github.com/orus-dev/osui/isKey" ) +type DivParams struct { + Style DivStyle + Width int + Height int +} + type DivStyle struct { Background string `default:"" type:"bg"` Foreground string `default:"" type:"fg"` @@ -82,8 +88,10 @@ func (d *DivComponent) Update(key string) bool { return false } -func (d *DivComponent) SetStyle(c interface{}) { - d.Style = osui.SetDefaults(c.(*DivStyle)).(*DivStyle) +func (b *DivComponent) Params(param DivParams) *DivComponent { + b.Style = osui.SetDefaults(¶m.Style).(*DivStyle) + b.Data.Width = osui.LogicValueInt(param.Width == 0, 20, param.Width) + return b } func (d *DivComponent) updateActive(newIndex int) { @@ -92,11 +100,6 @@ func (d *DivComponent) updateActive(newIndex int) { } } -func (d *DivComponent) AddTo(c *DivComponent) *DivComponent { - *c = *d - return d -} - func Div(components ...osui.Component) *DivComponent { return &DivComponent{ Components: components, diff --git a/ui/inputBox.go b/ui/inputBox.go index cc2c4f4..59ee388 100644 --- a/ui/inputBox.go +++ b/ui/inputBox.go @@ -9,6 +9,12 @@ import ( "github.com/orus-dev/osui/isKey" ) +type InputBoxParams struct { + Style DivStyle + Width int + Height int +} + type InputBoxStyle struct { Background string `default:"" type:"bg"` Foreground string `default:"" type:"fg"` @@ -77,8 +83,11 @@ func (s *InputBoxComponent) Update(key string) bool { return false } -func (d *InputBoxComponent) SetStyle(c interface{}) { - d.Style = osui.SetDefaults(c.(*InputBoxStyle)).(*InputBoxStyle) +func (b *InputBoxComponent) Params(p interface{}) *InputBoxComponent { + param := p.(InputBoxParams) + b.Style = osui.SetDefaults(¶m.Style).(*InputBoxStyle) + b.Data.Width = osui.LogicValueInt(param.Width == 0, 20, param.Width) + return b } func InputBox(max_size uint) *InputBoxComponent { diff --git a/ui/menu.go b/ui/menu.go index e9c85f6..a4a10c0 100644 --- a/ui/menu.go +++ b/ui/menu.go @@ -8,6 +8,11 @@ import ( "github.com/orus-dev/osui/isKey" ) +type MenuParams struct { + Style MenuStyle + OnSelected func(*MenuComponent, bool) +} + type MenuStyle struct { Fg string `default:"" type:"fg"` Bg string `default:"" type:"bg"` @@ -74,13 +79,9 @@ func (m *MenuComponent) Update(key string) bool { return false } -func (m *MenuComponent) SetStyle(c interface{}) { - m.Style = osui.SetDefaults(c.(*MenuStyle)).(*MenuStyle) -} - -func (m *MenuComponent) OnSelected(f func(*MenuComponent, bool)) *MenuComponent { - m.onSelected = f - return m +func (b *MenuComponent) Params(param MenuParams) *MenuComponent { + b.Style = osui.SetDefaults(¶m.Style).(*MenuStyle) + return b } func Menu(items ...string) *MenuComponent { diff --git a/ui/paginator.go b/ui/paginator.go index 2221ba0..97f36a5 100644 --- a/ui/paginator.go +++ b/ui/paginator.go @@ -9,6 +9,12 @@ import ( "github.com/orus-dev/osui/isKey" ) +type PaginatorParams struct { + Style DivStyle + Width int + Height int +} + type PaginatorStyle struct { Active string `default:"\033[32m"` Inactive string `default:""` @@ -92,8 +98,10 @@ func (p *PaginatorComponent) updateActive(newIndex int) { } } -func (p *PaginatorComponent) SetStyle(c interface{}) { - p.Style = osui.SetDefaults(c.(*PaginatorStyle)).(*PaginatorStyle) +func (b *PaginatorComponent) Params(p interface{}) *PaginatorComponent { + param := p.(PaginatorParams) + b.Style = osui.SetDefaults(¶m.Style).(*PaginatorStyle) + return b } func Paginator(pages ...osui.Component) *PaginatorComponent { diff --git a/ui/text.go b/ui/text.go index b90ae14..0ddeb19 100644 --- a/ui/text.go +++ b/ui/text.go @@ -21,8 +21,6 @@ func (t TextComponent) Render() string { return t.Text } -func (t *TextComponent) SetStyle(interface{}) {} - func Text(text string) *TextComponent { return &TextComponent{Text: text} } diff --git a/ui/utils.go b/ui/utils.go index cb7d76a..568a954 100644 --- a/ui/utils.go +++ b/ui/utils.go @@ -8,6 +8,20 @@ import ( "github.com/orus-dev/osui" ) +func WithPosition(x, y int, c osui.Component) osui.Component { + data := c.GetComponentData() + data.X = x + data.Y = y + return c +} + +func WithSize(width, height int, c osui.Component) osui.Component { + data := c.GetComponentData() + data.Width = width + data.Height = height + return c +} + func centerText(text string, width int) string { if len(text) > width { return text[:width] @@ -19,33 +33,6 @@ func centerText(text string, width int) string { return fmt.Sprintf("%s%s%s", leftPadding, text, rightPadding) } -func fnLogicValue(f func(*ButtonComponent) bool) func(*ButtonComponent) bool { - if f == nil { - return func(*ButtonComponent) bool { return false } - } else { - return f - } -} - -func WithPosition(x, y int, c osui.Component) osui.Component { - data := c.GetComponentData() - data.X = x - data.Y = y - return c -} - -func WithStyle(style interface{}, c osui.Component) osui.Component { - c.SetStyle(style) - return c -} - -func WithSize(width, height int, c osui.Component) osui.Component { - data := c.GetComponentData() - data.Width = width - data.Height = height - return c -} - func findClosestComponent(a []osui.Component, i int, d string) int { if len(a) == 0 || i < 0 || i >= len(a) { return -1 // Invalid input diff --git a/utils.go b/utils.go index 6cd7d55..db96c9f 100644 --- a/utils.go +++ b/utils.go @@ -174,7 +174,7 @@ func LogicValueInt(b bool, _if, _else int) int { } func GetTerminalSize() (int, int) { - w, h, err := term.GetSize(0) + w, h, err := term.GetSize(int(os.Stdin.Fd())) if err != nil { panic(err) }