3535# types
3636Command = commands .Command
3737if False :
38+ from typing import Callable
3839 from .types import Callback , SimpleContextManager , KeySpec , CommandName
40+ CalcScreen = Callable [[], list [str ]]
3941
4042
4143def disp_str (buffer : str ) -> tuple [str , list [int ]]:
@@ -231,9 +233,11 @@ class Reader:
231233 keymap : tuple [tuple [str , str ], ...] = ()
232234 input_trans : input .KeymapTranslator = field (init = False )
233235 input_trans_stack : list [input .KeymapTranslator ] = field (default_factory = list )
236+ screen : list [str ] = field (default_factory = list )
234237 screeninfo : list [tuple [int , list [int ]]] = field (init = False )
235238 cxy : tuple [int , int ] = field (init = False )
236239 lxy : tuple [int , int ] = field (init = False )
240+ calc_screen : CalcScreen = field (init = False )
237241
238242 def __post_init__ (self ) -> None :
239243 # Enable the use of `insert` without a `prepare` call - necessary to
@@ -243,14 +247,36 @@ def __post_init__(self) -> None:
243247 self .input_trans = input .KeymapTranslator (
244248 self .keymap , invalid_cls = "invalid-key" , character_cls = "self-insert"
245249 )
246- self .screeninfo = [(0 , [0 ])]
250+ self .screeninfo = [(0 , [])]
247251 self .cxy = self .pos2xy ()
248252 self .lxy = (self .pos , 0 )
253+ self .calc_screen = self .calc_complete_screen
249254
250255 def collect_keymap (self ) -> tuple [tuple [KeySpec , CommandName ], ...]:
251256 return default_keymap
252257
253- def calc_screen (self ) -> list [str ]:
258+ def append_to_screen (self ) -> list [str ]:
259+ new_screen = self .screen .copy () or ['' ]
260+
261+ new_character = self .buffer [- 1 ]
262+ new_character_len = wlen (new_character )
263+
264+ last_line_len = wlen (new_screen [- 1 ])
265+ if last_line_len + new_character_len >= self .console .width : # We need to wrap here
266+ new_screen [- 1 ] += '\\ '
267+ self .screeninfo [- 1 ][1 ].append (1 )
268+ new_screen .append (self .buffer [- 1 ])
269+ self .screeninfo .append ((0 , [new_character_len ]))
270+ else :
271+ new_screen [- 1 ] += self .buffer [- 1 ]
272+ self .screeninfo [- 1 ][1 ].append (new_character_len )
273+ self .cxy = self .pos2xy ()
274+
275+ # Reset the function that is used for completing the screen
276+ self .calc_screen = self .calc_complete_screen
277+ return new_screen
278+
279+ def calc_complete_screen (self ) -> list [str ]:
254280 """The purpose of this method is to translate changes in
255281 self.buffer into changes in self.screen. Currently it rips
256282 everything down and starts from scratch, which whilst not
@@ -563,8 +589,8 @@ def update_screen(self) -> None:
563589 def refresh (self ) -> None :
564590 """Recalculate and refresh the screen."""
565591 # this call sets up self.cxy, so call it first.
566- screen = self .calc_screen ()
567- self .console .refresh (screen , self .cxy )
592+ self . screen = self .calc_screen ()
593+ self .console .refresh (self . screen , self .cxy )
568594 self .dirty = False
569595
570596 def do_cmd (self , cmd : tuple [str , list [str ]]) -> None :
0 commit comments