compute between bytes and chars to get correct clipboard copy

This commit is contained in:
2021-10-25 17:52:14 +02:00
parent b8eb62a3bf
commit 7002e91a35
4 changed files with 28 additions and 12 deletions

View File

@@ -168,8 +168,8 @@ class InnerBigText(QWidget):
column_in_line = self.x_pos_to_column(e.pos().x()) + self._left_offset column_in_line = self.x_pos_to_column(e.pos().x()) + self._left_offset
char_in_line = min(column_in_line, line.length()) char_in_line = min(column_in_line, line.length())
# print("%s in line %s" % (char_in_line, line_number)) # print("%s in line %s" % (char_in_line, line_number))
byte_in_line = line.char_index_to_byte(char_in_line)
current_byte = line.byte_offset() + char_in_line current_byte = line.byte_offset() + byte_in_line
# print("%s + %s = %s" % (line.byte_offset(), char_in_line, current_byte)) # print("%s + %s = %s" % (line.byte_offset(), char_in_line, current_byte))
else: else:
current_byte = self.model.byte_count() current_byte = self.model.byte_count()

View File

@@ -8,7 +8,7 @@
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa| aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa|
...............................| ...............................|
| |
äääääääääääääääääääääääääääääää| ääääääääääääää|ääääääääääääääää|
2019-08-07 00:00:10,391 [catalina-exec-40] INFO c.r.c.u.l.PerformancePointcut - Executed HealthCheckController.checkOperativeness in 1 ms successful. [jv3fw7r2.m1u5] 2019-08-07 00:00:10,391 [catalina-exec-40] INFO c.r.c.u.l.PerformancePointcut - Executed HealthCheckController.checkOperativeness in 1 ms successful. [jv3fw7r2.m1u5]
2019-08-07 00:00:16,377 [catalina-exec-56] INFO c.r.c.u.l.PerformancePointcut - Executed HealthCheckController.checkOperativeness in 1 ms successful. [jv3fw7r2.m1u6] 2019-08-07 00:00:16,377 [catalina-exec-56] INFO c.r.c.u.l.PerformancePointcut - Executed HealthCheckController.checkOperativeness in 1 ms successful. [jv3fw7r2.m1u6]
2019-08-07 00:00:40,403 [catalina-exec-26] INFO c.r.c.u.l.PerformancePointcut - Executed HealthCheckController.checkOperativeness in 1 ms successful. [jv3fw7r2.m1ud] 2019-08-07 00:00:40,403 [catalina-exec-26] INFO c.r.c.u.l.PerformancePointcut - Executed HealthCheckController.checkOperativeness in 1 ms successful. [jv3fw7r2.m1ud]

View File

@@ -26,15 +26,23 @@ class HighlightSelection(Highlight):
if line.intersects(begin, end): if line.intersects(begin, end):
if line.includes_byte(begin): if line.includes_byte(begin):
start = begin - line.byte_offset() start_byte_in_line = begin - line.byte_offset()
else: else:
start = 0 start_byte_in_line = 0
if line.includes_byte(end): if line.includes_byte(end):
length = end - line.byte_offset() - start length_in_bytes = end - line.byte_offset() - start_byte_in_line
else: else:
length = Settings.max_line_length() - start # renders the highlighting to the end of the line
# this is how selections usually behave
length_in_bytes = Settings.max_line_length() - start_byte_in_line
return [HighlightedRange(start, length, brush=QBrush(QColor(156, 215, 255)), pen=Qt.PenStyle.NoPen)] start_char = line.byte_index_to_char_index(start_byte_in_line)
end_char = line.byte_index_to_char_index(start_byte_in_line+length_in_bytes)
length_in_chars = end_char - start_char
#print("selected: %s" % (line.substr(start_char, length_in_chars)))
return [HighlightedRange(start_char, length_in_chars, brush=QBrush(QColor(156, 215, 255)), pen=Qt.PenStyle.NoPen)]
else: else:
return None return None

16
line.py
View File

@@ -4,18 +4,26 @@ class Line:
self._byte_end = byte_end self._byte_end = byte_end
self._line = line self._line = line
def byte_offset(self): def byte_offset(self) -> int:
return self._byte_offset return self._byte_offset
def byte_end(self): def byte_end(self) -> int:
return self._byte_end return self._byte_end
def line(self): def line(self) -> str:
return self._line return self._line
def length(self): def length(self) -> int:
return len(self._line) return len(self._line)
def char_index_to_byte(self, char_in_line: int) -> int:
return len(self.prefix(char_in_line).encode("utf8"))
def byte_index_to_char_index(self, byte_index: int) -> int:
prefix_bytes = self._line.encode("utf8")[:byte_index]
prefix_chars = prefix_bytes.decode("utf8", errors="ignore")
return len(prefix_chars)
def includes_byte(self, byte: int) -> bool: def includes_byte(self, byte: int) -> bool:
return self._byte_offset <= byte <= self._byte_end return self._byte_offset <= byte <= self._byte_end