Files
kitty/kittens/choose_fonts/index_feature.go
2025-04-20 22:13:45 +05:30

149 lines
4.3 KiB
Go

package choose_fonts
import (
"fmt"
"strconv"
"strings"
"kitty/tools/tui"
"kitty/tools/tui/loop"
"kitty/tools/tui/readline"
"kitty/tools/utils"
)
var _ = fmt.Print
type if_panel struct {
handler *handler
rl *readline.Readline
family, which, feat_tag string
settings faces_settings
feature_data FeatureData
current_val uint
}
func (self *if_panel) render_lines(start_y int, lines ...string) (y int) {
sz, _ := self.handler.lp.ScreenSize()
_, y, str := self.handler.render_lines.InRectangle(lines, 0, start_y, int(sz.WidthCells), int(sz.HeightCells)-y, &self.handler.mouse_state, self.on_click)
self.handler.lp.QueueWriteString(str)
return
}
func (self *if_panel) draw_screen() (err error) {
lp := self.handler.lp
feat_name := utils.IfElse(self.feature_data.Name == "", self.feat_tag, self.feature_data.Name)
lp.QueueWriteString(self.handler.format_title("Edit "+feat_name, 0))
lines := []string{
fmt.Sprintf("Enter a value for the '%s' feature of the %s font. Values are non-negative integers. Leaving it blank will cause the feature value to be not set, i.e. take its default value.", feat_name, self.family),
}
if self.feature_data.Tooltip != "" {
lines = append(lines, "")
lines = append(lines, self.feature_data.Tooltip)
}
if len(self.feature_data.Params) > 0 {
lines = append(lines, "")
lines = append(lines, "You can also click on any of the feature names below to choose the corresponding value.")
} else {
lines = append(lines, "")
lines = append(lines, "Consult the documentation for this font to find out what values are valid for this feature.")
}
lines = append(lines, "")
cursor_y := self.render_lines(2, lines...)
if len(self.feature_data.Params) > 0 {
lp.MoveCursorTo(1, cursor_y+3)
num := 1
strings.Join(utils.Map(func(x string) string {
ans := tui.InternalHyperlink(x, fmt.Sprintf("fval:%d", num))
num++
return ans
}, self.feature_data.Params), ", ")
}
lp.MoveCursorTo(1, cursor_y+1)
lp.ClearToEndOfLine()
self.rl.RedrawNonAtomic()
lp.SetCursorVisible(true)
return
}
func (self *if_panel) initialize(h *handler) (err error) {
self.handler = h
self.rl = readline.New(h.lp, readline.RlInit{DontMarkPrompts: true, Prompt: "Value: "})
return
}
func (self *if_panel) on_wakeup() error {
return self.handler.draw_screen()
}
func (self *if_panel) on_click(id string) (err error) {
scheme, val, _ := strings.Cut(id, ":")
if scheme != "fval" {
return
}
v, _ := strconv.ParseUint(val, 10, 0)
if err = self.handler.face_pane.change_feature_value(self.feat_tag, uint(v), false); err != nil {
return err
}
self.handler.current_pane = &self.handler.face_pane
return self.handler.draw_screen()
}
func (self *if_panel) on_key_event(event *loop.KeyEvent) (err error) {
if event.MatchesPressOrRepeat("esc") {
event.Handled = true
self.handler.current_pane = &self.handler.face_pane
return self.handler.draw_screen()
}
if event.MatchesPressOrRepeat("enter") {
event.Handled = true
text := strings.TrimSpace(self.rl.AllText())
remove := false
var val uint64
if text == "" {
remove = true
} else {
val, err = strconv.ParseUint(text, 10, 0)
}
if err != nil {
self.rl.ResetText()
self.handler.lp.Beep()
} else {
if err = self.handler.face_pane.change_feature_value(self.feat_tag, uint(val), remove); err != nil {
return err
}
self.handler.current_pane = &self.handler.face_pane
}
return self.handler.draw_screen()
}
if err = self.rl.OnKeyEvent(event); err != nil {
if err == readline.ErrAcceptInput {
return nil
}
return err
}
return self.draw_screen()
}
func (self *if_panel) on_text(text string, from_key_event bool, in_bracketed_paste bool) (err error) {
if err = self.rl.OnText(text, from_key_event, in_bracketed_paste); err != nil {
return err
}
return self.draw_screen()
}
func (self *if_panel) on_enter(family, which string, settings faces_settings, feat_tag string, fd FeatureData, current_val uint) error {
self.family = family
self.feat_tag = feat_tag
self.settings = settings
self.which = which
self.handler.current_pane = self
self.feature_data = fd
self.current_val = current_val
self.rl.ResetText()
if self.current_val > 0 {
self.rl.SetText(strconv.FormatUint(uint64(self.current_val), 10))
}
return self.handler.draw_screen()
}