mirror of
https://github.com/kovidgoyal/kitty
synced 2026-07-21 07:55:10 +02:00
Implement drawing of titlebar, remembering of mode and fix various bugs in tui
This commit is contained in:
@@ -6,8 +6,11 @@ import sys
|
||||
from functools import lru_cache
|
||||
from gettext import gettext as _
|
||||
|
||||
from kitty.config import cached_values_for
|
||||
from kitty.fast_data_types import wcswidth
|
||||
from kitty.key_encoding import ESCAPE, backspace_key, enter_key
|
||||
from kitty.key_encoding import (
|
||||
ESCAPE, F1, F2, RELEASE, backspace_key, enter_key
|
||||
)
|
||||
|
||||
from ..tui.handler import Handler
|
||||
from ..tui.loop import Loop
|
||||
@@ -15,7 +18,7 @@ from ..tui.operations import (
|
||||
clear_screen, colored, cursor, set_line_wrapping, set_window_title, styled
|
||||
)
|
||||
|
||||
HEX, NAME = 0, 1
|
||||
HEX, NAME = 'HEX', 'NAME'
|
||||
|
||||
|
||||
@lru_cache()
|
||||
@@ -37,19 +40,20 @@ FAINT = 242
|
||||
|
||||
class UnicodeInput(Handler):
|
||||
|
||||
def __init__(self):
|
||||
def __init__(self, cached_values):
|
||||
self.cached_values = cached_values
|
||||
self.current_input = ''
|
||||
self.current_char = None
|
||||
self.prompt_template = '{}> '
|
||||
self.choice_line = ''
|
||||
self.mode = HEX
|
||||
self.mode = globals().get(cached_values.get('mode', 'HEX'), 'HEX')
|
||||
self.update_prompt()
|
||||
|
||||
def update_current_char(self):
|
||||
if self.mode is HEX:
|
||||
try:
|
||||
code = int(self.current_input, 16)
|
||||
if code <= 32 or code == 127 or 128 <= code <= 159:
|
||||
if code <= 32 or code == 127 or 128 <= code <= 159 or 0xd800 <= code <= 0xdbff or 0xDC00 <= code <= 0xDFFF:
|
||||
self.current_char = None
|
||||
else:
|
||||
self.current_char = chr(code)
|
||||
@@ -88,10 +92,26 @@ class UnicodeInput(Handler):
|
||||
self.write(set_window_title(_('Unicode input')))
|
||||
self.draw_screen()
|
||||
|
||||
def draw_title_bar(self):
|
||||
entries = []
|
||||
for name, key, mode in [
|
||||
(_('Code'), 'F1', HEX),
|
||||
(_('Name'), 'F2', NAME),
|
||||
]:
|
||||
entry = ' {} ({}) '.format(name, key)
|
||||
if mode is self.mode:
|
||||
entry = styled(entry, reverse=False, bold=True)
|
||||
entries.append(entry)
|
||||
text = _('Search by:{}').format(' '.join(entries))
|
||||
extra = self.screen_size.cols - wcswidth(text)
|
||||
if extra > 0:
|
||||
text += ' ' * extra
|
||||
self.print(styled(text, reverse=True))
|
||||
|
||||
def draw_screen(self):
|
||||
self.write(clear_screen())
|
||||
self.draw_title_bar()
|
||||
if self.mode is HEX:
|
||||
self.print(styled(_('Press the / key to search by character name'), fg=FAINT, italic=True))
|
||||
self.print(_('Enter the hex code for the character'))
|
||||
else:
|
||||
self.print(_('Enter words from the name of the character'))
|
||||
@@ -108,10 +128,7 @@ class UnicodeInput(Handler):
|
||||
self.draw_screen()
|
||||
|
||||
def on_text(self, text, in_bracketed_paste):
|
||||
if self.mode is HEX and text == '/':
|
||||
self.mode = NAME
|
||||
else:
|
||||
self.current_input += text
|
||||
self.current_input += text
|
||||
self.refresh()
|
||||
|
||||
def on_key(self, key_event):
|
||||
@@ -120,9 +137,22 @@ class UnicodeInput(Handler):
|
||||
self.refresh()
|
||||
elif key_event is enter_key:
|
||||
self.quit_loop(0)
|
||||
else:
|
||||
elif key_event.type is RELEASE:
|
||||
if key_event.key is ESCAPE:
|
||||
self.quit_loop(1)
|
||||
elif key_event.key is F1:
|
||||
self.switch_mode(HEX)
|
||||
elif key_event.key is F2:
|
||||
self.switch_mode(NAME)
|
||||
|
||||
def switch_mode(self, mode):
|
||||
if mode is not self.mode:
|
||||
self.mode = mode
|
||||
self.cached_values['mode'] = mode
|
||||
self.current_input = ''
|
||||
self.current_char = None
|
||||
self.choice_line = ''
|
||||
self.refresh()
|
||||
|
||||
def on_interrupt(self):
|
||||
self.quit_loop(1)
|
||||
@@ -132,13 +162,14 @@ class UnicodeInput(Handler):
|
||||
|
||||
def on_resize(self, new_size):
|
||||
Handler.on_resize(self, new_size)
|
||||
self.draw_screen()
|
||||
self.refresh()
|
||||
|
||||
|
||||
def main(args=sys.argv):
|
||||
loop = Loop()
|
||||
handler = UnicodeInput()
|
||||
loop.loop(handler)
|
||||
with cached_values_for('unicode-input') as cached_values:
|
||||
handler = UnicodeInput(cached_values)
|
||||
loop.loop(handler)
|
||||
if handler.current_char and loop.return_code == 0:
|
||||
print('OK:', hex(ord(handler.current_char))[2:])
|
||||
raise SystemExit(loop.return_code)
|
||||
|
||||
Reference in New Issue
Block a user