class LinePlotViewBox(ViewBox): def __init__(self, graph, enable_menu=False): ViewBox.__init__(self, enableMenu=enable_menu) self.graph = graph self.setMouseMode(self.PanMode) pen = mkPen(LinePlotStyle.SELECTION_LINE_COLOR, width=LinePlotStyle.SELECTION_LINE_WIDTH) self.selection_line = QGraphicsLineItem() self.selection_line.setPen(pen) self.selection_line.setZValue(1e9) self.addItem(self.selection_line, ignoreBounds=True) def update_selection_line(self, button_down_pos, current_pos): p1 = self.childGroup.mapFromParent(button_down_pos) p2 = self.childGroup.mapFromParent(current_pos) self.selection_line.setLine(QLineF(p1, p2)) self.selection_line.resetTransform() self.selection_line.show() def mouseDragEvent(self, event, axis=None): if self.graph.state == SELECT and axis is None: event.accept() if event.button() == Qt.LeftButton: self.update_selection_line(event.buttonDownPos(), event.pos()) if event.isFinish(): self.selection_line.hide() p1 = self.childGroup.mapFromParent( event.buttonDownPos(event.button())) p2 = self.childGroup.mapFromParent(event.pos()) self.graph.select_by_line(p1, p2) else: self.update_selection_line( event.buttonDownPos(), event.pos()) elif self.graph.state == ZOOMING or self.graph.state == PANNING: event.ignore() super().mouseDragEvent(event, axis=axis) else: event.ignore() def mouseClickEvent(self, event): if event.button() == Qt.RightButton: self.autoRange() else: event.accept() self.graph.deselect_all()
class LinePlotViewBox(ViewBox): selection_changed = Signal(np.ndarray) def __init__(self): super().__init__(enableMenu=False) self._profile_items = None self._can_select = True self._graph_state = SELECT self.setMouseMode(self.PanMode) pen = mkPen(LinePlotStyle.SELECTION_LINE_COLOR, width=LinePlotStyle.SELECTION_LINE_WIDTH) self.selection_line = QGraphicsLineItem() self.selection_line.setPen(pen) self.selection_line.setZValue(1e9) self.addItem(self.selection_line, ignoreBounds=True) def update_selection_line(self, button_down_pos, current_pos): p1 = self.childGroup.mapFromParent(button_down_pos) p2 = self.childGroup.mapFromParent(current_pos) self.selection_line.setLine(QLineF(p1, p2)) self.selection_line.resetTransform() self.selection_line.show() def set_graph_state(self, state): self._graph_state = state def enable_selection(self, enable): self._can_select = enable def get_selected(self, p1, p2): if self._profile_items is None: return np.array(False) return line_intersects_profiles(np.array([p1.x(), p1.y()]), np.array([p2.x(), p2.y()]), self._profile_items) def add_profiles(self, y): if sp.issparse(y): y = y.todense() self._profile_items = np.array( [np.vstack((np.full((1, y.shape[0]), i + 1), y[:, i].flatten())).T for i in range(y.shape[1])]) def remove_profiles(self): self._profile_items = None def mouseDragEvent(self, ev, axis=None): if self._graph_state == SELECT and axis is None and self._can_select: ev.accept() if ev.button() == Qt.LeftButton: self.update_selection_line(ev.buttonDownPos(), ev.pos()) if ev.isFinish(): self.selection_line.hide() p1 = self.childGroup.mapFromParent( ev.buttonDownPos(ev.button())) p2 = self.childGroup.mapFromParent(ev.pos()) self.selection_changed.emit(self.get_selected(p1, p2)) elif self._graph_state == ZOOMING or self._graph_state == PANNING: ev.ignore() super().mouseDragEvent(ev, axis=axis) else: ev.ignore() def mouseClickEvent(self, ev): if ev.button() == Qt.RightButton: self.autoRange() self.enableAutoRange() else: ev.accept() self.selection_changed.emit(np.array(False)) def reset(self): self._profile_items = None self._can_select = True self._graph_state = SELECT
class LinePlotViewBox(ViewBox): selection_changed = Signal(np.ndarray) def __init__(self): super().__init__(enableMenu=False) self._profile_items = None self._can_select = True self._graph_state = SELECT self.setMouseMode(self.PanMode) pen = mkPen(LinePlotStyle.SELECTION_LINE_COLOR, width=LinePlotStyle.SELECTION_LINE_WIDTH) self.selection_line = QGraphicsLineItem() self.selection_line.setPen(pen) self.selection_line.setZValue(1e9) self.addItem(self.selection_line, ignoreBounds=True) def update_selection_line(self, button_down_pos, current_pos): p1 = self.childGroup.mapFromParent(button_down_pos) p2 = self.childGroup.mapFromParent(current_pos) self.selection_line.setLine(QLineF(p1, p2)) self.selection_line.resetTransform() self.selection_line.show() def set_graph_state(self, state): self._graph_state = state def enable_selection(self, enable): self._can_select = enable def get_selected(self, p1, p2): if self._profile_items is None: return np.array(False) return line_intersects_profiles(np.array([p1.x(), p1.y()]), np.array([p2.x(), p2.y()]), self._profile_items) def add_profiles(self, y): if sp.issparse(y): y = y.todense() self._profile_items = np.array( [np.vstack((np.full((1, y.shape[0]), i + 1), y[:, i].flatten())).T for i in range(y.shape[1])]) def remove_profiles(self): self._profile_items = None def mouseDragEvent(self, event, axis=None): if self._graph_state == SELECT and axis is None and self._can_select: event.accept() if event.button() == Qt.LeftButton: self.update_selection_line(event.buttonDownPos(), event.pos()) if event.isFinish(): self.selection_line.hide() p1 = self.childGroup.mapFromParent( event.buttonDownPos(event.button())) p2 = self.childGroup.mapFromParent(event.pos()) self.selection_changed.emit(self.get_selected(p1, p2)) elif self._graph_state == ZOOMING or self._graph_state == PANNING: event.ignore() super().mouseDragEvent(event, axis=axis) else: event.ignore() def mouseClickEvent(self, event): if event.button() == Qt.RightButton: self.autoRange() self.enableAutoRange() else: event.accept() self.selection_changed.emit(np.array(False)) def reset(self): self._profile_items = None self._can_select = True self._graph_state = SELECT