add positions of hits to the range slider
This commit is contained in:
@@ -119,6 +119,10 @@ class BigText(QWidget):
|
||||
def get_file(self):
|
||||
return self.model.get_file()
|
||||
|
||||
def update_hit_positions(self, hit_positions: set[float]):
|
||||
if self.range_limit:
|
||||
self.range_limit.update_hit_positions(hit_positions)
|
||||
|
||||
def add_line_click_listener(self, listener: Callable[[int], None]):
|
||||
"""
|
||||
:param listener: a callable, the parameter is the byte offset of the clicked line
|
||||
|
||||
@@ -4,7 +4,7 @@ from enum import Enum
|
||||
import PySide6
|
||||
from PySide6 import QtGui
|
||||
from PySide6.QtCore import QRect, QPoint, Signal
|
||||
from PySide6.QtGui import QPainter, Qt
|
||||
from PySide6.QtGui import QPainter, Qt, QColor, QPen
|
||||
from PySide6.QtWidgets import QWidget
|
||||
|
||||
from src.pluginregistry import PluginRegistry
|
||||
@@ -53,6 +53,7 @@ class RangeSlider(QWidget):
|
||||
self.selected_handle = None
|
||||
self.selection_drag_range = (self.min_value, self.max_value)
|
||||
self.drag_y_offset_in_handle = 0
|
||||
self._hit_positions: set[float] = set(())
|
||||
|
||||
def set_maximum(self, max: int):
|
||||
if self.max_value == max:
|
||||
@@ -65,12 +66,16 @@ class RangeSlider(QWidget):
|
||||
self.upper_value.value = max
|
||||
self._emit_value_changed()
|
||||
|
||||
def update_hit_positions(self, hit_positions: set[float]):
|
||||
# print(f"updated hit positions in range slider:{len(hit_positions)} -> {hit_positions}")
|
||||
self._hit_positions = hit_positions
|
||||
|
||||
def paintEvent(self, event: PySide6.QtGui.QPaintEvent) -> None:
|
||||
painter = QPainter(self)
|
||||
self._draw_background(painter)
|
||||
self._draw_hits(painter)
|
||||
self._draw_handle(painter, self.lower_value)
|
||||
self._draw_handle(painter, self.upper_value, direction=-1)
|
||||
|
||||
painter.end()
|
||||
|
||||
def _draw_background(self, painter: QPainter) -> None:
|
||||
@@ -111,6 +116,25 @@ class RangeSlider(QWidget):
|
||||
pixel = (self.height() - 2 * self._handle_width) * value_percent + self._handle_width
|
||||
return pixel
|
||||
|
||||
def _draw_hits(self, painter: QPainter) -> None:
|
||||
color = to_qcolor("000000")
|
||||
color.setAlpha(192)
|
||||
pen = QPen(color)
|
||||
pen.setWidth(1)
|
||||
painter.setPen(pen)
|
||||
|
||||
# compute where to draw a line and then deduplicate then, so that we don't draw lines multiple times
|
||||
# this is for performance and because we use transparency and drawing a line multiple times would make it
|
||||
# darker
|
||||
paint_at_y_positions: set[int] = set(())
|
||||
for hit_position in self._hit_positions:
|
||||
y = (self.height() - 2 * self._handle_width) * hit_position + self._handle_width
|
||||
y = round(y)
|
||||
paint_at_y_positions.add(y)
|
||||
|
||||
for y in paint_at_y_positions:
|
||||
painter.drawLine(2, y, 18, y)
|
||||
|
||||
def _pixel_to_value(self, pixel: int) -> int:
|
||||
pixel_percent = (pixel - self._handle_width) / (self.height() - 2 * self._handle_width)
|
||||
return int(math.floor(self.max_value * pixel_percent))
|
||||
|
||||
Reference in New Issue
Block a user