tinybox
Owner: IIIlllIIIllI URL: git@github.com:nyangkosense/tinybox.git
rm showcase
Commit 8648b3224729ac21d77079077f194126463609e9 by SM <seb.michalk@gmail.com> on 2025-09-24 11:15:51 +0200
diff --git a/demo/tinyfm.go b/demo/tinyfm.go
deleted file mode 100644
index df7dfa5..0000000
--- a/demo/tinyfm.go
+++ /dev/null
@@ -1,195 +0,0 @@
-package main
-
-import (
- "fmt"
- "os"
- "path/filepath"
- "sort"
- tb "tinybox-example/tinybox"
-)
-
-type entry struct {
- name string
- dir bool
-}
-
-type state struct {
- path string
- items []entry
- sel int
- scroll int
- msg string
-}
-
-func main() {
- st := &state{path: startPath()}
- st.reload()
- if err := tb.Init(); err != nil {
- fmt.Fprintln(os.Stderr, "tinyfm:", err)
- return
- }
- defer tb.Close()
- tb.SetCursorVisible(false)
- for {
- draw(st)
- evt, err := tb.PollEvent()
- if err != nil {
- st.msg = err.Error()
- continue
- }
- if evt.Type != tb.EventKey {
- continue
- }
- switch evt.Key {
- case tb.KeyCtrlC, tb.KeyEscape:
- return
- case tb.KeyArrowUp:
- st.move(-1)
- case tb.KeyArrowDown:
- st.move(1)
- case tb.KeyEnter:
- st.openSelection()
- case tb.KeyBackspace:
- st.up()
- default:
- if evt.Ch == 'q' || evt.Ch == 'Q' {
- return
- }
- }
- }
-}
-
-func startPath() string {
- if len(os.Args) > 1 {
- if abs, err := filepath.Abs(os.Args[1]); err == nil {
- return abs
- }
- }
- if pwd, err := os.Getwd(); err == nil {
- return pwd
- }
- return "."
-}
-
-func (s *state) reload() {
- entries, err := os.ReadDir(s.path)
- if err != nil {
- s.items = nil
- s.msg = err.Error()
- return
- }
- list := make([]entry, 0, len(entries))
- for _, e := range entries {
- list = append(list, entry{name: e.Name(), dir: e.IsDir()})
- }
- sort.Slice(list, func(i, j int) bool {
- if list[i].dir == list[j].dir {
- return list[i].name < list[j].name
- }
- return list[i].dir
- })
- s.items = list
- if s.sel >= len(list) {
- s.sel = len(list) - 1
- }
- if s.sel < 0 {
- s.sel = 0
- }
- if len(list) == 0 {
- s.sel = 0
- }
- s.msg = ""
-}
-
-func (s *state) move(step int) {
- if len(s.items) == 0 {
- s.sel = 0
- return
- }
- s.sel += step
- if s.sel < 0 {
- s.sel = 0
- } else if s.sel >= len(s.items) {
- s.sel = len(s.items) - 1
- }
-}
-
-func (s *state) openSelection() {
- if len(s.items) == 0 {
- return
- }
- it := s.items[s.sel]
- next := filepath.Join(s.path, it.name)
- if it.dir {
- s.path = next
- s.sel, s.scroll = 0, 0
- s.reload()
- return
- }
- s.msg = next
-}
-
-func (s *state) up() {
- parent := filepath.Dir(s.path)
- if parent == s.path {
- return
- }
- s.path = parent
- s.sel, s.scroll = 0, 0
- s.reload()
-}
-
-func draw(s *state) {
- tb.Clear()
- w, h := tb.Size()
- if w <= 0 || h <= 2 {
- tb.Flush()
- return
- }
- tb.SetColor(14, 0)
- tb.PrintAt(0, 0, " "+s.path)
- tb.SetColor(8, 0)
- tb.PrintAt(0, 1, " arrows navigate · enter open · backspace up · q quit")
- viewTop := 2
- view := h - viewTop - 1
- if view < 1 {
- view = 1
- }
- if s.sel < s.scroll {
- s.scroll = s.sel
- }
- if s.sel >= s.scroll+view {
- s.scroll = s.sel - view + 1
- }
- if max := len(s.items) - view; max >= 0 && s.scroll > max {
- s.scroll = max
- }
- for i := 0; i < view && s.scroll+i < len(s.items); i++ {
- idx := s.scroll + i
- it := s.items[idx]
- y := viewTop + i
- if idx == s.sel {
- tb.SetColor(0, 12)
- } else if it.dir {
- tb.SetColor(11, 0)
- } else {
- tb.SetColor(15, 0)
- }
- tb.PrintAt(0, y, formatEntry(it))
- }
- tb.SetColor(8, 0)
- status := s.msg
- if status == "" {
- status = fmt.Sprintf("%d item(s)", len(s.items))
- }
- tb.PrintAt(0, h-1, " "+status)
- tb.Flush()
-}
-
-func formatEntry(e entry) string {
- name := e.name
- if e.dir {
- name += "/"
- }
- return " " + name
-}