123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- 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, 64)
- 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.Itoa(int(self.current_val)))
- }
- return self.handler.draw_screen()
- }
|