mirror of
https://github.com/kovidgoyal/kitty
synced 2026-07-15 04:54:14 +02:00
Make the filter labels clickable
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user