From bb99fb2c5899942336de2676d3d7426631ba7b59 Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Sun, 31 Oct 2021 13:53:17 +0100 Subject: [PATCH] partially fix scrolling in files > 2 GB --- ScaledScrollBar.py | 18 ++++++++++++++++++ bigtext.py | 9 +++++---- logFileModel.py | 5 ++--- scribble.py | 4 ++-- 4 files changed, 27 insertions(+), 9 deletions(-) diff --git a/ScaledScrollBar.py b/ScaledScrollBar.py index 89afda4..d747874 100644 --- a/ScaledScrollBar.py +++ b/ScaledScrollBar.py @@ -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))) diff --git a/bigtext.py b/bigtext.py index 9736092..7f124d4 100644 --- a/bigtext.py +++ b/bigtext.py @@ -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) diff --git a/logFileModel.py b/logFileModel.py index 05dbccb..ddfe6e5 100644 --- a/logFileModel.py +++ b/logFileModel.py @@ -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(): diff --git a/scribble.py b/scribble.py index 89965b1..a945520 100644 --- a/scribble.py +++ b/scribble.py @@ -1,3 +1,3 @@ -from PyQt6.QtGui import QColor -print(QColor().colorNames()) + +print(min(2290538861, 2342622222))