handle tabs correctly when highlighting text
With the old solution I replaced tabs with four spaces and then did some calculations to get the correct byte positions for a coordinate. With the new solution (using FontMetric.horizontalAdvance) this is not necessary anymore and we can use tha native tab. But I cannot change the tab width. It is always 8 characters. You can set tabStopDistance on horizontalAdvance(), but not on elided_text() and I did not find a way to use it while rendering text.
This commit is contained in:
@@ -15,7 +15,7 @@ class Line:
|
|||||||
self._cache_char_to_column()
|
self._cache_char_to_column()
|
||||||
|
|
||||||
def get_width_in_px(self, font_metric: QFontMetrics):
|
def get_width_in_px(self, font_metric: QFontMetrics):
|
||||||
return font_metric.horizontalAdvance(self._line)
|
return font_metric.horizontalAdvance(self.line_prepared_for_display())
|
||||||
|
|
||||||
def byte_offset(self) -> int:
|
def byte_offset(self) -> int:
|
||||||
return self._byte_offset
|
return self._byte_offset
|
||||||
@@ -43,7 +43,8 @@ class Line:
|
|||||||
return len(prefix_chars)
|
return len(prefix_chars)
|
||||||
|
|
||||||
def line_prepared_for_display(self) -> str:
|
def line_prepared_for_display(self) -> str:
|
||||||
line = self._line_tabs_replaced()
|
# line = self._line_tabs_replaced()
|
||||||
|
line = self._line
|
||||||
line = self._replace_control_chars_with_pictures(line)
|
line = self._replace_control_chars_with_pictures(line)
|
||||||
return line
|
return line
|
||||||
|
|
||||||
@@ -108,7 +109,7 @@ class Line:
|
|||||||
if not result in self._column_to_char_cache:
|
if not result in self._column_to_char_cache:
|
||||||
self._column_to_char_cache[result] = i
|
self._column_to_char_cache[result] = i
|
||||||
current_char = self._line[i]
|
current_char = self._line[i]
|
||||||
if current_char == "\t":
|
if False and current_char == "\t":
|
||||||
result = result + constants.tab_width - result % constants.tab_width
|
result = result + constants.tab_width - result % constants.tab_width
|
||||||
else:
|
else:
|
||||||
result = result + 1
|
result = result + 1
|
||||||
|
|||||||
@@ -78,20 +78,6 @@ class MyTestCase(unittest.TestCase):
|
|||||||
self.assertEqual(2, line.char_to_column(4)) # z̈
|
self.assertEqual(2, line.char_to_column(4)) # z̈
|
||||||
self.assertEqual(2, line.char_to_column(5)) # z̈
|
self.assertEqual(2, line.char_to_column(5)) # z̈
|
||||||
|
|
||||||
def test_line_tabs_replaced(self):
|
|
||||||
byte_offset = 123
|
|
||||||
text = "\ta\tb" # will be rendered as: ....abc where . represents a whitespace column
|
|
||||||
expected = " a b"
|
|
||||||
line = Line(byte_offset=byte_offset, byte_end=byte_offset + len(text.encode("utf8")), line=text)
|
|
||||||
self.assertEqual(expected, line.line_prepared_for_display())
|
|
||||||
|
|
||||||
def test_line_tabs_replaced_performance(self):
|
|
||||||
byte_offset = 123
|
|
||||||
text = "a\t" * 10000
|
|
||||||
expected = "a " * 10000
|
|
||||||
line = Line(byte_offset=byte_offset, byte_end=byte_offset + len(text.encode("utf8")), line=text)
|
|
||||||
self.assertEqual(expected, line.line_prepared_for_display())
|
|
||||||
|
|
||||||
def test_byte_index_to_char_index(self):
|
def test_byte_index_to_char_index(self):
|
||||||
byte_offset = 123
|
byte_offset = 123
|
||||||
text = "x\u0308y\u0308z\u0308\t\u0308a"
|
text = "x\u0308y\u0308z\u0308\t\u0308a"
|
||||||
|
|||||||
Reference in New Issue
Block a user