More work on choose-files

This commit is contained in:
Kovid Goyal
2025-05-20 14:16:49 +05:30
parent 7347075bb3
commit b55013944e
3 changed files with 146 additions and 9 deletions

View File

@@ -7,13 +7,29 @@ import (
"github.com/kovidgoyal/kitty/tools/cli"
"github.com/kovidgoyal/kitty/tools/tty"
"github.com/kovidgoyal/kitty/tools/tui/loop"
"github.com/kovidgoyal/kitty/tools/utils"
)
var _ = fmt.Print
var debugprintln = tty.DebugPrintln
type State struct {
Base_dir string
base_dir string
current_dir string
select_dirs bool
multiselect bool
max_depth int
search_text string
}
func (s State) BaseDir() string { return utils.IfElse(s.base_dir == "", default_cwd, s.base_dir) }
func (s State) SelectDirs() bool { return s.select_dirs }
func (s State) Multiselect() bool { return s.multiselect }
func (s State) MaxDepth() int { return utils.IfElse(s.max_depth < 1, 5, s.max_depth) }
func (s State) String() string { return utils.Repr(s) }
func (s State) SearchText() string { return s.search_text }
func (s State) CurrentDir() string {
return utils.IfElse(s.current_dir == "", s.BaseDir(), s.current_dir)
}
type ScreenSize struct {
@@ -29,17 +45,40 @@ type Handler struct {
func (h *Handler) draw_screen() (err error) {
h.lp.StartAtomicUpdate()
defer h.lp.EndAtomicUpdate()
h.lp.ClearScreen()
y := 0
if dy, err := h.draw_search_bar(y); err != nil {
return err
} else {
y += dy
}
return
}
func (h *Handler) init_sizes(new_size loop.ScreenSize) {
h.screen_size.width = int(new_size.WidthCells)
h.screen_size.height = int(new_size.HeightCells)
h.screen_size.cell_width = int(new_size.CellWidth)
h.screen_size.cell_height = int(new_size.CellHeight)
h.screen_size.width_px = int(new_size.WidthPx)
h.screen_size.height_px = int(new_size.HeightPx)
}
func (h *Handler) OnInitialize() (ans string, err error) {
if sz, err := h.lp.ScreenSize(); err != nil {
return "", err
} else {
h.init_sizes(sz)
}
h.lp.AllowLineWrapping(false)
h.lp.SetCursorShape(loop.BAR_CURSOR, true)
h.draw_screen()
return
}
var default_cwd string
func main(_ *cli.Command, opts *Options, args []string) (rc int, err error) {
lp, err := loop.New()
if err != nil {
@@ -49,22 +88,17 @@ func main(_ *cli.Command, opts *Options, args []string) (rc int, err error) {
switch len(args) {
case 0:
os.Getwd()
if handler.state.Base_dir, err = os.Getwd(); err != nil {
if default_cwd, err = os.Getwd(); err != nil {
return
}
case 1:
handler.state.Base_dir = args[0]
default_cwd = args[0]
default:
return 1, fmt.Errorf("Can only specify one directory to search in")
}
lp.OnInitialize = handler.OnInitialize
lp.OnResize = func(old, new_size loop.ScreenSize) (err error) {
handler.screen_size.width = int(new_size.WidthCells)
handler.screen_size.height = int(new_size.HeightCells)
handler.screen_size.cell_width = int(new_size.CellWidth)
handler.screen_size.cell_height = int(new_size.CellHeight)
handler.screen_size.width_px = int(new_size.WidthPx)
handler.screen_size.height_px = int(new_size.HeightPx)
handler.init_sizes(new_size)
return handler.draw_screen()
}
err = lp.Run()

View File

@@ -0,0 +1,54 @@
package choose_files
import (
"fmt"
"strings"
"github.com/kovidgoyal/kitty/tools/tui/loop"
)
var _ = fmt.Print
func (h *Handler) draw_frame(width, height int) {
lp := h.lp
for i := range height {
lp.SaveCursorPosition()
switch i {
case 0:
lp.QueueWriteString("╭")
lp.QueueWriteString(strings.Repeat("─", width-2))
lp.QueueWriteString("╮")
case height - 1:
lp.QueueWriteString("╰")
lp.QueueWriteString(strings.Repeat("─", width-2))
lp.QueueWriteString("╯")
default:
lp.QueueWriteString("│")
lp.MoveCursorHorizontally(width - 2)
lp.QueueWriteString("│")
}
lp.RestoreCursorPosition()
lp.MoveCursorVertically(1)
}
}
func (h *Handler) draw_search_text() {
text := h.state.SearchText()
if text == "" {
h.lp.DrawSizedText(" ", loop.SizedText{Scale: 2})
h.lp.MoveCursorHorizontally(-2)
return
}
}
func (h *Handler) draw_search_bar(y int) (height int, err error) {
left_margin, right_margin := 5, 5
height = 4
h.lp.MoveCursorTo(1+left_margin, 1+y)
available_width := h.screen_size.width - left_margin - right_margin
h.draw_frame(available_width, height)
h.lp.MoveCursorTo(1+left_margin+1, 2+y)
h.draw_search_text()
return
}