int SvgView::renderText(const QStringRef &text) { scene->clear(); QRectF currentMarginsRect; if (changeMargins) currentMarginsRect = QRectF(QPointF(sheetRect.topRight().x() - marginsRect.topRight().x(), marginsRect.topLeft().y()), QPointF(sheetRect.bottomRight().x() - marginsRect.bottomLeft().x(), marginsRect.bottomRight().y())); else currentMarginsRect = marginsRect; scene->addRect(sheetRect); scene->addRect(currentMarginsRect, QPen(Qt::darkGray)); QPointF cursor(currentMarginsRect.x(), currentMarginsRect.y()); int endOfSheet = 0; for (QChar symbol : text) { qreal letterWidth = fontSize * dpmm / 4, letterHeight = fontSize * dpmm; //don't try to go beyond the right margin if (cursor.x() > (currentMarginsRect.x() + currentMarginsRect.width() - letterWidth)) { if (symbol.isSpace()) //ignore whitespace-symbols at the end of the current line continue; cursor += QPointF(currentMarginsRect.x() - cursor.x(), letterHeight + lineSpacing * dpmm); } //stop rendering when you reach the end of sheet if (cursor.y() > currentMarginsRect.bottomRight().y() - letterHeight) return endOfSheet; if (symbol.isSpace()) { switch (symbol.toLatin1()) { case '\t': cursor += QPointF(letterWidth * spacesInTab, 0.0); endOfSheet++; continue; case '\n': cursor += QPointF(currentMarginsRect.x() - cursor.x(), letterHeight + lineSpacing * dpmm); endOfSheet++; continue; default: cursor += QPointF(letterWidth, 0.0); endOfSheet++; continue; } } if (!font.contains(symbol)) { cursor += QPointF(letterWidth, 0.0); endOfSheet++; continue; } QGraphicsSvgItem *letter = new QGraphicsSvgItem(font.values(symbol).at(qrand() % font.values(symbol).size())); if (useCustomFontColor) { QGraphicsColorizeEffect *colorEffect = new QGraphicsColorizeEffect(); colorEffect->setColor(fontColor); letter->setGraphicsEffect(colorEffect); } letter->setScale(letterHeight / letter->boundingRect().height()); letterWidth = letter->boundingRect().width() * letter->scale() + letterSpacing * dpmm; letter->setPos(cursor); cursor += QPointF(letterWidth, 0.0); scene->addItem(letter); endOfSheet++; } return endOfSheet; }
QGraphicsSvgItem * dmz::QtPluginCanvasObjectBasic::_create_svg_item ( ObjectStruct &os, QGraphicsItem *parent, const Config &Data, HashTableStringTemplate<String> &table) { QGraphicsSvgItem *item (new QGraphicsSvgItem (parent)); Boolean center (True); if (_file_request (item, Data, table)) { ConfigIterator it; Config cd; while (Data.get_next_config (it, cd)) { const String DataName (cd.get_name ().to_lower ()); if (DataName == "translate") { Vector vec (config_to_vector (cd)); String itemName = config_to_string ("name", cd); if (itemName) { QGraphicsItem *img = os.itemTable.lookup (itemName); if (img) { QRectF rect = img->boundingRect (); Vector rectVec; if (vec.get_x () == 0) { rectVec.set_x (0); } else if (vec.get_x() > 0) { rectVec.set_x (rect.center ().x ()); } else { rectVec.set_x (-rect.center ().x ()); } if (vec.get_y () == 0) { rectVec.set_y (0); } else if (vec.get_y () > 0) { rectVec.set_y (rect.center ().y ()); } else { rectVec.set_y (-rect.center ().y ()); } QPointF center = item->boundingRect ().center (); rectVec.set_x (rectVec.get_x () - center.x ()); rectVec.set_y (rectVec.get_y () - center.y ()); vec += rectVec; item->setPos (vec.get_x (), vec.get_y ()); } } else { item->translate (vec.get_x (), vec.get_y ()); } center = False; } else if (DataName == "scale") { Vector vec (config_to_vector (cd)); if (vec.get_x () && vec.get_y ()) { item->scale (vec.get_x (), vec.get_y ()); } } } } else { delete item; item = 0; } if (item && center) { QRectF bound = item->boundingRect (); item->translate (bound.width () * -0.5f, bound.height () * -0.5f); } return item; }