partially fix scrolling in files > 2 GB

This commit is contained in:
2021-10-31 13:53:17 +01:00
parent 79f9219e9a
commit bb99fb2c58
4 changed files with 27 additions and 9 deletions

View File

@@ -1,6 +1,7 @@
import math import math
from PyQt6.QtWidgets import QScrollBar from PyQt6.QtWidgets import QScrollBar
from PyQt6.QtCore import pyqtSignal
import logging import logging
log = logging.getLogger("scaledScrollBar") log = logging.getLogger("scaledScrollBar")
@@ -9,9 +10,18 @@ log = logging.getLogger("scaledScrollBar")
class ScaledScrollBar(QScrollBar): class ScaledScrollBar(QScrollBar):
is_huge = False is_huge = False
valueChanged = pyqtSignal(str)
"""Signal emitted when the scroll bar value changes.
**Note**: The value is a string and must be parsed into an int.
QT's signal api only supports 32bit integers. Ints larger
than 2**32-1 will overflow. Probably because there is some C/C++
code involved. We work around this by converting the python int
into a string."""
def __init__(self): def __init__(self):
super(ScaledScrollBar, self).__init__() super(ScaledScrollBar, self).__init__()
self.real_maximum = self.maximum() self.real_maximum = self.maximum()
super().valueChanged.connect(self._valueChanged)
def setValue(self, value: int) -> None: def setValue(self, value: int) -> None:
if self.is_huge: if self.is_huge:
@@ -34,3 +44,11 @@ class ScaledScrollBar(QScrollBar):
else: else:
self.is_huge = False self.is_huge = False
super().setMaximum(maximum) super().setMaximum(maximum)
def _valueChanged(self, value: int):
if self.is_huge:
real_value = (value / self.maximum()) * self.real_maximum
# print("scaled value changed: %d -> %d (%f)" % (value, real_value, value / self.maximum()))
self.valueChanged.emit(str(int(real_value)))
else:
self.valueChanged.emit(str(int(value)))

View File

@@ -84,7 +84,7 @@ class BigText(QWidget):
self.h_scroll_bar.valueChanged.connect(big_text.h_scroll_event) self.h_scroll_bar.valueChanged.connect(big_text.h_scroll_event)
self.v_scroll_bar = ScaledScrollBar() self.v_scroll_bar = ScaledScrollBar()
self.v_scroll_bar.setPageStep(1) # self.v_scroll_bar.setPageStep(1)
self.v_scroll_bar.valueChanged.connect(big_text.v_scroll_event) self.v_scroll_bar.valueChanged.connect(big_text.v_scroll_event)
self.grid.addWidget(big_text, 0, 0) self.grid.addWidget(big_text, 0, 0)
@@ -185,8 +185,8 @@ class InnerBigText(QWidget):
# print("left_offset: %d" % left_offset) # print("left_offset: %d" % left_offset)
self.update() self.update()
def v_scroll_event(self, byte_offset: int): def v_scroll_event(self, byte_offset: str):
self._byte_offset = byte_offset self._byte_offset = int(byte_offset)
self.update() self.update()
def update_longest_line(self, length: int): def update_longest_line(self, length: int):
@@ -271,9 +271,10 @@ class InnerBigText(QWidget):
# print("%s / %s = %s" %(self.height(), float(self.char_height), lines_to_show)) # print("%s / %s = %s" %(self.height(), float(self.char_height), lines_to_show))
self.lines = self.model.data(self._byte_offset, self.scroll_lines, lines_to_show) self.lines = self.model.data(self._byte_offset, self.scroll_lines, lines_to_show)
# print("lines_to_show: %d returned: %d" % (lines_to_show, len(self.lines))) #print("lines_to_show: %d returned: %d" % (lines_to_show, len(self.lines)))
self.scroll_lines = 0 self.scroll_lines = 0
self._byte_offset = self.lines[0].byte_offset() if len(self.lines) > 0 else 0 self._byte_offset = self.lines[0].byte_offset() if len(self.lines) > 0 else 0
# print("new byte offset: ", self._byte_offset)
# document length == maximum + pageStep + aFewBytesSoThatTheLastLineIsShown # document length == maximum + pageStep + aFewBytesSoThatTheLastLineIsShown
self.parent.v_scroll_bar.setMaximum(self.model.byte_count() - 1) self.parent.v_scroll_bar.setMaximum(self.model.byte_count() - 1)

View File

@@ -57,7 +57,7 @@ class LogFileModel:
return bytes.decode("utf8", errors="ignore") return bytes.decode("utf8", errors="ignore")
def write_range(self, start_byte: int, end_byte: int, file: str): def write_range(self, start_byte: int, end_byte: int, file: str):
print("write range: %d - %d -> %s" % (start_byte, end_byte, file)) # print("write range: %d - %d -> %s" % (start_byte, end_byte, file))
with self._lock, open(self._file, 'rb') as source, open(file, "w+b") as target: with self._lock, open(self._file, 'rb') as source, open(file, "w+b") as target:
offset = start_byte offset = start_byte
source.seek(offset) source.seek(offset)
@@ -82,10 +82,9 @@ class LogFileModel:
# TODO abort file open after a few secons: https://docs.python.org/3/library/signal.html#example # TODO abort file open after a few secons: https://docs.python.org/3/library/signal.html#example
with open(self._file, 'rb') as f: with open(self._file, 'rb') as f:
offset = min(byte_offset, self.byte_count()) offset = min(byte_offset, self.byte_count())
#print("offset: %s byte_count: %d" % (offset, self.byte_count()))
offset = max(0, offset - self.settings.max_line_length()) offset = max(0, offset - self.settings.max_line_length())
# print("offset: %s" % (offset))
eof_reached = True eof_reached = True
f.seek(offset) f.seek(offset)
while l := f.readline(): while l := f.readline():

View File

@@ -1,3 +1,3 @@
from PyQt6.QtGui import QColor
print(QColor().colorNames())
print(min(2290538861, 2342622222))