77import sys
88from abc import ABCMeta , abstractmethod
99from collections .abc import Callable
10+ from curses .ascii import isprint
1011from curses .textpad import Textbox
1112from types import FrameType , TracebackType
1213from typing import TYPE_CHECKING , Literal , override
@@ -317,7 +318,7 @@ def __init__(
317318 self ._edit_height = edit_height
318319 self .x_start = x_start
319320 self .y_start = y_start
320- self .process_key = process_key
321+ self ._process_key_cb = process_key
321322 self ._frame = frame
322323 self ._alignment = alignment
323324 self ._hide_input = hide_input
@@ -390,7 +391,7 @@ def edit(self, default_text: str | None = None) -> None:
390391 self ._textbox = Textbox (self ._edit_win )
391392 self ._main_win .refresh ()
392393
393- self ._textbox .edit (self .process_key ) # type: ignore[arg-type]
394+ self ._textbox .edit (self ._process_key_cb ) # type: ignore[arg-type]
394395
395396
396397class Viewport (AbstractViewport ):
@@ -500,7 +501,10 @@ def __init__(
500501 self ._help_vp : Viewport | None = None
501502 self ._header_vp : Viewport | None = None
502503 self ._input_vp : EditViewport | None = None
503- self ._error_vp : Viewport | None = None
504+ self ._info_vp : Viewport | None = None
505+
506+ self ._set_default_info = True
507+ self ._only_ascii_text = ViewportEntry (str (_ ('Only ASCII characters are supported' )), 0 , 0 , STYLE .NORMAL )
504508
505509 self ._init_viewports ()
506510
@@ -532,7 +536,7 @@ def _init_viewports(self) -> None:
532536 )
533537
534538 y_offset += 3
535- self ._error_vp = Viewport (self ._max_width , 1 , 0 , y_offset , alignment = self ._alignment )
539+ self ._info_vp = Viewport (self ._max_width , 1 , 0 , y_offset , alignment = self ._alignment )
536540
537541 def input (self ) -> Result :
538542 result = Tui .run (self )
@@ -553,12 +557,12 @@ def _clear_all(self) -> None:
553557 self ._header_vp .erase ()
554558 if self ._input_vp :
555559 self ._input_vp .erase ()
556- if self ._error_vp :
557- self ._error_vp .erase ()
560+ if self ._info_vp :
561+ self ._info_vp .erase ()
558562
559563 def _get_input_text (self ) -> str | None :
560564 assert self ._input_vp
561- assert self ._error_vp
565+ assert self ._info_vp
562566
563567 text = self ._real_input
564568
@@ -568,7 +572,8 @@ def _get_input_text(self) -> str | None:
568572 if (err := self ._validator (text )) is not None :
569573 self .clear_all ()
570574 entry = ViewportEntry (err , 0 , 0 , STYLE .ERROR )
571- self ._error_vp .update ([entry ], 0 )
575+ self ._info_vp .update ([entry ], 0 )
576+ self ._set_default_info = False
572577 self ._real_input = ''
573578 return None
574579
@@ -583,6 +588,10 @@ def _draw(self) -> None:
583588
584589 if self ._input_vp :
585590 self ._input_vp .update ()
591+
592+ if self ._set_default_info and self ._info_vp :
593+ self ._info_vp .update ([self ._only_ascii_text ], 0 )
594+
586595 self ._input_vp .edit (default_text = self ._default_text )
587596
588597 @override
@@ -648,14 +657,16 @@ def _process_edit_key(self, key: int) -> int | None:
648657 if len (self ._real_input ) > 0 :
649658 self ._real_input = self ._real_input [:- 1 ]
650659 case _:
660+ if isprint (key ):
661+ self ._real_input += chr (key )
662+ if self ._hide_input :
663+ key = 42
664+ else :
665+ try :
666+ if isprint (key ):
651667 self ._real_input += chr (key )
652668 if self ._hide_input :
653669 key = 42
654- else :
655- try :
656- self ._real_input += chr (key )
657- if self ._hide_input :
658- key = 42
659670 except Exception :
660671 pass
661672
0 commit comments