Make the filter labels clickable

This commit is contained in:
Kovid Goyal
2025-07-05 11:37:17 +05:30
parent e6e854241d
commit 834d0d3848
3 changed files with 74 additions and 12 deletions

View File

@@ -11,6 +11,12 @@ import (
var _ = fmt.Print
type single_line_region struct {
x, width, y int
id string
callback func(string) error
}
func (h *Handler) draw_footer() (num_lines int, err error) {
lines := []string{}
screen_width := h.screen_size.width
@@ -20,26 +26,41 @@ func (h *Handler) draw_footer() (num_lines int, err error) {
pos := 0
current_style := sctx.SprintFunc("italic fg=green intense")
non_current_style := sctx.SprintFunc("dim")
w := func(text string, sfunc func(...any) string) {
sz := wcswidth.Stringwidth(text)
var crs []single_line_region
w := func(presep, text string, sfunc func(...any) string, click_name string) {
sz := len(presep)
if sz+pos >= screen_width {
lines = append(lines, buf.String())
pos = 0
buf.Reset()
}
buf.WriteString(presep)
pos += sz
sz = wcswidth.Stringwidth(text)
if sfunc != nil {
text = sfunc(text)
}
buf.WriteString(text)
if click_name != "" {
crs = append(crs, single_line_region{x: pos, width: sz, y: len(lines), id: click_name, callback: func(filter string) error {
h.set_filter(filter)
h.state.redraw_needed = true
return nil
}})
}
pos += sz
}
w("󰈲 Filter:", nil)
w("", "󰈲 Filter:", nil, "")
for _, name := range h.state.filter_names {
w(" "+name, utils.IfElse(name == h.state.current_filter, current_style, non_current_style))
w(" ", name, utils.IfElse(name == h.state.current_filter, current_style, non_current_style), name)
}
if s := buf.String(); s != "" {
lines = append(lines, s)
}
offset := h.screen_size.height - len(lines)
for _, cr := range crs {
h.state.mouse_state.AddCellRegion(cr.id, cr.x, cr.y+offset, cr.x+cr.width, cr.y+offset, cr.callback)
}
}
if len(lines) > 0 {
h.lp.MoveCursorTo(1, h.screen_size.height-len(lines)+1)

View File

@@ -13,6 +13,7 @@ import (
"github.com/kovidgoyal/kitty/tools/cli"
"github.com/kovidgoyal/kitty/tools/config"
"github.com/kovidgoyal/kitty/tools/tty"
"github.com/kovidgoyal/kitty/tools/tui"
"github.com/kovidgoyal/kitty/tools/tui/loop"
"github.com/kovidgoyal/kitty/tools/tui/readline"
"github.com/kovidgoyal/kitty/tools/utils"
@@ -116,6 +117,8 @@ type State struct {
selections []string
current_idx CollectionIndex
last_render render_state
mouse_state tui.MouseState
redraw_needed bool
}
func (s State) BaseDir() string { return utils.IfElse(s.base_dir == "", default_cwd, s.base_dir) }
@@ -182,9 +185,11 @@ type Handler struct {
}
func (h *Handler) draw_screen() (err error) {
h.state.redraw_needed = false
h.lp.StartAtomicUpdate()
defer h.lp.EndAtomicUpdate()
h.lp.ClearScreen()
h.state.mouse_state.ClearCellRegions()
switch h.state.screen {
case NORMAL:
matches, is_complete := h.get_results()
@@ -202,6 +207,8 @@ func (h *Handler) draw_screen() (err error) {
case SAVE_FILE:
err = h.draw_save_file_name_screen()
}
h.state.mouse_state.UpdateHoveredIds()
h.state.mouse_state.ApplyHoverStyles(h.lp)
return
}
@@ -402,6 +409,19 @@ func (h *Handler) OnKeyEvent(ev *loop.KeyEvent) (err error) {
return
}
func (h *Handler) OnMouseEvent(event *loop.MouseEvent) (err error) {
h.state.redraw_needed = h.state.mouse_state.UpdateState(event)
if event.Event_type == loop.MOUSE_CLICK && event.Buttons&loop.LEFT_MOUSE_BUTTON != 0 {
if err = h.state.mouse_state.ClickHoveredRegions(); err != nil {
return
}
}
if h.state.redraw_needed {
err = h.draw_screen()
}
return
}
func (h *Handler) OnText(text string, from_key_event, in_bracketed_paste bool) (err error) {
switch h.state.screen {
case NORMAL:
@@ -533,6 +553,7 @@ func main(_ *cli.Command, opts *Options, args []string) (rc int, err error) {
if err != nil {
return 1, err
}
lp.MouseTrackingMode(loop.FULL_MOUSE_TRACKING)
handler := Handler{lp: lp, err_chan: make(chan error, 8), rl: readline.New(lp, readline.RlInit{
Prompt: "> ", ContinuationPrompt: ". ",
})}
@@ -571,6 +592,7 @@ func main(_ *cli.Command, opts *Options, args []string) (rc int, err error) {
}
lp.OnKeyEvent = handler.OnKeyEvent
lp.OnText = handler.OnText
lp.OnMouseEvent = handler.OnMouseEvent
lp.OnWakeup = func() (err error) {
select {
case err = <-handler.err_chan: