def __init__(self):
        super(HistogramWidget, self).__init__()
        self.setFrameShadow(QFrame.Plain)
        self.setFrameShape(QFrame.NoFrame)
        self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.setRenderHint(QPainter.Antialiasing)

        self._leftAxeMode = HistogramWidget.AxeClear
        self._bottomAxeMode = HistogramWidget.AxeClear

        self._histogram = None
        self._margin = QMargins(0, 0, 0, 0)
        self._backgroundItem = BackgroundItem()
        self._gridItem = GridItem()
        self._histogramItem = HistogramItem()

        self._items = [
            self._backgroundItem, self._gridItem, self._histogramItem
        ]
        zValue = 0
        self._scene = QGraphicsScene(self)
        for item in self._items:
            self._scene.addItem(item)
            item.setZValue(zValue)
            zValue += 100
        self.setScene(self._scene)
	def __init__(self):
		super(HistogramWidget, self).__init__()
		self.setFrameShadow(QFrame.Plain)
		self.setFrameShape(QFrame.NoFrame)
		self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
		self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
		self.setRenderHint(QPainter.Antialiasing)

		self._leftAxeMode = HistogramWidget.AxeClear
		self._bottomAxeMode = HistogramWidget.AxeClear

		self._histogram = None
		self._margin = QMargins(0, 0, 0, 0)
		self._backgroundItem = BackgroundItem()
		self._gridItem = GridItem()
		self._histogramItem = HistogramItem()

		self._items = [self._backgroundItem, self._gridItem, self._histogramItem]
		zValue = 0
		self._scene = QGraphicsScene(self)
		for item in self._items:
			self._scene.addItem(item)
			item.setZValue(zValue)
			zValue += 100
		self.setScene(self._scene)
class HistogramWidget(QGraphicsView):
    """
	HistogramWidget
	"""
    AxeClear = "HAC"
    AxeNormal = "HAD"
    AxePercentage = "HAP"
    AxeLog = "HAL"

    def __init__(self):
        super(HistogramWidget, self).__init__()
        self.setFrameShadow(QFrame.Plain)
        self.setFrameShape(QFrame.NoFrame)
        self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.setRenderHint(QPainter.Antialiasing)

        self._leftAxeMode = HistogramWidget.AxeClear
        self._bottomAxeMode = HistogramWidget.AxeClear

        self._histogram = None
        self._margin = QMargins(0, 0, 0, 0)
        self._backgroundItem = BackgroundItem()
        self._gridItem = GridItem()
        self._histogramItem = HistogramItem()

        self._items = [
            self._backgroundItem, self._gridItem, self._histogramItem
        ]
        zValue = 0
        self._scene = QGraphicsScene(self)
        for item in self._items:
            self._scene.addItem(item)
            item.setZValue(zValue)
            zValue += 100
        self.setScene(self._scene)

    def setAxeMode(self, left=None, bottom=None):
        if left:
            self._leftAxeMode = left
            if self._leftAxeMode == self.AxeLog:
                self._histogramItem.functionType = HistogramItem.TypeLog
            else:
                self._histogramItem.functionType = HistogramItem.TypeNormal
            self._histogramItem.update()
        if bottom:
            self._bottomAxeMode = bottom
        self._updateAxis()
        self.updateScene()

    def setHistogram(self, histogram):
        self._histogram = histogram
        self._histogramItem.setHistogram(histogram)
        self._updateAxis()

    def addItem(self, item):
        self._scene.addItem(item)
        self._items.append(item)
        self.update()

    def resizeEvent(self, resizeEv):
        """
		Overrides QGraphicsView.resizeEvent()
		"""
        super(HistogramWidget, self).resizeEvent(resizeEv)
        self.updateScene()

    def wheelEvent(self, wheelEv):
        """
		Overrides QGraphicsView.wheelEvent()
		Make sure nothing happens when the user scrolls over this widget.
		"""
        wheelEv.ignore()

    @Slot()
    def updateScene(self):
        """
		The QGraphicsScene.changed() will automatically be linked to
		this slot. If this slot is missing, then PySide will crash on
		close where it is unable to disconnect this slot...
		Overrides QGraphicsView.updateScene()
		"""
        self.update()

    def update(self):
        """
		Overrides QGraphicsView.update()
		"""
        rect = self.rect()

        if len(self._gridItem._itemsLeft) > 0 and len(
                self._gridItem._itemsBottom) > 0:
            # left, top, right, bottom
            self._margin = QMargins(30, 9, 9, 30)
        elif len(self._gridItem._itemsLeft) > 0:
            self._margin = QMargins(30, 9, 9, 9)
        elif len(self._gridItem._itemsBottom) > 0:
            self._margin = QMargins(9, 9, 9, 30)
        else:
            self._margin = QMargins(9, 9, 9, 9)

        for item in self._items:
            item.setRect(rect)
            if hasattr(item, "setMargins"):
                item.setMargins(self._margin)

        self._histogramItem.update()

    def _updateAxis(self):
        leftAxis = []
        bottomAxis = []

        if self._leftAxeMode is HistogramWidget.AxeClear:
            pass
        elif self._leftAxeMode is HistogramWidget.AxeNormal:
            if self._histogramItem.functionType == HistogramItem.TypeLog:
                positions = []
                maxY = self._histogramItem.func(self._histogram.maxY)
                lala = int(round(maxY) + 1)
                for i in range(lala):
                    positions.append(float(i / float(maxY)))
                    val = self._histogramItem.invfunc(i)
                    text = "%.0f" % val
                    leftAxis.append(text)
                self._gridItem.setLeftGridPositions(positions)
            else:
                minY = self._histogram.minY
                maxY = self._histogram.maxY
                rangeY = maxY - minY
                markerCount = 11
                chunk = rangeY / float(markerCount - 1)
                for i in range(markerCount):
                    val = minY + i * chunk
                    text = "%.1f" % val
                    leftAxis.append(text)
        elif self._leftAxeMode is HistogramWidget.AxePercentage:
            for i in range(11):
                leftAxis.append(str(i * 10) + "%")

        if self._bottomAxeMode is HistogramWidget.AxeClear:
            pass
        elif self._bottomAxeMode is HistogramWidget.AxeNormal:
            rangeX = self._histogram.maxX - self._histogram.minX
            binCount = len(self._histogram.bins)
            markerCount = min(binCount, 11)
            chunk = rangeX / (markerCount - 1)
            for i in range(binCount):
                if i % chunk == 0 or i == binCount - 1:
                    bottomAxis.append(str(int(self._histogram.minX + i)))
                else:
                    bottomAxis.append("")
        elif self._bottomAxeMode is HistogramWidget.AxePercentage:
            pass

        self._gridItem.setLeftGridItems(leftAxis)
        self._gridItem.setBottomGridItems(bottomAxis)
class HistogramWidget(QGraphicsView):
	"""
	HistogramWidget
	"""
	AxeClear = "HAC"
	AxeNormal = "HAD"
	AxePercentage = "HAP"
	AxeLog = "HAL"

	def __init__(self):
		super(HistogramWidget, self).__init__()
		self.setFrameShadow(QFrame.Plain)
		self.setFrameShape(QFrame.NoFrame)
		self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
		self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
		self.setRenderHint(QPainter.Antialiasing)

		self._leftAxeMode = HistogramWidget.AxeClear
		self._bottomAxeMode = HistogramWidget.AxeClear

		self._histogram = None
		self._margin = QMargins(0, 0, 0, 0)
		self._backgroundItem = BackgroundItem()
		self._gridItem = GridItem()
		self._histogramItem = HistogramItem()

		self._items = [self._backgroundItem, self._gridItem, self._histogramItem]
		zValue = 0
		self._scene = QGraphicsScene(self)
		for item in self._items:
			self._scene.addItem(item)
			item.setZValue(zValue)
			zValue += 100
		self.setScene(self._scene)

	def setAxeMode(self, left=None, bottom=None):
		if left:
			self._leftAxeMode = left
			if self._leftAxeMode == self.AxeLog:
				self._histogramItem.functionType = HistogramItem.TypeLog
			else:
				self._histogramItem.functionType = HistogramItem.TypeNormal
			self._histogramItem.update()
		if bottom:
			self._bottomAxeMode = bottom
		self._updateAxis()
		self.updateScene()

	def setHistogram(self, histogram):
		self._histogram = histogram
		self._histogramItem.setHistogram(histogram)
		self._updateAxis()

	def addItem(self, item):
		self._scene.addItem(item)
		self._items.append(item)
		self.update()

	def resizeEvent(self, resizeEv):
		"""
		Overrides QGraphicsView.resizeEvent()
		"""
		super(HistogramWidget, self).resizeEvent(resizeEv)
		self.updateScene()

	def wheelEvent(self, wheelEv):
		"""
		Overrides QGraphicsView.wheelEvent()
		Make sure nothing happens when the user scrolls over this widget.
		"""
		pass

	@Slot()
	def updateScene(self):
		"""
		The QGraphicsScene.changed() will automatically be linked to
		this slot. If this slot is missing, then PySide will crash on
		close where it is unable to disconnect this slot...
		Overrides QGraphicsView.updateScene()
		"""
		self.update()

	def update(self):
		"""
		Overrides QGraphicsView.update()
		"""
		rect = self.rect()

		if len(self._gridItem._itemsLeft) > 0 and len(self._gridItem._itemsBottom) > 0:
			# left, top, right, bottom
			self._margin = QMargins(30, 9, 9, 30)
		elif len(self._gridItem._itemsLeft) > 0:
			self._margin = QMargins(30, 9, 9, 9)
		elif len(self._gridItem._itemsBottom) > 0:
			self._margin = QMargins(9, 9, 9, 30)
		else:
			self._margin = QMargins(9, 9, 9, 9)

		for item in self._items:
			item.setRect(rect)
			if hasattr(item, "setMargins"):
				item.setMargins(self._margin)

		self._histogramItem.update()

	def _updateAxis(self):
		leftAxis = []
		bottomAxis = []

		if self._leftAxeMode is HistogramWidget.AxeClear:
			pass
		elif self._leftAxeMode is HistogramWidget.AxeNormal:
			if self._histogramItem.functionType == HistogramItem.TypeLog:
				positions = []
				maxY = self._histogramItem.func(self._histogram.maxY)
				lala = int(round(maxY)+1)
				for i in range(lala):
					positions.append(float(i / float(maxY)))
					val = self._histogramItem.invfunc(i)
					text = "%.0f" % val
					leftAxis.append(text)
				self._gridItem.setLeftGridPositions(positions)
			else:
				minY = self._histogram.minY
				maxY = self._histogram.maxY
				rangeY = maxY - minY
				markerCount = 11
				chunk = rangeY / float(markerCount - 1)
				for i in range(markerCount):
					val = minY + i * chunk
					text = "%.1f" % val
					leftAxis.append(text)
		elif self._leftAxeMode is HistogramWidget.AxePercentage:
			for i in range(11):
				leftAxis.append(str(i * 10) + "%")
		if self._bottomAxeMode is HistogramWidget.AxeClear:
			pass
		elif self._bottomAxeMode is HistogramWidget.AxeNormal:
			rangeX = self._histogram.maxX - self._histogram.minX
			binCount = len(self._histogram.bins)
			markerCount = min(binCount, 11)
			chunk = rangeX / (markerCount - 1)
			for i in range(binCount):
				if i % chunk == 0 or i == binCount-1:
					bottomAxis.append(str(int(self._histogram.minX + i)))
				else:
					bottomAxis.append("")
		elif self._bottomAxeMode is HistogramWidget.AxePercentage:
			pass

		self._gridItem.setLeftGridItems(leftAxis)
		self._gridItem.setBottomGridItems(bottomAxis)