def __init__(self, *args, **kargs): self.selection = None dates = args[2] args = (args[0], args[1]) super().__init__(*args, **kargs) self.selection = DataSelection(dates, self.data_tree.data) selected_pen = self.opts.get('selectedPen') if selected_pen is None: selected_pen = QtGui.QPen(Qt.DashLine) selected_pen.setColor(QtGui.QColor(0xffffff)) self.opts['selectedPen'] = selected_pen self.drag_rectangle = QtGui.QGraphicsRectItem() self.drag_rectangle.setPen(selected_pen)
class SelectableScatterPlotItem(TreeScatterPlotItem): def __init__(self, *args, **kargs): self.selection = None dates = args[2] args = (args[0], args[1]) super().__init__(*args, **kargs) self.selection = DataSelection(dates, self.data_tree.data) selected_pen = self.opts.get('selectedPen') if selected_pen is None: selected_pen = QtGui.QPen(Qt.DashLine) selected_pen.setColor(QtGui.QColor(0xffffff)) self.opts['selectedPen'] = selected_pen self.drag_rectangle = QtGui.QGraphicsRectItem() self.drag_rectangle.setPen(selected_pen) def itemChange(self, change, value): value = super().itemChange(change, value) if change == self.ItemSceneChange: if value is not self.scene(): if value is not None: value.addItem(self.drag_rectangle) else: self.scene().removeItem(self.drag_rectangle) return value def clear(self): super().clear() if self.selection is not None: self.selection.clear() self.selection.dataset = None def addPoints(self, *args, **kargs): super().addPoints(*args, **kargs) if self.selection is not None: self.selection.dataset = self.data_tree.data def _setSelectionBrush(self, selected, *p_idxs): if selected: brush = self.opts['selectedPen'].brush() else: brush = self.opts['brush'] for i in p_idxs: self.point(i).setBrush(brush) def mouseClickEvent(self, ev): if ev.button() == Qt.LeftButton: pt_idx = next(iter(self.pointsAt(ev.pos())), None) if pt_idx is not None: pt = self.point(pt_idx) selected = self.selection.flip(pt_idx) self._setSelectionBrush(selected, pt_idx) self.sigClicked.emit(self, (pt,)) ev.accept() return ev.ignore() def mouseDragEvent(self, ev): if ev.button() == Qt.LeftButton: rect_item = self.drag_rectangle if not ev.isFinish(): rect = QRectF(ev.buttonDownScenePos(), ev.scenePos()).normalized() rect_item.setRect(rect) rect_item.show() else: rect_item.hide() rect = QRectF(ev.buttonDownPos(), ev.pos()) selected_points = tuple(self.pointsIn(rect)) select_mode = not (ev.modifiers() & Qt.ShiftModifier) if select_mode: self.selection.update(selected_points) else: self.selection.difference_update(selected_points) self._setSelectionBrush(select_mode, *selected_points) ev.accept() else: ev.ignore()
class SelectableScatterPlotItem(TreeScatterPlotItem): def __init__(self, *args, **kargs): self.selection = None dates = args[2] args = (args[0], args[1]) super().__init__(*args, **kargs) self.selection = DataSelection(dates, self.data_tree.data) selected_pen = self.opts.get('selectedPen') if selected_pen is None: selected_pen = QtGui.QPen(Qt.DashLine) selected_pen.setColor(QtGui.QColor(0xffffff)) self.opts['selectedPen'] = selected_pen self.drag_rectangle = QtGui.QGraphicsRectItem() self.drag_rectangle.setPen(selected_pen) def itemChange(self, change, value): value = super().itemChange(change, value) if change == self.ItemSceneChange: if value is not self.scene(): if value is not None: value.addItem(self.drag_rectangle) else: self.scene().removeItem(self.drag_rectangle) return value def clear(self): super().clear() if self.selection is not None: self.selection.clear() self.selection.dataset = None def addPoints(self, *args, **kargs): super().addPoints(*args, **kargs) if self.selection is not None: self.selection.dataset = self.data_tree.data def _setSelectionBrush(self, selected, *p_idxs): if selected: brush = self.opts['selectedPen'].brush() else: brush = self.opts['brush'] for i in p_idxs: self.point(i).setBrush(brush) def mouseClickEvent(self, ev): if ev.button() == Qt.LeftButton: pt_idx = next(iter(self.pointsAt(ev.pos())), None) if pt_idx is not None: pt = self.point(pt_idx) selected = self.selection.flip(pt_idx) self._setSelectionBrush(selected, pt_idx) self.sigClicked.emit(self, (pt, )) ev.accept() return ev.ignore() def mouseDragEvent(self, ev): if ev.button() == Qt.LeftButton: rect_item = self.drag_rectangle if not ev.isFinish(): rect = QRectF(ev.buttonDownScenePos(), ev.scenePos()).normalized() rect_item.setRect(rect) rect_item.show() else: rect_item.hide() rect = QRectF(ev.buttonDownPos(), ev.pos()) selected_points = tuple(self.pointsIn(rect)) select_mode = not (ev.modifiers() & Qt.ShiftModifier) if select_mode: self.selection.update(selected_points) else: self.selection.difference_update(selected_points) self._setSelectionBrush(select_mode, *selected_points) ev.accept() else: ev.ignore()