simplified ScaledScrollbar to (hopefully) fix the issue that the scrollbar became invalid for huge files when used in tandem with the range slider

This commit is contained in:
2024-03-23 17:31:28 +01:00
parent c63537f84c
commit ff3d3ddc27
2 changed files with 29 additions and 30 deletions

View File

@@ -1,5 +1,3 @@
import math
from PySide6.QtWidgets import QScrollBar
from PySide6.QtCore import Signal
import logging
@@ -21,38 +19,39 @@ class ScaledScrollBar(QScrollBar):
scrolled_to_end = Signal(bool)
"""Signal emitted when the scroll bar value is set."""
real_minimum = 0
real_maximum = 1
def __init__(self):
super(ScaledScrollBar, self).__init__()
self.real_maximum = self.maximum()
super().setMinimum(0)
super().setMaximum(10000)
super().valueChanged.connect(self._valueChanged)
def setMinimum(self, minimum: int) -> None:
self.real_minimum = minimum
if self._get_real_value() < minimum:
self.setValue(minimum)
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)
position_in_percent = (value - self.real_minimum) / self.real_maximum
# print(f"set value {value} position_in_percent {position_in_percent}")
super().setValue(round(self.maximum() * position_in_percent))
def setMaximum(self, maximum: int) -> None:
if maximum > 2 ** 31:
new_maximum = 1000 * math.log2(maximum)
super().setMaximum(math.ceil(new_maximum))
self.real_maximum = maximum
if self._get_real_value() > maximum:
# print(f"setValue because it was greater than max - old value {self._get_real_value()} new value: {maximum}")
self.setValue(maximum)
if not self.is_huge:
old_position = self.value() / self.maximum()
self.setValue(round(new_maximum * old_position))
self.is_huge = True
else:
self.is_huge = False
super().setMaximum(maximum)
def _get_real_value(self) -> int:
return (self.value() / self.maximum()) * (self.real_maximum - self.real_minimum) + self.real_minimum
def _valueChanged(self, value: int):
self.scrolled_to_end.emit(value == self.maximum() and value > 0)
if self.is_huge:
real_value = (value / self.maximum()) * self.real_maximum
self.scrolled_to_end.emit(
value == self.maximum() and value > 0) # TOOD remove this event. I will do the 'follow tail' feature with a dedicated button like Webstorm
real_value = self._get_real_value()
# print("scaled value changed: %d -> %d (%f)" % (value, real_value, value / self.maximum()))
# print(f"min: {self.minimum()} value: {value} max: {self.maximum()} - real_value: {str(int(real_value))} real_max: {self.real_maximum}")
self.scaledValueChanged.emit(str(int(real_value)))
else:
self.scaledValueChanged.emit(str(int(value)))

View File

@@ -116,7 +116,7 @@ class BigText(QWidget):
byte_count = self.model.byte_count()
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}")
print(f"-> {lower_value}, {upper_value}, {range_start}, {range_end} -- range limit event")
self.big_text.set_range(range_start, range_end)
def get_file(self):
@@ -184,8 +184,8 @@ class InnerBigText(QWidget):
self.model.setRange(range_start, 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._v_scaled_scrollbar.setMinimum(range_start)
self._v_scaled_scrollbar.setMaximum(range_end)
self._set_byte_offset(self._byte_offset)