partially fix scrolling in files > 2 GB
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
import math
|
||||
|
||||
from PyQt6.QtWidgets import QScrollBar
|
||||
from PyQt6.QtCore import pyqtSignal
|
||||
import logging
|
||||
|
||||
log = logging.getLogger("scaledScrollBar")
|
||||
@@ -9,9 +10,18 @@ log = logging.getLogger("scaledScrollBar")
|
||||
class ScaledScrollBar(QScrollBar):
|
||||
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):
|
||||
super(ScaledScrollBar, self).__init__()
|
||||
self.real_maximum = self.maximum()
|
||||
super().valueChanged.connect(self._valueChanged)
|
||||
|
||||
def setValue(self, value: int) -> None:
|
||||
if self.is_huge:
|
||||
@@ -34,3 +44,11 @@ class ScaledScrollBar(QScrollBar):
|
||||
else:
|
||||
self.is_huge = False
|
||||
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)))
|
||||
|
||||
@@ -84,7 +84,7 @@ class BigText(QWidget):
|
||||
self.h_scroll_bar.valueChanged.connect(big_text.h_scroll_event)
|
||||
|
||||
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.grid.addWidget(big_text, 0, 0)
|
||||
@@ -185,8 +185,8 @@ class InnerBigText(QWidget):
|
||||
# print("left_offset: %d" % left_offset)
|
||||
self.update()
|
||||
|
||||
def v_scroll_event(self, byte_offset: int):
|
||||
self._byte_offset = byte_offset
|
||||
def v_scroll_event(self, byte_offset: str):
|
||||
self._byte_offset = int(byte_offset)
|
||||
self.update()
|
||||
|
||||
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))
|
||||
|
||||
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._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
|
||||
self.parent.v_scroll_bar.setMaximum(self.model.byte_count() - 1)
|
||||
|
||||
|
||||
@@ -57,7 +57,7 @@ class LogFileModel:
|
||||
return bytes.decode("utf8", errors="ignore")
|
||||
|
||||
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:
|
||||
offset = start_byte
|
||||
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
|
||||
with open(self._file, 'rb') as f:
|
||||
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())
|
||||
|
||||
# print("offset: %s" % (offset))
|
||||
|
||||
eof_reached = True
|
||||
f.seek(offset)
|
||||
while l := f.readline():
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
from PyQt6.QtGui import QColor
|
||||
|
||||
print(QColor().colorNames())
|
||||
|
||||
print(min(2290538861, 2342622222))
|
||||
|
||||
Reference in New Issue
Block a user