mirror of
https://github.com/lowobservable/oec.git
synced 2026-02-27 09:09:56 +00:00
Further simplification and refactoring of display
This commit is contained in:
@@ -88,7 +88,7 @@ class Controller:
|
||||
|
||||
self.logger.info(f'Rows = {rows}, Columns = {columns}, Keymap = {keymap_name}')
|
||||
|
||||
self.terminal.display.clear(include_status_line=True)
|
||||
self.terminal.display.clear(clear_status_line=True)
|
||||
|
||||
# Show the attached indicator on the status line.
|
||||
self.terminal.display.status_line.write_string(0, 'S')
|
||||
|
||||
@@ -170,11 +170,9 @@ class Display:
|
||||
|
||||
self.status_line = StatusLine(self.interface, columns)
|
||||
|
||||
def move_cursor(self, address=None, index=None, row=None, column=None,
|
||||
force_load=False):
|
||||
def move_cursor(self, row, column, force_load=False):
|
||||
"""Load the address counter."""
|
||||
if address is None:
|
||||
address = self._calculate_address(index=index, row=row, column=column)
|
||||
address = self._calculate_address(row=row, column=column)
|
||||
|
||||
# TODO: Verify that the address is within range - exclude status line.
|
||||
|
||||
@@ -187,12 +185,8 @@ class Display:
|
||||
|
||||
return True
|
||||
|
||||
def write_buffer(self, byte, index=None, row=None, column=None):
|
||||
if index is None:
|
||||
if row is not None and column is not None:
|
||||
index = self._get_index(row, column)
|
||||
else:
|
||||
raise ValueError('Either index or row and column is required')
|
||||
def buffered_write(self, byte, row, column):
|
||||
index = self._get_index(row, column)
|
||||
|
||||
# TODO: Verify that index is within range.
|
||||
|
||||
@@ -209,11 +203,11 @@ class Display:
|
||||
for (start_index, end_index) in self._get_dirty_ranges():
|
||||
self._flush_range(start_index, end_index)
|
||||
|
||||
def clear(self, include_status_line=False):
|
||||
def clear(self, clear_status_line=False):
|
||||
"""Clear the screen."""
|
||||
(rows, columns) = self.dimensions
|
||||
|
||||
if include_status_line:
|
||||
if clear_status_line:
|
||||
address = 0
|
||||
repeat = ((rows + 1) * columns) - 1
|
||||
else:
|
||||
@@ -228,7 +222,7 @@ class Display:
|
||||
|
||||
self.dirty.clear()
|
||||
|
||||
self.move_cursor(index=0, force_load=True)
|
||||
self.move_cursor(0, 0, force_load=True)
|
||||
|
||||
def _get_index(self, row, column):
|
||||
return (row * self.dimensions.columns) + column
|
||||
|
||||
@@ -99,7 +99,7 @@ class VT100Session(Session):
|
||||
self.terminal.display.status_line.write_string(45, 'VT100')
|
||||
|
||||
# Reset the cursor.
|
||||
self.terminal.display.move_cursor(row=0, column=0)
|
||||
self.terminal.display.move_cursor(0, 0)
|
||||
|
||||
def terminate(self):
|
||||
if self.host_process:
|
||||
@@ -195,7 +195,7 @@ class VT100Session(Session):
|
||||
# TODO: Add additional mapping for special cases such as '^'...
|
||||
byte = encode_ascii_character(ord(character.data)) if len(character.data) == 1 else 0x00
|
||||
|
||||
self.terminal.display.write_buffer(byte, row=row, column=column)
|
||||
self.terminal.display.buffered_write(byte, row, column)
|
||||
|
||||
def _flush(self):
|
||||
self.terminal.display.flush()
|
||||
@@ -204,4 +204,4 @@ class VT100Session(Session):
|
||||
# reliable - maybe it needs to be forced sometimes.
|
||||
cursor = self.vt100_screen.cursor
|
||||
|
||||
self.terminal.display.move_cursor(row=cursor.y, column=cursor.x)
|
||||
self.terminal.display.move_cursor(cursor.y, cursor.x)
|
||||
|
||||
@@ -13,27 +13,9 @@ class DisplayMoveCursorTestCase(unittest.TestCase):
|
||||
|
||||
self.display = Display(self.interface, dimensions)
|
||||
|
||||
def test_with_address(self):
|
||||
def test(self):
|
||||
# Act
|
||||
self.display.move_cursor(address=80)
|
||||
|
||||
# Assert
|
||||
self.assertEqual(self.display.address_counter, 80)
|
||||
|
||||
self.interface.offload_load_address_counter.assert_called_with(80)
|
||||
|
||||
def test_with_index(self):
|
||||
# Act
|
||||
self.display.move_cursor(index=15)
|
||||
|
||||
# Assert
|
||||
self.assertEqual(self.display.address_counter, 95)
|
||||
|
||||
self.interface.offload_load_address_counter.assert_called_with(95)
|
||||
|
||||
def test_with_coordinates(self):
|
||||
# Act
|
||||
self.display.move_cursor(row=10, column=15)
|
||||
self.display.move_cursor(10, 15)
|
||||
|
||||
# Assert
|
||||
self.assertEqual(self.display.address_counter, 895)
|
||||
@@ -42,12 +24,12 @@ class DisplayMoveCursorTestCase(unittest.TestCase):
|
||||
|
||||
def test_no_change(self):
|
||||
# Arrange
|
||||
self.display.move_cursor(address=80)
|
||||
self.display.move_cursor(0, 0)
|
||||
|
||||
self.interface.offload_load_address_counter.reset_mock()
|
||||
|
||||
# Act
|
||||
self.display.move_cursor(address=80)
|
||||
self.display.move_cursor(0, 0)
|
||||
|
||||
# Assert
|
||||
self.assertEqual(self.display.address_counter, 80)
|
||||
@@ -56,19 +38,19 @@ class DisplayMoveCursorTestCase(unittest.TestCase):
|
||||
|
||||
def test_no_change_force(self):
|
||||
# Arrange
|
||||
self.display.move_cursor(address=80)
|
||||
self.display.move_cursor(0, 0)
|
||||
|
||||
self.interface.offload_load_address_counter.reset_mock()
|
||||
|
||||
# Act
|
||||
self.display.move_cursor(address=80, force_load=True)
|
||||
self.display.move_cursor(0, 0, force_load=True)
|
||||
|
||||
# Assert
|
||||
self.assertEqual(self.display.address_counter, 80)
|
||||
|
||||
self.interface.offload_load_address_counter.assert_called_with(80)
|
||||
|
||||
class DisplayWriteBufferTestCase(unittest.TestCase):
|
||||
class DisplayBufferedWriteTestCase(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.interface = Mock()
|
||||
|
||||
@@ -76,20 +58,10 @@ class DisplayWriteBufferTestCase(unittest.TestCase):
|
||||
|
||||
self.display = Display(self.interface, dimensions)
|
||||
|
||||
def test_with_index(self):
|
||||
def test(self):
|
||||
# Act
|
||||
self.display.write_buffer(0x01, index=15)
|
||||
self.display.write_buffer(0x02, index=97)
|
||||
|
||||
# Assert
|
||||
self.assertEqual(self.display.buffer[15], 0x01)
|
||||
self.assertEqual(self.display.buffer[97], 0x02)
|
||||
self.assertSequenceEqual(self.display.dirty, [15, 97])
|
||||
|
||||
def test_with_coordinates(self):
|
||||
# Act
|
||||
self.display.write_buffer(0x01, row=0, column=15)
|
||||
self.display.write_buffer(0x02, row=1, column=17)
|
||||
self.display.buffered_write(0x01, 0, 15)
|
||||
self.display.buffered_write(0x02, 1, 17)
|
||||
|
||||
# Assert
|
||||
self.assertEqual(self.display.buffer[15], 0x01)
|
||||
@@ -97,15 +69,15 @@ class DisplayWriteBufferTestCase(unittest.TestCase):
|
||||
self.assertSequenceEqual(self.display.dirty, [15, 97])
|
||||
|
||||
def test_change(self):
|
||||
self.assertTrue(self.display.write_buffer(0x01, index=0))
|
||||
self.assertTrue(self.display.write_buffer(0x02, index=0))
|
||||
self.assertTrue(self.display.buffered_write(0x01, 0, 0))
|
||||
self.assertTrue(self.display.buffered_write(0x02, 0, 0))
|
||||
|
||||
self.assertEqual(self.display.buffer[0], 0x02)
|
||||
self.assertSequenceEqual(self.display.dirty, [0])
|
||||
|
||||
def test_no_change(self):
|
||||
self.assertTrue(self.display.write_buffer(0x01, index=0))
|
||||
self.assertFalse(self.display.write_buffer(0x01, index=0))
|
||||
self.assertTrue(self.display.buffered_write(0x01, 0, 0))
|
||||
self.assertFalse(self.display.buffered_write(0x01, 0, 0))
|
||||
|
||||
self.assertEqual(self.display.buffer[0], 0x01)
|
||||
self.assertSequenceEqual(self.display.dirty, [0])
|
||||
@@ -129,9 +101,9 @@ class DisplayFlushTestCase(unittest.TestCase):
|
||||
|
||||
def test_single_range(self):
|
||||
# Arrange
|
||||
self.display.write_buffer(0x01, index=0)
|
||||
self.display.write_buffer(0x02, index=1)
|
||||
self.display.write_buffer(0x03, index=2)
|
||||
self.display.buffered_write(0x01, 0, 0)
|
||||
self.display.buffered_write(0x02, 0, 1)
|
||||
self.display.buffered_write(0x03, 0, 2)
|
||||
|
||||
# Act
|
||||
self.display.flush()
|
||||
@@ -141,12 +113,12 @@ class DisplayFlushTestCase(unittest.TestCase):
|
||||
|
||||
def test_multiple_ranges(self):
|
||||
# Arrange
|
||||
self.display.write_buffer(0x01, index=0)
|
||||
self.display.write_buffer(0x02, index=1)
|
||||
self.display.write_buffer(0x03, index=2)
|
||||
self.display.write_buffer(0x05, index=30)
|
||||
self.display.write_buffer(0x06, index=31)
|
||||
self.display.write_buffer(0x04, index=20)
|
||||
self.display.buffered_write(0x01, 0, 0)
|
||||
self.display.buffered_write(0x02, 0, 1)
|
||||
self.display.buffered_write(0x03, 0, 2)
|
||||
self.display.buffered_write(0x05, 0, 30)
|
||||
self.display.buffered_write(0x06, 0, 31)
|
||||
self.display.buffered_write(0x04, 0, 20)
|
||||
|
||||
# Act
|
||||
self.display.flush()
|
||||
@@ -164,13 +136,13 @@ class DisplayClearTestCase(unittest.TestCase):
|
||||
|
||||
def test_excluding_status_line(self):
|
||||
# Arrange
|
||||
self.display.write_buffer(0x01, index=0)
|
||||
self.display.buffered_write(0x01, 0, 0)
|
||||
|
||||
self.assertEqual(self.display.buffer[0], 0x01)
|
||||
self.assertTrue(self.display.dirty)
|
||||
|
||||
# Act
|
||||
self.display.clear(include_status_line=False)
|
||||
self.display.clear(clear_status_line=False)
|
||||
|
||||
# Assert
|
||||
self.interface.offload_write.assert_called_with(b'\x00', address=80, repeat=1919)
|
||||
@@ -181,13 +153,13 @@ class DisplayClearTestCase(unittest.TestCase):
|
||||
|
||||
def test_including_status_line(self):
|
||||
# Arrange
|
||||
self.display.write_buffer(0x01, index=0)
|
||||
self.display.buffered_write(0x01, 0, 0)
|
||||
|
||||
self.assertEqual(self.display.buffer[0], 0x01)
|
||||
self.assertTrue(self.display.dirty)
|
||||
|
||||
# Act
|
||||
self.display.clear(include_status_line=True)
|
||||
self.display.clear(clear_status_line=True)
|
||||
|
||||
# Assert
|
||||
self.interface.offload_write.assert_called_with(b'\x00', address=0, repeat=1999)
|
||||
@@ -206,11 +178,11 @@ class DisplayFlushRangeTestCase(unittest.TestCase):
|
||||
|
||||
def test_when_start_address_is_current_address_counter(self):
|
||||
# Arrange
|
||||
self.display.move_cursor(index=0)
|
||||
self.display.move_cursor(0, 0)
|
||||
|
||||
self.display.write_buffer(0x01, index=0)
|
||||
self.display.write_buffer(0x02, index=1)
|
||||
self.display.write_buffer(0x03, index=2)
|
||||
self.display.buffered_write(0x01, 0, 0)
|
||||
self.display.buffered_write(0x02, 0, 1)
|
||||
self.display.buffered_write(0x03, 0, 2)
|
||||
|
||||
# Act
|
||||
self.display.flush()
|
||||
@@ -223,11 +195,11 @@ class DisplayFlushRangeTestCase(unittest.TestCase):
|
||||
|
||||
def test_when_start_address_is_not_current_address_counter(self):
|
||||
# Arrange
|
||||
self.display.move_cursor(index=70)
|
||||
self.display.move_cursor(0, 70)
|
||||
|
||||
self.display.write_buffer(0x01, index=0)
|
||||
self.display.write_buffer(0x02, index=1)
|
||||
self.display.write_buffer(0x03, index=2)
|
||||
self.display.buffered_write(0x01, 0, 0)
|
||||
self.display.buffered_write(0x02, 0, 1)
|
||||
self.display.buffered_write(0x03, 0, 2)
|
||||
|
||||
# Act
|
||||
self.display.flush()
|
||||
|
||||
Reference in New Issue
Block a user