partially fix scrolling in files > 2 GB
This commit is contained in:
@@ -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)))
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|||||||
@@ -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():
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
from PyQt6.QtGui import QColor
|
|
||||||
|
|
||||||
print(QColor().colorNames())
|
|
||||||
|
print(min(2290538861, 2342622222))
|
||||||
|
|||||||
Reference in New Issue
Block a user