From b8433306fae5e5d93574806c45b0e28401ee9f9d Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Sat, 17 Dec 2022 18:04:42 +0100 Subject: [PATCH] update min/max for scaledScrollbar has some issues when scrolling to the end --- src/ui/ScaledScrollBar.py | 32 +++++++------------------------- src/ui/bigtext/bigtext.py | 18 ++++++++++++------ 2 files changed, 19 insertions(+), 31 deletions(-) diff --git a/src/ui/ScaledScrollBar.py b/src/ui/ScaledScrollBar.py index 48cddff..44aaaba 100644 --- a/src/ui/ScaledScrollBar.py +++ b/src/ui/ScaledScrollBar.py @@ -10,9 +10,6 @@ log = logging.getLogger("scaledScrollBar") class ScaledScrollBar(QScrollBar): is_huge = False - _range_start = 0; - _range_end = -1 - scaledValueChanged = Signal(str) """Signal emitted when the scroll bar value changes. **Note**: The value is a string and must be parsed into an int. @@ -29,32 +26,12 @@ class ScaledScrollBar(QScrollBar): self.real_maximum = self.maximum() super().valueChanged.connect(self._valueChanged) - def set_range(self, range_start: int, range_end: int): - old_range_start = self._range_start - self._range_start = range_start - self._range_end = range_end - new_max = range_end - range_start - old_value = self._real_value() - new_value = old_value - range_start - self.setMaximum(new_max) - self.setValue(new_value) - print(f"old_value: {old_value} new_value {new_value}") - def setValue(self, value: int) -> None: if self.is_huge: real_position = value / self.real_maximum super().setValue(round(self.maximum() * real_position)) else: - super().setValue(value - self._range_start) - - def _real_value(self): - value = self.value() - if self.is_huge: - real_value = self._range_start + (value / self.maximum()) * self.real_maximum - # print("scaled value changed: %d -> %d (%f)" % (value, real_value, value / self.maximum())) - return int(real_value) - else: - return int(self._range_start + value) + super().setValue(value) def setMaximum(self, maximum: int) -> None: if maximum > 2 ** 31: @@ -73,4 +50,9 @@ class ScaledScrollBar(QScrollBar): def _valueChanged(self, value: int): self.scrolled_to_end.emit(value == self.maximum() and value > 0) - self.scaledValueChanged.emit(str(self._real_value())) + 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.scaledValueChanged.emit(str(int(real_value))) + else: + self.scaledValueChanged.emit(str(int(value))) diff --git a/src/ui/bigtext/bigtext.py b/src/ui/bigtext/bigtext.py index 1973670..b5d5416 100644 --- a/src/ui/bigtext/bigtext.py +++ b/src/ui/bigtext/bigtext.py @@ -73,7 +73,9 @@ class BigText(QWidget): self.grid.setVerticalSpacing(0) self.setLayout(self.grid) - self.big_text = InnerBigText(self, model) + self.v_scroll_bar = ScaledScrollBar() + + self.big_text = InnerBigText(self, model, self.v_scroll_bar) self.big_text.setSizePolicy(QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding)) self.h_scroll_bar = QScrollBar(Qt.Orientation.Horizontal) @@ -81,7 +83,6 @@ class BigText(QWidget): self.h_scroll_bar.setMaximum(1) self.h_scroll_bar.valueChanged.connect(self.big_text.h_scroll_event) - self.v_scroll_bar = ScaledScrollBar() # self.v_scroll_bar.setPageStep(1) self.v_scroll_bar.scaledValueChanged.connect(self.big_text.v_scroll_event) self.v_scroll_bar.scrolled_to_end.connect(self.big_text.v_scroll_update_follow_tail) @@ -104,7 +105,6 @@ class BigText(QWidget): range_start = int(byte_count * (lower_value / 100.0)) range_end = int(byte_count * (upper_value / 100.0)) print(f"-> {lower_value}, {upper_value}, {range_start}, {range_end}") - self.v_scroll_bar.set_range(range_start, range_end) self.big_text.set_range(range_start, range_end) def get_file(self): @@ -138,11 +138,12 @@ class InnerBigText(QWidget): _range_start = 0 _range_end = -1 - def __init__(self, parent: BigText, model: LogFileModel): + def __init__(self, parent: BigText, model: LogFileModel, v_scaled_scrollbar: ScaledScrollBar): super(InnerBigText, self).__init__() self.char_height = None self.char_width = None self.model = model + self._v_scaled_scrollbar = v_scaled_scrollbar self.parent = parent self.setFocusPolicy(Qt.FocusPolicy.StrongFocus) self.setFocusPolicy(Qt.FocusPolicy.WheelFocus) @@ -161,13 +162,17 @@ class InnerBigText(QWidget): "", is_regex=False, ignore_case=True, - hit_background_color="d7efffc0") # same blue as the selection hightlight, but with lower saturation + hit_background_color="d7efffc0") # same blue as the selection highlight, but with lower saturation self.line_click_listeners: [Callable[[int], None]] = [] def set_range(self, range_start: int, range_end: int): self._range_start = range_start self._range_end = range_end + + self._v_scaled_scrollbar.setMinimum(max(0, self._range_start)) + self._v_scaled_scrollbar.setMaximum(min(self._v_scaled_scrollbar.maximum(), range_end)) + self._set_byte_offset(self._byte_offset) def _set_byte_offset(self, byte_offset: int): @@ -465,7 +470,8 @@ class InnerBigText(QWidget): 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) + vmax = self.model.byte_count() - 1 if self._range_end < 0 else min(self._range_end, self.model.byte_count() - 1) + self.parent.v_scroll_bar.setMaximum(vmax) for line in self.lines: self.update_longest_line(len(line.line()))