add context menu actions to set range start and end
This commit is contained in:
@@ -7,8 +7,10 @@ from PySide6.QtCore import QRect, QPoint, Signal
|
||||
from PySide6.QtGui import QPainter, Qt
|
||||
from PySide6.QtWidgets import QWidget
|
||||
|
||||
from src.pluginregistry import PluginRegistry
|
||||
from src.util import conversion
|
||||
from src.util.color import to_qcolor
|
||||
|
||||
from src.i18n import _
|
||||
|
||||
class RangeSliderHandle():
|
||||
def __init__(self, value: int):
|
||||
@@ -27,7 +29,13 @@ class UpdateStyle(Enum):
|
||||
|
||||
|
||||
class RangeSlider(QWidget):
|
||||
value_changed = Signal(float, float)
|
||||
value_changed = Signal(str, str)
|
||||
"""Signal emitted when the range slider 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."""
|
||||
|
||||
_width = 20
|
||||
_handle_width = 12
|
||||
@@ -42,11 +50,22 @@ class RangeSlider(QWidget):
|
||||
self.max_value = 100
|
||||
|
||||
self.lower_value = RangeSliderHandle(0)
|
||||
self.upper_value = RangeSliderHandle(100)
|
||||
self.upper_value = RangeSliderHandle(self.max_value)
|
||||
|
||||
self.selected_handle = None
|
||||
self.selection_drag_range = (self.min_value, self.max_value)
|
||||
|
||||
def set_maximum(self, max: int):
|
||||
if self.max_value == max:
|
||||
return
|
||||
was_at_max = self.upper_value.value == self.max_value
|
||||
|
||||
self.max_value = max
|
||||
|
||||
if was_at_max:
|
||||
self.upper_value.value = max
|
||||
self._emit_value_changed()
|
||||
|
||||
def paintEvent(self, event: PySide6.QtGui.QPaintEvent) -> None:
|
||||
painter = QPainter(self)
|
||||
self._draw_background(painter)
|
||||
@@ -104,13 +123,13 @@ class RangeSlider(QWidget):
|
||||
painter.drawEllipse(QPoint(self._width / 2, y_pixel), self._handle_width / 2 - 1, self._handle_width / 2 - 1)
|
||||
|
||||
def _value_to_pixel(self, value: int) -> int:
|
||||
value_percent = value / (self.max_value - self.min_value)
|
||||
value_percent = value / self.max_value
|
||||
pixel = (self.height() - 2 * self._handle_width) * value_percent + self._handle_width
|
||||
return pixel
|
||||
|
||||
def _pixel_to_value(self, pixel: int) -> int:
|
||||
pixel_percent = (pixel - self._handle_width) / (self.height() - 2 * self._handle_width)
|
||||
return (self.max_value - self.min_value) * pixel_percent
|
||||
return int(math.floor(self.max_value * pixel_percent))
|
||||
|
||||
def _is_on_handle(self, handle: RangeSliderHandle, y_pixel: int, direction=1) -> bool:
|
||||
handle_y_pixel = self._value_to_pixel(handle.value)
|
||||
@@ -139,5 +158,28 @@ class RangeSlider(QWidget):
|
||||
if self.selection_drag_range[0] <= value <= self.selection_drag_range[1]:
|
||||
self.selected_handle.value = value
|
||||
# print("%s, %s" %(self.lower_value.value, self.upper_value.value))
|
||||
self.value_changed.emit(self.lower_value.value, self.upper_value.value)
|
||||
self._emit_value_changed()
|
||||
self.update()
|
||||
self._update_tooltip()
|
||||
|
||||
def set_range_start(self, value: int):
|
||||
self.lower_value.value = value
|
||||
self._emit_value_changed()
|
||||
self.update()
|
||||
|
||||
def set_range_end(self, value: int):
|
||||
self.upper_value.value = value
|
||||
self._emit_value_changed()
|
||||
self.update()
|
||||
|
||||
def _emit_value_changed(self):
|
||||
# print(f"emit {str(self.lower_value.value)}, {str(self.upper_value.value)}")
|
||||
self.value_changed.emit(str(self.lower_value.value), str(self.upper_value.value))
|
||||
|
||||
def _update_tooltip(self):
|
||||
text = _("showing bytes {0} to {1} ({2})").format(
|
||||
self.lower_value.value,
|
||||
self.upper_value.value,
|
||||
conversion.humanbytes(self.upper_value.value - self.lower_value.value))
|
||||
PluginRegistry.execute("update_status_bar", text)
|
||||
self.setToolTip(text)
|
||||
|
||||
Reference in New Issue
Block a user