#include "textitem.h" #include "elements.h" #include "itabs.h" extern QBrush *tb; extern QPen *tp; extern QSettings *conf; TextItem::TextItem( NodeItem *from, NodeItem *to ) : EdgeItem(from, to), QGraphicsSimpleTextItem ("Text") { item_type = type(); from->setOutEdge( (EdgeItem *)this ); setFlag(ItemIsSelectable); align = Qt::AlignLeft; } TextItem::TextItem( QDomElement el ) : EdgeItem(new NodeItem(), new NodeItem()), QGraphicsSimpleTextItem() { item_type = type(); setPen( *tp ); ipen = pen(); ipen.setColor(QColor(el.attribute("color"))); setPen(ipen); int x1 = el.attribute("x1").toInt(), y1 = el.attribute("y1").toInt(), x2 = el.attribute("x2").toInt(), y2 = el.attribute("y2").toInt(); align = (QFlags)el.attribute("align").toInt(); QDomCDATASection cd = el.firstChild().toCDATASection (); setText(cd.data()); QFont f; f.fromString(el.attribute("font")); setFont(f); setPos(x1,y1); ww = x2-x1; hh = y2-y1; setFromPoint(x1,y1); setToPoint(x2, y2); setCursor(QCursor(Qt::SizeAllCursor)); setFlag(ItemIsSelectable); setFlag(ItemIsMovable); } void TextItem::setTabs( QTabWidget *properties) { PositionTab *ptab = new PositionTab(this); properties->addTab(ptab, QObject::tr("Position")); TextTab *ttab = new TextTab(this); properties->addTab(ttab, QObject::tr("Text")); TextStyleTab *tstab = new TextStyleTab(this); properties->addTab(tstab, QObject::tr("Style")); } void TextItem::setFromPoint( int x, int y ) { setBlock(true); setPos(x,y); ww = ww+(x1-x); hh = hh+(y1-y); x1 = x; y1 = y; from_node->setPos(x,y); emit position_changed(this); setBlock(false); } void TextItem::setToPoint( int x, int y ) { // setPos(x,y); setBlock(true); ww = x-x1; hh = y-y1; qDebug("ww: %i", ww); update(); to_node->setPos(x,y); emit position_changed(this); setBlock(false); } QVariant TextItem::itemChange(GraphicsItemChange change, const QVariant &value) { if(block()) {return QGraphicsSimpleTextItem::itemChange(change, value);} // if(block()) {return -1;} setBlock(true); if(change == ItemSelectedChange) { if(value.toBool()) { emit item_selected(this); from_node->show(); to_node->show(); } else { emit item_selected(0); from_node->hide(); to_node->hide(); } } else if (change == ItemPositionChange) { QRectF r = sceneBoundingRect(); QPointF newPos = value.toPointF(); x1=int(newPos.x()); y1=int(newPos.y()); from_node->setPos(r.x(),r.y()); to_node->setPos(r.x()+ww, r.y()+hh); emit position_changed(this); } setBlock(false); return QGraphicsSimpleTextItem::itemChange(change, value); } void TextItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { QString txt = text(); txt.replace(QLatin1Char('\n'), QChar::LineSeparator); QFont f = QFont(font(), painter->device()); QFontMetrics metrics(f); // f.setPointSizeF(metrics.height()); // QRectF rect = metrics.boundingRect(txt); painter->setPen(ipen); QPainterPath clipPath; clipPath.addRect(this->boundingRect()); painter->setClipPath(clipPath); painter->setFont(f); QTextLayout layout(txt, f, painter->device()); // int leading = metrics.leading(); int height = 0; layout.beginLayout(); forever { QTextLine line = layout.createLine(); if (!line.isValid()) break; } for (int i = 0; i < layout.lineCount(); ++i) { QTextLine line = layout.lineAt(i); qreal w = line.naturalTextWidth(); // height += leading+metrics.descent(); int px = 0; if (align == Qt::AlignHCenter) { px = int(ww/2 - w / 2); } else if (align == Qt::AlignRight) { px = int(ww - w); } line.setPosition(QPoint(px, height)); height += metrics.height(); } layout.endLayout(); layout.draw(painter, QPointF(0,0)); if (option->state & (QStyle::State_Selected | QStyle::State_HasFocus)) { painter->setPen(QPen(Qt::black, 0)); painter->setBrush(Qt::NoBrush); QRectF r = this->boundingRect(); r.setWidth(r.width()-1); r.setHeight(r.height()-1); painter->drawRect(r); } } void TextItem::paintItem( int x, int y, QPainter *pp, QPrinter *pp1, qreal scale ) { QString txt = text(); txt.replace(QLatin1Char('\n'), QChar::LineSeparator); QFont f = QFont(font(), pp1); QFontMetrics metrics(f); pp->setPen(ipen); QPointF p = pos(); // f.setPixelSize(int(metrics.height()*scale)); QRectF rect = metrics.boundingRect(txt); p.setX(p.x()*scale+x); p.setY(p.y()*scale+y); pp->setFont(f); QTextLayout layout(txt, f, pp1); int leading = metrics.leading(); int height = 0; layout.beginLayout(); forever { QTextLine line = layout.createLine(); if (!line.isValid()) break; } int ww1 = ww*scale; for (int i = 0; i < layout.lineCount(); ++i) { QTextLine line = layout.lineAt(i); qreal w = line.naturalTextWidth(); qreal wq = line.width(); // height += leading+metrics.descent(); int px = 0; if (align == Qt::AlignHCenter) { px = int(ww1/2 - w / 2); } else if (align == Qt::AlignRight) { px = int(ww1 - w); } line.setPosition(QPoint(px, height)); height += metrics.height(); } layout.endLayout(); layout.draw(pp, p); } QDomElement TextItem::toXml(QDomDocument doc) { qDebug("1"); QDomElement l =doc.createElement("text"); l.setAttribute("x1",x()); l.setAttribute("y1",y()); l.setAttribute("x2",x()+ww); l.setAttribute("y2",y()+hh); l.setAttribute("color",ipen.color().name()); l.setAttribute("font",font().toString()); l.setAttribute("align",align); qDebug("2"); QDomCDATASection cd = doc.createCDATASection(text()); l.appendChild(cd); return l; }