From 1002806ef02ca7e17b38c82cc0b02dc0436ef456 Mon Sep 17 00:00:00 2001 From: Martin Baeuml Date: Tue, 6 Dec 2011 16:25:16 +0100 Subject: [PATCH] display text in child item (fixes #12) This allows the text to have a bounding box of its own. Thus, text is not clipped at an items border anymore if it is too long. It's also properly deleted when the item is deleted. --- sloth/items/items.py | 40 +++++++++++++++++++--------------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/sloth/items/items.py b/sloth/items/items.py index c0c6577..a1f2d23 100644 --- a/sloth/items/items.py +++ b/sloth/items/items.py @@ -41,15 +41,19 @@ class BaseItem(QAbstractGraphicsShapeItem): if self._model_item is not None: self._model_item.model().dataChanged.connect(self.onDataChanged) - self.changeColor() - # initialize members self._prefix = prefix + self._auto_text_keys = self.defaultAutoTextKeys[:] self._text = "" self._text_bg_brush = None - self._auto_text_keys = self.defaultAutoTextKeys[:] + self._text_item = QGraphicsTextItem(self) + self._text_item.setPos(0, 0) + self._text_item.setAcceptHoverEvents(False) + self._text_item.setHtml(self._compile_text()) self._valid = True + self.changeColor() + def changeColor(self): if self._model_item is not None: c = self._model_item.getColor() @@ -59,8 +63,12 @@ class BaseItem(QAbstractGraphicsShapeItem): self.setColor(Qt.yellow) def onDataChanged(self, indexFrom, indexTo): + # FIXME why is this not updated, when changed graphically via attribute box ? + #print "onDataChanged", self._model_item.index(), indexFrom, indexTo, indexFrom.parent() if indexFrom == self._model_item.index(): self.changeColor() + #print "hit" + # self._text_item.setHtml(self._compile_text()) def modelItem(self): """ @@ -80,11 +88,16 @@ class BaseItem(QAbstractGraphicsShapeItem): """ return self._prefix + def setPen(self, pen): + QAbstractGraphicsShapeItem.setPen(self, pen) + self._text_item.setDefaultTextColor(pen) + def setText(self, text=""): """ Sets a text to be displayed on this item. """ self._text = text + self._text_item.setHtml(self._compile_text()) def text(self): return self._text @@ -109,6 +122,7 @@ class BaseItem(QAbstractGraphicsShapeItem): are displayed automatically as text. """ self._auto_text_keys = keys + self._text_item.setHtml(self._compile_text()) def autoTextKeys(self): """ @@ -135,10 +149,11 @@ class BaseItem(QAbstractGraphicsShapeItem): for key in self._auto_text_keys: text_lines.append("%s: %s" % \ (key, self._model_item.get(key, ""))) - return '\n'.join(text_lines) + return '
'.join(text_lines) def dataChanged(self): self.dataChange() + self._text_item.setHtml(self._compile_text()) self.update() def dataChange(self): @@ -148,23 +163,6 @@ class BaseItem(QAbstractGraphicsShapeItem): if ann is not None: self._model_item.update(ann) - def paint(self, painter, option, widget=None): - painter.save() - painter.setPen(self.pen()) - - # display the text for this item - text = self._compile_text() - rect = painter.boundingRect( - QRect(5, 5, 1000, 1000), Qt.AlignTop | Qt.AlignLeft, text) - - # fill background region behind text - if self._text_bg_brush is not None: - bg_rect = rect.adjusted(-3, -3, 3, 3) - painter.fillRect(bg_rect, self._text_bg_brush) - - painter.drawText(rect, Qt.AlignTop | Qt.AlignLeft, text) - painter.restore() - def boundingRect(self): return QRectF(0, 0, 0, 0)