update min/max for scaledScrollbar

has some issues when scrolling to the end
This commit is contained in:
2022-12-17 18:04:42 +01:00
parent ed94d7bc67
commit b8433306fa
2 changed files with 19 additions and 31 deletions

View File

@@ -10,9 +10,6 @@ log = logging.getLogger("scaledScrollBar")
class ScaledScrollBar(QScrollBar): class ScaledScrollBar(QScrollBar):
is_huge = False is_huge = False
_range_start = 0;
_range_end = -1
scaledValueChanged = Signal(str) scaledValueChanged = Signal(str)
"""Signal emitted when the scroll bar value changes. """Signal emitted when the scroll bar value changes.
**Note**: The value is a string and must be parsed into an int. **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() self.real_maximum = self.maximum()
super().valueChanged.connect(self._valueChanged) 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: def setValue(self, value: int) -> None:
if self.is_huge: if self.is_huge:
real_position = value / self.real_maximum real_position = value / self.real_maximum
super().setValue(round(self.maximum() * real_position)) super().setValue(round(self.maximum() * real_position))
else: else:
super().setValue(value - self._range_start) super().setValue(value)
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)
def setMaximum(self, maximum: int) -> None: def setMaximum(self, maximum: int) -> None:
if maximum > 2 ** 31: if maximum > 2 ** 31:
@@ -73,4 +50,9 @@ class ScaledScrollBar(QScrollBar):
def _valueChanged(self, value: int): def _valueChanged(self, value: int):
self.scrolled_to_end.emit(value == self.maximum() and value > 0) 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)))

View File

@@ -73,7 +73,9 @@ class BigText(QWidget):
self.grid.setVerticalSpacing(0) self.grid.setVerticalSpacing(0)
self.setLayout(self.grid) 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.big_text.setSizePolicy(QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding))
self.h_scroll_bar = QScrollBar(Qt.Orientation.Horizontal) 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.setMaximum(1)
self.h_scroll_bar.valueChanged.connect(self.big_text.h_scroll_event) 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.setPageStep(1)
self.v_scroll_bar.scaledValueChanged.connect(self.big_text.v_scroll_event) 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) 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_start = int(byte_count * (lower_value / 100.0))
range_end = int(byte_count * (upper_value / 100.0)) range_end = int(byte_count * (upper_value / 100.0))
print(f"-> {lower_value}, {upper_value}, {range_start}, {range_end}") 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) self.big_text.set_range(range_start, range_end)
def get_file(self): def get_file(self):
@@ -138,11 +138,12 @@ class InnerBigText(QWidget):
_range_start = 0 _range_start = 0
_range_end = -1 _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__() super(InnerBigText, self).__init__()
self.char_height = None self.char_height = None
self.char_width = None self.char_width = None
self.model = model self.model = model
self._v_scaled_scrollbar = v_scaled_scrollbar
self.parent = parent self.parent = parent
self.setFocusPolicy(Qt.FocusPolicy.StrongFocus) self.setFocusPolicy(Qt.FocusPolicy.StrongFocus)
self.setFocusPolicy(Qt.FocusPolicy.WheelFocus) self.setFocusPolicy(Qt.FocusPolicy.WheelFocus)
@@ -161,13 +162,17 @@ class InnerBigText(QWidget):
"", "",
is_regex=False, is_regex=False,
ignore_case=True, 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]] = [] self.line_click_listeners: [Callable[[int], None]] = []
def set_range(self, range_start: int, range_end: int): def set_range(self, range_start: int, range_end: int):
self._range_start = range_start self._range_start = range_start
self._range_end = range_end 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) self._set_byte_offset(self._byte_offset)
def _set_byte_offset(self, byte_offset: int): 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 self._byte_offset = self.lines[0].byte_offset() if len(self.lines) > 0 else 0
# print("new byte offset: ", self._byte_offset) # 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) 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: for line in self.lines:
self.update_longest_line(len(line.line())) self.update_longest_line(len(line.line()))