from ..Qt import QtGui, QtCore
from .GraphicsObject import *
from .GraphicsWidgetAnchor import *
from .TextItem import TextItem
import numpy as np
from .. import functions as fn
from .. import getConfigOption
from ..Point import Point

__all__ = ['ScaleBar']

class ScaleBar(GraphicsObject, GraphicsWidgetAnchor):
    """
    Displays a rectangular bar to indicate the relative scale of objects on the view.
    """
    def __init__(self, size, width=5, brush=None, pen=None, suffix='m', offset=None):
        GraphicsObject.__init__(self)
        GraphicsWidgetAnchor.__init__(self)
        self.setFlag(self.ItemHasNoContents)
        self.setAcceptedMouseButtons(QtCore.Qt.NoButton)
        
        if brush is None:
            brush = getConfigOption('foreground')
        self.brush = fn.mkBrush(brush)
        self.pen = fn.mkPen(pen)
        self._width = width
        self.size = size
        if offset == None:
            offset = (0,0)
        self.offset = offset
        
        self.bar = QtGui.QGraphicsRectItem()
        self.bar.setPen(self.pen)
        self.bar.setBrush(self.brush)
        self.bar.setParentItem(self)
        
        self.text = TextItem(text=fn.siFormat(size, suffix=suffix), anchor=(0.5,1))
        self.text.setParentItem(self)

    def parentChanged(self):
        view = self.parentItem()
        if view is None:
            return
        view.sigRangeChanged.connect(self.updateBar)
        self.updateBar()
        
        
    def updateBar(self):
        view = self.parentItem()
        if view is None:
            return
        p1 = view.mapFromViewToItem(self, QtCore.QPointF(0,0))
        p2 = view.mapFromViewToItem(self, QtCore.QPointF(self.size,0))
        w = (p2-p1).x()
        self.bar.setRect(QtCore.QRectF(-w, 0, w, self._width))
        self.text.setPos(-w/2., 0)

    def boundingRect(self):
        return QtCore.QRectF()

    def setParentItem(self, p):
        ret = GraphicsObject.setParentItem(self, p)
        if self.offset is not None:
            offset = Point(self.offset)
            anchorx = 1 if offset[0] <= 0 else 0
            anchory = 1 if offset[1] <= 0 else 0
            anchor = (anchorx, anchory)
            self.anchor(itemPos=anchor, parentPos=anchor, offset=offset)
        return ret




#class ScaleBar(UIGraphicsItem):
    #"""
    #Displays a rectangular bar with 10 divisions to indicate the relative scale of objects on the view.
    #"""
    #def __init__(self, size, width=5, color=(100, 100, 255)):
        #UIGraphicsItem.__init__(self)
        #self.setAcceptedMouseButtons(QtCore.Qt.NoButton)
        
        #self.brush = fn.mkBrush(color)
        #self.pen = fn.mkPen((0,0,0))
        #self._width = width
        #self.size = size
        
    #def paint(self, p, opt, widget):
        #UIGraphicsItem.paint(self, p, opt, widget)
        
        #rect = self.boundingRect()
        #unit = self.pixelSize()
        #y = rect.top() + (rect.bottom()-rect.top()) * 0.02
        #y1 = y + unit[1]*self._width
        #x = rect.right() + (rect.left()-rect.right()) * 0.02
        #x1 = x - self.size
        
        #p.setPen(self.pen)
        #p.setBrush(self.brush)
        #rect = QtCore.QRectF(
            #QtCore.QPointF(x1, y1), 
            #QtCore.QPointF(x, y)
        #)
        #p.translate(x1, y1)
        #p.scale(rect.width(), rect.height())
        #p.drawRect(0, 0, 1, 1)
        
        #alpha = np.clip(((self.size/unit[0]) - 40.) * 255. / 80., 0, 255)
        #p.setPen(QtGui.QPen(QtGui.QColor(0, 0, 0, alpha)))
        #for i in range(1, 10):
            ##x2 = x + (x1-x) * 0.1 * i
            #x2 = 0.1 * i
            #p.drawLine(QtCore.QPointF(x2, 0), QtCore.QPointF(x2, 1))
        

    #def setSize(self, s):
        #self.size = s
        
