35
35
# types
36
36
Command = commands .Command
37
37
if False :
38
+ from typing import Callable
38
39
from .types import Callback , SimpleContextManager , KeySpec , CommandName
40
+ CalcScreen = Callable [[], list [str ]]
39
41
40
42
41
43
def disp_str (buffer : str ) -> tuple [str , list [int ]]:
@@ -231,9 +233,11 @@ class Reader:
231
233
keymap : tuple [tuple [str , str ], ...] = ()
232
234
input_trans : input .KeymapTranslator = field (init = False )
233
235
input_trans_stack : list [input .KeymapTranslator ] = field (default_factory = list )
236
+ screen : list [str ] = field (default_factory = list )
234
237
screeninfo : list [tuple [int , list [int ]]] = field (init = False )
235
238
cxy : tuple [int , int ] = field (init = False )
236
239
lxy : tuple [int , int ] = field (init = False )
240
+ calc_screen : CalcScreen = field (init = False )
237
241
238
242
def __post_init__ (self ) -> None :
239
243
# Enable the use of `insert` without a `prepare` call - necessary to
@@ -243,14 +247,36 @@ def __post_init__(self) -> None:
243
247
self .input_trans = input .KeymapTranslator (
244
248
self .keymap , invalid_cls = "invalid-key" , character_cls = "self-insert"
245
249
)
246
- self .screeninfo = [(0 , [0 ])]
250
+ self .screeninfo = [(0 , [])]
247
251
self .cxy = self .pos2xy ()
248
252
self .lxy = (self .pos , 0 )
253
+ self .calc_screen = self .calc_complete_screen
249
254
250
255
def collect_keymap (self ) -> tuple [tuple [KeySpec , CommandName ], ...]:
251
256
return default_keymap
252
257
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 ]:
254
280
"""The purpose of this method is to translate changes in
255
281
self.buffer into changes in self.screen. Currently it rips
256
282
everything down and starts from scratch, which whilst not
@@ -563,8 +589,8 @@ def update_screen(self) -> None:
563
589
def refresh (self ) -> None :
564
590
"""Recalculate and refresh the screen."""
565
591
# 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 )
568
594
self .dirty = False
569
595
570
596
def do_cmd (self , cmd : tuple [str , list [str ]]) -> None :
0 commit comments