diff --git a/example/main.go b/example/main.go index a01390a..fdad0f4 100644 --- a/example/main.go +++ b/example/main.go @@ -1,62 +1,30 @@ package main import ( - "github.com/orus-dev/osui" - "github.com/orus-dev/osui/colors" - "github.com/orus-dev/osui/ui" + "github.com/orus-dev/osui" + "github.com/orus-dev/osui/ui" ) +var students []string = []string{} + func main() { - screen := osui.NewScreen(App()) - screen.Run() + screen := osui.NewScreen(App()) + screen.Run() } -func App() *ui.PaginatorComponent { - w, h := osui.GetTerminalSize() - - var keybindings ui.Class[*ui.TextComponent] - keybindings.SetProperties(func(tc *ui.TextComponent) *ui.TextComponent { - tc.Text = colors.Blue + tc.Text - tc.Data.Y = h - 2 - return tc - }) - - return ui.Paginator( - // Page 1 - ui.Div( - ui.Text("Welcome to the example! The blue text on the bottom show the keybindings"), - keybindings.Class(ui.Text("Next Page: Tab. Previous Page: shift + tab")), - ), - - // Page 2 - ui.Div( - ui.WithPosition(0, 0, ui.Text("This blue square is a div. A div stores multiple components into one")), - ui.WithPosition((w-30)/2, (h-4)/2, - ui.WithSize(30, 5, - ui.Div(ui.WithPosition(4, 1, ui.Button("Hello, World!").Params(ui.ButtonParams{Width: 19}))).Params(ui.DivParams{Style: ui.DivStyle{Outline: colors.Blue}}), - )), - keybindings.Class(ui.Text("Navigate: Ctrl+(W/A/S/D)")), - ), - - // Page 3 - ui.Div( - ui.WithPosition(0, 0, ui.Text("This is a InputBox. It takes user input just like a GUI. "+colors.Red+colors.Bold+"NOTE: This InputBox is inside a div")), - ui.WithPosition((w-32)/2, (h-3)/2, ui.InputBox(30)), - keybindings.Class(ui.Text("Navigate: Ctrl+(W/A/S/D). Finish: Enter.")), - ), - - // Page 4 - ui.Div( - ui.WithPosition(0, 0, ui.Text("This is a Button. To click it press Enter. "+colors.Red+colors.Bold+"NOTE: This Button is inside a div")), - ui.WithPosition((w-20)/2, (h-3)/2, ui.Button("This is a button")), - keybindings.Class(ui.Text("Navigate: Ctrl+(W/A/S/D). Click Button: Enter")), - ), - - // Page 5 - ui.Div( - ui.WithPosition(0, 0, ui.Text("This is a Menu. It prompts you to select an item. "+colors.Red+colors.Bold+"NOTE: This Menu is inside a div")), - ui.WithPosition(0, 2, ui.Menu("Item 1", "Item 2", "Item 3", "Item 4", "Item 5").Params(ui.MenuParams{OnSelected: func(mc *ui.MenuComponent, b bool) {}})), - keybindings.Class(ui.Text("Navigate: Ctrl+(W/A/S/D). Navigate Menu: W/S. Select: Enter. Exit Menu: Q. ")), - ), - ) +func App() *ui.DivComponent { + return renderRoot() +} + +func renderRoot() *ui.DivComponent { + var root ui.Id[*ui.DivComponent] + + return root.Id(ui.Div( + ui.WithPosition(0, 0, ui.Text("student managment system (terminal edition permium) made by fefek")), + ui.WithPosition(0, 2, ui.Button("add student")), + ui.WithPosition(25, 2, ui.Button("delete student")), + ui.WithPosition(50, 2, ui.Button("info")), + ui.WithPosition(0, 5, ui.Text("students")), + ui.WithPosition(0, 7, ui.Menu(students...)), + )) } diff --git a/utils.go b/utils.go index 1ee143c..1190c5a 100644 --- a/utils.go +++ b/utils.go @@ -14,13 +14,16 @@ import ( "golang.org/x/term" ) -func RenderLine(frame_, line_ string, x int, fm map[int]string, lm map[int]string) string { +var re = regexp.MustCompile(`(\x1b\[([0-9;]*)[a-zA-Z])+`) + +func RenderLine(frame_, line_ string, x int, fm, lm map[int]string) string { var res strings.Builder frame := []rune(frame_) line := []rune(line_) - for i := range frame { - if i >= x && i-x < len(line) { + flen, llen := len(frame), len(line) + for i := 0; i < flen; i++ { + if i >= x && i-x < llen { if v, ok := lm[i-x]; ok { res.WriteString(v) } @@ -36,8 +39,6 @@ func RenderLine(frame_, line_ string, x int, fm map[int]string, lm map[int]strin } func CompressString(input string) (string, map[int]string) { - pattern := `(\x1b\[([0-9;]*)[a-zA-Z])+` - re := regexp.MustCompile(pattern) matchesMap := make(map[int]string) res := []rune{}