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 __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()