diff-edit: Allow negative scroll positions in portals

This commit is contained in:
Andrew Hamilton 2022-01-21 08:59:29 +10:00
parent f9c5399ab9
commit 244dc5897d
2 changed files with 17 additions and 4 deletions

View file

@ -229,12 +229,18 @@ class Portal:
width, height = dimensions
x, y = self.position
try:
appearance = self.widget.appearance_interval((y, y+height))
appearance = self.widget.appearance_interval((max(y, 0), y+height))
except AttributeError:
appearance = self.widget.appearance()[y:y+height]
appearance = self.widget.appearance()[max(y, 0):y+height]
self.last_dimensions = dimensions
return appearance_resize([row[x:x+width] for row in appearance],
dimensions, self.background_char)
top = [self.background_char * width] * -y if y < 0 else []
bottom = appearance_resize([row[max(x, 0):x+width] for row in appearance],
(width + min(x, 0), height + min(y, 0)),
self.background_char)
if x < 0:
padding = self.background_char * -x
bottom = [padding + line for line in bottom]
return top + bottom
class View:

View file

@ -38,6 +38,13 @@ class WidgetTests(unittest.TestCase):
self.assert_string(portal.appearance_for((5, 1)), "oobar")
portal.position = (0, 10)
self.assert_string(portal.appearance_for((1, 1)), " ")
portal.position = (1, 0)
self.assert_string(portal.appearance_for((6, 2)), "oobar \n ")
portal.position = (-1, -1)
self.assert_string(portal.appearance_for((2, 2)), " \n f")
self.assert_string(portal.appearance_for((8, 3)), " \n foobar \n ")
portal.position = (5, 0)
self.assert_string(portal.appearance_for((2, 1)), "r ")
def test_border_widget(self):
contents = fill3.Filler(self.TEXT_A)