class BedItem(QGraphicsRectItem):
    def __init__(self, parent, scene, 
                 bed, 
                 rect, pos, pen, 
                 columnWidths, columnSequence):
        QGraphicsRectItem.__init__(self, parent, scene)
        self.bed = bed
        self.p = QPen(Qt.NoPen)
        self.p.setStyle(Qt.DotLine)
        self.columnWidths = columnWidths
        self.columnSequence = columnSequence
        self.headerItems = dict()
        self.setRect(rect)
        self.setPos(pos)
        self.setPen(QPen(Qt.NoPen))
        self.showFields()
    def showFields(self):
        x = 0
        for headerClass in self.columnSequence:
            if headerClass == HeightHeaderItem:
                self.drawHeight(self.columnWidths[headerClass], x)
            if headerClass == BedHeaderItem:
                self.drawBedNumber(self.columnWidths[headerClass], x)
            if headerClass == LithologyHeaderItem:
                self.drawLithology(self.columnWidths[headerClass], x)
            if headerClass == GrainSizeHeaderItem:
                self.drawGrainSize(self.columnWidths[headerClass], x)
            if headerClass == ColorHeaderItem:
                self.drawColor(self.columnWidths[headerClass], x)
            if headerClass == FossilHeaderItem:
                self.drawFossils(self.columnWidths[headerClass], x)
            if headerClass == SedimentStructureHeaderItem:
                self.drawSedimentStructures(self.columnWidths[headerClass], x)
            if headerClass == CustomSymbolHeaderItem:
                self.drawCustomSymbols(self.columnWidths[headerClass], x)
            if headerClass == TectonicUnitHeaderItem:
                self.drawTectonicUnit(self.columnWidths[headerClass], x)
            if headerClass == LithologicalUnitHeaderItem:
                self.drawLithologicalUnit(self.columnWidths[headerClass], x)
            if headerClass == StratigraphicUnitHeaderItem:
                self.drawStratigraphicUnit(self.columnWidths[headerClass], x)
            if headerClass == FaciesHeaderItem:
                self.drawFacies(self.columnWidths[headerClass], x)
            if headerClass == OutcropTypeHeaderItem:
                self.drawOutcropType(self.columnWidths[headerClass], x)
            if headerClass == BeddingTypeHeaderItem:
                self.drawBeddingType(self.columnWidths[headerClass], x)
            self.drawBoundaryTypes()
            x += self.columnWidths[headerClass]
    def drawVerticalSeparator(self, x, pen = None):
        l = QGraphicsLineItem(self)
#        self.scene().addItem(l)
        l.setLine(QLineF(0, 0, 0, self.rect().height()))
        l.setPos(x, 0)
        if pen is None:
            l.setPen(self.p)
        else:
            l.setPen(pen)
    def drawHeight(self, w, y):
        pass
    def drawBedNumber(self, w, x):
        self.drawVerticalSeparator(x)
        self.bedNumberItm = BedNumberText(self, self.scene(), QFont(), self.bed, 0)
        self.bedNumberItm.adjustSize()
        self.bedNumberItm.setPos(QPointF(x, (self.rect().height() - self.bedNumberItm.boundingRect().height())/2))
    def drawLithology(self, w, x):
        self.lithologyItm = LithologyItem(self, self.scene(),
                                          QRectF(0, 0, w, self.rect().height()),
                                          self.p,
                                          self.bed)
        self.lithologyItm.setPos(QPointF(x, 0))
    def drawGrainSize(self, w, x):
        if len(self.bed.grainSizes) < 1:
            return
        self.grainSizeItm = GrainSizeItem(self, self.scene(),
                                          QRectF(0, 0, w, self.rect().height()),
                                          self.p,
                                          self.bed)
        self.grainSizeItm.setPos(x, 0)
    def drawColor(self, w, x):
        self.colorItm = ColorItem(self, self.scene(),
                                  QRectF(0, 0, w, self.rect().height()),
                                  self.p,
                                  self.bed)
        self.colorItm.setPos(QPointF(x, 0))
    def drawBeddingType(self, w, x):
        self.beddingTypeItm = BeddingTypeItem(self, self.scene(),
                                              QRectF(0, 0, w, self.rect().height()),
                                              self.p,
                                              self.bed)
        self.beddingTypeItm.setPos(QPointF(x, 0))
    def drawFossils(self, w, x):
        self.fossilItm = FossilItem(self, self.scene(),
                                    QRectF(0, 0, w, self.rect().height()),
                                    self.p,
                                    self.bed)
        self.fossilItm.setPos(QPointF(x, 0))
    def drawSedimentStructures(self, w, x):
        self.sedimentStructureItm = SedimentStructureItem(self, self.scene(),
                                                          QRectF(0, 0, w, self.rect().height()),
                                                          self.p,
                                                          self.bed)
        self.sedimentStructureItm.setPos(QPointF(x, 0))
    def drawCustomSymbols(self, w, x):
        self.customSymbolItm = CustomSymbolItem(self, self.scene(),
                                                QRectF(0, 0, w, self.rect().height()),
                                                self.p,
                                                self.bed)
        self.customSymbolItm.setPos(QPointF(x, 0))
    def drawTectonicUnit(self, w, x):
        self.tectonicUnitItm = TectonicUnitItem(self, self.scene(),
                                                QRectF(0, 0, w, self.rect().height()),
                                                self.p,
                                                self.bed)
        self.tectonicUnitItm.setPos(QPointF(x, 0))
    def drawLithologicalUnit(self, w, x):
        self.lithologicalUnitItm = LithologicalUnitItem(self, self.scene(),
                                                        QRectF(0, 0, w, self.rect().height()),
                                                        self.p,
                                                        self.bed)
        self.lithologicalUnitItm.setPos(QPointF(x, 0))
    def drawStratigraphicUnit(self, w, x):
        self.stratigraphicUnitItm = StratigraphicUnitItem(self, self.scene(),
                                                        QRectF(0, 0, w, self.rect().height()),
                                                        self.p,
                                                        self.bed)
        self.stratigraphicUnitItm.setPos(QPointF(x, 0))
    def drawFacies(self, w, x):
        self.faciesItm = FaciesItem(self, self.scene(),
                                    QRectF(0, 0, w, self.rect().height()),
                                    self.p,
                                    self.bed)
        self.faciesItm.setPos(QPointF(x, 0))
    def drawOutcropType(self, w, x):
        self.outcropTypeItm = OutcropTypeItem(self, self.scene(),
                                              QRectF(0, 0, w, self.rect().height()),
                                              self.p,
                                              self.bed)
        self.outcropTypeItm.setPos(QPointF(x, 0))

    def drawBoundaryTypes(self):
        f = SymbolFactory()
        for bt in self.bed.boundaryTypes:
            if bt.boundaryType.hasSvgItem():
                pm = f.pixmapFromSvgItem(bt.boundaryType.svgItem, self.rect().width(), Qt.IgnoreAspectRatio)
                itm = QGraphicsPixmapItem(self, self.scene())
                itm.setPixmap(pm)
                itm.setPos(0, self.rect().height() - bt.begin * self.rect().height() / 100)
 def drawStratigraphicUnit(self, w, x):
     self.stratigraphicUnitItm = StratigraphicUnitItem(self, self.scene(),
                                                     QRectF(0, 0, w, self.rect().height()),
                                                     self.p,
                                                     self.bed)
     self.stratigraphicUnitItm.setPos(QPointF(x, 0))