X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fbase%2Frs_text.cpp;h=56a8cf75e5135a847956ef164191610ac9c7d91f;hb=27d4a138d23453e93a833e9347444b828a971cb4;hp=3b44ae2b23073759b939220d9ae67be1e1e7ada9;hpb=16ce54abf01ca3032e42a5bb11a4afcf9014dcca;p=architektonas diff --git a/src/base/rs_text.cpp b/src/base/rs_text.cpp index 3b44ae2..56a8cf7 100644 --- a/src/base/rs_text.cpp +++ b/src/base/rs_text.cpp @@ -23,9 +23,9 @@ */ RS_Text::RS_Text(RS_EntityContainer * parent, const RS_TextData & d): RS_EntityContainer(parent), data(d) { - usedTextHeight = 0.0; - usedTextWidth = 0.0; - setText(data.text); + usedTextHeight = 0.0; + usedTextWidth = 0.0; + setText(data.text); } /*virtual*/ RS_Text::~RS_Text() @@ -59,15 +59,17 @@ RS_TextData RS_Text::getData() const */ int RS_Text::getNumberOfLines() { - int c=1; + int c = 1; - for (int i=0; i<(int)data.text.length(); ++i) { - if (data.text.at(i).unicode()==0x0A) { - c++; - } - } + for(int i=0; i<(int)data.text.length(); ++i) + { + if (data.text.at(i).unicode() == 0x0A) + { + c++; + } + } - return c; + return c; } /** @@ -77,186 +79,181 @@ int RS_Text::getNumberOfLines() */ void RS_Text::update() { - RS_DEBUG->print("RS_Text::update"); - - clear(); - - if (isUndone()) { - return; - } - - usedTextWidth = 0.0; - usedTextHeight = 0.0; - - RS_Font* font = RS_FONTLIST->requestFont(data.style); - - if (font==NULL) { - return; - } - - Vector letterPos = Vector(0.0, -9.0); - Vector letterSpace = Vector(font->getLetterSpacing(), 0.0); - Vector space = Vector(font->getWordSpacing(), 0.0); - int lineCounter = 0; - - // Every single text line gets stored in this entity container - // so we can move the whole line around easely: - RS_EntityContainer* oneLine = new RS_EntityContainer(this); - - // First every text line is created with - // alignement: top left - // angle: 0 - // height: 9.0 - // Rotation, scaling and centering is done later - - // For every letter: - for (int i=0; i<(int)data.text.length(); ++i) { - switch (data.text.at(i).unicode()) { - case 0x0A: - // line feed: - updateAddLine(oneLine, lineCounter++); - oneLine = new RS_EntityContainer(this); - letterPos = Vector(0.0, -9.0); - break; - - case 0x20: - // Space: - letterPos+=space; - break; - - case 0x5C: { - // code (e.g. \S, \P, ..) - i++; - int ch = data.text.at(i).unicode(); - switch (ch) { - case 'P': - updateAddLine(oneLine, lineCounter++); - oneLine = new RS_EntityContainer(this); - letterPos = Vector(0.0, -9.0); - break; - - case 'S': { - QString up; - QString dw; - //letterPos += letterSpace; - - // get upper string: - i++; - while (data.text.at(i).unicode()!='^' && - //data.text.at(i).unicode()!='/' && - data.text.at(i).unicode()!='\\' && - //data.text.at(i).unicode()!='#' && - i<(int)data.text.length()) { - up += data.text.at(i); - i++; - } - - i++; - - if (data.text.at(i-1).unicode()=='^' && - data.text.at(i).unicode()==' ') { - i++; - } - - // get lower string: - while (data.text.at(i).unicode()!=';' && - i<(int)data.text.length()) { - dw += data.text.at(i); - i++; - } - - // add texts: - RS_Text* upper = - new RS_Text( - oneLine, - RS_TextData(letterPos + Vector(0.0,9.0), - 4.0, 100.0, RS2::VAlignTop, - RS2::HAlignLeft, - RS2::LeftToRight, RS2::Exact, - 1.0, up, data.style, - 0.0, RS2::Update)); - upper->setLayer(NULL); - upper->setPen(RS_Pen(RS2::FlagInvalid)); - oneLine->addEntity(upper); - - RS_Text* lower = - new RS_Text( - oneLine, - RS_TextData(letterPos+Vector(0.0,4.0), - 4.0, 100.0, RS2::VAlignTop, - RS2::HAlignLeft, - RS2::LeftToRight, RS2::Exact, - 1.0, dw, data.style, - 0.0, RS2::Update)); - lower->setLayer(NULL); - lower->setPen(RS_Pen(RS2::FlagInvalid)); - oneLine->addEntity(lower); - - // move cursor: - upper->calculateBorders(); - lower->calculateBorders(); - - double w1 = upper->getSize().x; - double w2 = lower->getSize().x; - - if (w1>w2) { - letterPos += Vector(w1, 0.0); - } else { - letterPos += Vector(w2, 0.0); - } - letterPos += letterSpace; - } - break; - - default: - break; - } - } - break; - - default: { - // One Letter: - if (font->findLetter(QString(data.text.at(i))) != NULL) { - - RS_DEBUG->print("RS_Text::update: insert a " - "letter at pos: %f/%f", letterPos.x, letterPos.y); - - RS_InsertData d(QString(data.text.at(i)), - letterPos, - Vector(1.0, 1.0), - 0.0, - 1,1, Vector(0.0,0.0), - font->getLetterList(), RS2::NoUpdate); - - RS_Insert* letter = new RS_Insert(this, d); - Vector letterWidth; - letter->setPen(RS_Pen(RS2::FlagInvalid)); - letter->setLayer(NULL); - letter->update(); - letter->forcedCalculateBorders(); - - // until 2.0.4.5: - //letterWidth = Vector(letter->getSize().x, 0.0); - // from 2.0.4.6: - letterWidth = Vector(letter->getMax().x-letterPos.x, 0.0); - - oneLine->addEntity(letter); - - // next letter position: - letterPos += letterWidth; - letterPos += letterSpace; - } - } - break; - } - } - - updateAddLine(oneLine, lineCounter); - usedTextHeight -= data.height*data.lineSpacingFactor*1.6 - - data.height; - forcedCalculateBorders(); - - RS_DEBUG->print("RS_Text::update: OK"); + RS_DEBUG->print("RS_Text::update"); + + clear(); + + if (isUndone()) + return; + + usedTextWidth = 0.0; + usedTextHeight = 0.0; + + RS_Font * font = RS_FONTLIST->requestFont(data.style); + + if (font == NULL) + return; + + Vector letterPos = Vector(0.0, -9.0); + Vector letterSpace = Vector(font->getLetterSpacing(), 0.0); + Vector space = Vector(font->getWordSpacing(), 0.0); + int lineCounter = 0; + + // Every single text line gets stored in this entity container + // so we can move the whole line around easely: + RS_EntityContainer * oneLine = new RS_EntityContainer(this); + + // First every text line is created with + // alignement: top left + // angle: 0 + // height: 9.0 + // Rotation, scaling and centering is done later + + // For every letter: + for(int i=0; i<(int)data.text.length(); ++i) + { + switch (data.text.at(i).unicode()) + { + case 0x0A: + // line feed: + updateAddLine(oneLine, lineCounter++); + oneLine = new RS_EntityContainer(this); + letterPos = Vector(0.0, -9.0); + break; + + case 0x20: + // Space: + letterPos += space; + break; + + case 0x5C: + { + // code (e.g. \S, \P, ..) + i++; + int ch = data.text.at(i).unicode(); + + switch (ch) + { + case 'P': + updateAddLine(oneLine, lineCounter++); + oneLine = new RS_EntityContainer(this); + letterPos = Vector(0.0, -9.0); + break; + + case 'S': + { + QString up; + QString dw; + //letterPos += letterSpace; + + // get upper string: + i++; + while (data.text.at(i).unicode() != '^' + && data.text.at(i).unicode() != '\\' + && i < (int)data.text.length()) + { + up += data.text.at(i); + i++; + } + + i++; + + if (data.text.at(i - 1).unicode() == '^' + && data.text.at(i).unicode() == ' ') + { + i++; + } + + // get lower string: + while (data.text.at(i).unicode() != ';' && i < (int)data.text.length()) + { + dw += data.text.at(i); + i++; + } + + // add texts: + RS_Text * upper = new RS_Text(oneLine, + RS_TextData(letterPos + Vector(0.0, 9.0), + 4.0, 100.0, RS2::VAlignTop, + RS2::HAlignLeft, + RS2::LeftToRight, RS2::Exact, + 1.0, up, data.style, + 0.0, RS2::Update)); + upper->setLayer(NULL); + upper->setPen(RS_Pen(RS2::FlagInvalid)); + oneLine->addEntity(upper); + + RS_Text * lower = new RS_Text(oneLine, + RS_TextData(letterPos+Vector(0.0, 4.0), + 4.0, 100.0, RS2::VAlignTop, + RS2::HAlignLeft, + RS2::LeftToRight, RS2::Exact, + 1.0, dw, data.style, + 0.0, RS2::Update)); + lower->setLayer(NULL); + lower->setPen(RS_Pen(RS2::FlagInvalid)); + oneLine->addEntity(lower); + + // move cursor: + upper->calculateBorders(); + lower->calculateBorders(); + + double w1 = upper->getSize().x; + double w2 = lower->getSize().x; + + if (w1 > w2) + letterPos += Vector(w1, 0.0); + else + letterPos += Vector(w2, 0.0); + + letterPos += letterSpace; + } + break; + + default: + break; + } + } + break; + + default: + { + // One Letter: + if (font->findLetter(QString(data.text.at(i))) != NULL) + { + RS_DEBUG->print("RS_Text::update: insert a " + "letter at pos: %f/%f", letterPos.x, letterPos.y); + + RS_InsertData d(QString(data.text.at(i)), letterPos, Vector(1.0, 1.0), + 0.0, 1,1, Vector(0.0, 0.0), font->getLetterList(), RS2::NoUpdate); + + RS_Insert * letter = new RS_Insert(this, d); + letter->setPen(RS_Pen(RS2::FlagInvalid)); + letter->setLayer(NULL); + letter->update(); + letter->forcedCalculateBorders(); + + // until 2.0.4.5: + //letterWidth = Vector(letter->getSize().x, 0.0); + // from 2.0.4.6: + Vector letterWidth = Vector(letter->getMax().x - letterPos.x, 0.0); + + oneLine->addEntity(letter); + + // next letter position: + letterPos += letterWidth; + letterPos += letterSpace; + } + } + break; + } + } + + updateAddLine(oneLine, lineCounter); + usedTextHeight -= data.height * data.lineSpacingFactor * 1.6 - data.height; + forcedCalculateBorders(); + + RS_DEBUG->print("RS_Text::update: OK"); } /** @@ -268,75 +265,73 @@ void RS_Text::update() */ void RS_Text::updateAddLine(RS_EntityContainer* textLine, int lineCounter) { - RS_DEBUG->print("RS_Text::updateAddLine: width: %f", textLine->getSize().x); + RS_DEBUG->print("RS_Text::updateAddLine: width: %f", textLine->getSize().x); //textLine->forcedCalculateBorders(); - //RS_DEBUG->print("RS_Text::updateAddLine: width 2: %f", textLine->getSize().x); + //RS_DEBUG->print("RS_Text::updateAddLine: width 2: %f", textLine->getSize().x); - // Move to correct line position: - textLine->move(Vector(0.0, -9.0 * lineCounter - * data.lineSpacingFactor * 1.6)); + // Move to correct line position: + textLine->move(Vector(0.0, -9.0 * lineCounter * data.lineSpacingFactor * 1.6)); textLine->forcedCalculateBorders(); Vector textSize = textLine->getSize(); RS_DEBUG->print("RS_Text::updateAddLine: width 2: %f", textSize.x); - // Horizontal Align: - switch (data.halign) { - case RS2::HAlignCenter: - RS_DEBUG->print("RS_Text::updateAddLine: move by: %f", -textSize.x/2.0); - textLine->move(Vector(-textSize.x/2.0, 0.0)); - break; + // Horizontal Align: + switch (data.halign) + { + case RS2::HAlignCenter: + RS_DEBUG->print("RS_Text::updateAddLine: move by: %f", -textSize.x / 2.0); + textLine->move(Vector(-textSize.x / 2.0, 0.0)); + break; - case RS2::HAlignRight: - textLine->move(Vector(-textSize.x, 0.0)); - break; + case RS2::HAlignRight: + textLine->move(Vector(-textSize.x, 0.0)); + break; - default: - break; - } + default: + break; + } - // Vertical Align: - double vSize = getNumberOfLines()*9.0*data.lineSpacingFactor*1.6 - - (9.0*data.lineSpacingFactor*1.6 - 9.0); + // Vertical Align: + double vSize = getNumberOfLines() * 9.0 * data.lineSpacingFactor * 1.6 - (9.0 * data.lineSpacingFactor * 1.6 - 9.0); - switch (data.valign) { - case RS2::VAlignMiddle: - textLine->move(Vector(0.0, vSize/2.0)); - break; + switch (data.valign) + { + case RS2::VAlignMiddle: + textLine->move(Vector(0.0, vSize / 2.0)); + break; - case RS2::VAlignBottom: - textLine->move(Vector(0.0, vSize)); - break; + case RS2::VAlignBottom: + textLine->move(Vector(0.0, vSize)); + break; - default: - break; - } + default: + break; + } - // Scale: - textLine->scale(Vector(0.0,0.0), - Vector(data.height/9.0, data.height/9.0)); + // Scale: + textLine->scale(Vector(0.0, 0.0), Vector(data.height / 9.0, data.height / 9.0)); - textLine->forcedCalculateBorders(); + textLine->forcedCalculateBorders(); - // Update actual text size (before rotating, after scaling!): - if (textLine->getSize().x>usedTextWidth) { - usedTextWidth = textLine->getSize().x; - } + // Update actual text size (before rotating, after scaling!): + if (textLine->getSize().x > usedTextWidth) + usedTextWidth = textLine->getSize().x; - usedTextHeight += data.height*data.lineSpacingFactor*1.6; + usedTextHeight += data.height * data.lineSpacingFactor * 1.6; - // Rotate: - textLine->rotate(Vector(0.0,0.0), data.angle); + // Rotate: + textLine->rotate(Vector(0.0, 0.0), data.angle); - // Move: - textLine->move(data.insertionPoint); - textLine->setPen(RS_Pen(RS2::FlagInvalid)); - textLine->setLayer(NULL); - textLine->forcedCalculateBorders(); + // Move: + textLine->move(data.insertionPoint); + textLine->setPen(RS_Pen(RS2::FlagInvalid)); + textLine->setLayer(NULL); + textLine->forcedCalculateBorders(); - addEntity(textLine); + addEntity(textLine); } Vector RS_Text::getInsertionPoint() @@ -577,84 +572,86 @@ Vector RS_Text::getNearestRef(const Vector & coord, double * dist) void RS_Text::move(Vector offset) { - data.insertionPoint.move(offset); - update(); + data.insertionPoint.move(offset); + update(); } void RS_Text::rotate(Vector center, double angle) { - data.insertionPoint.rotate(center, angle); - data.angle = RS_Math::correctAngle(data.angle+angle); - update(); + data.insertionPoint.rotate(center, angle); + data.angle = RS_Math::correctAngle(data.angle + angle); + update(); } void RS_Text::scale(Vector center, Vector factor) { - data.insertionPoint.scale(center, factor); - data.width*=factor.x; - data.height*=factor.x; - update(); + data.insertionPoint.scale(center, factor); + data.width *= factor.x; + data.height *= factor.x; + update(); } void RS_Text::mirror(Vector axisPoint1, Vector axisPoint2) { - data.insertionPoint.mirror(axisPoint1, axisPoint2); - //double ang = axisPoint1.angleTo(axisPoint2); - bool readable = RS_Math::isAngleReadable(data.angle); - - Vector vec; - vec.setPolar(1.0, data.angle); - vec.mirror(Vector(0.0,0.0), axisPoint2-axisPoint1); - data.angle = vec.angle(); - - bool corr; - data.angle = RS_Math::makeAngleReadable(data.angle, readable, &corr); - - if (corr) { - if (data.halign==RS2::HAlignLeft) { - data.halign=RS2::HAlignRight; - } else if (data.halign==RS2::HAlignRight) { - data.halign=RS2::HAlignLeft; - } - } else { - if (data.valign==RS2::VAlignTop) { - data.valign=RS2::VAlignBottom; - } else if (data.valign==RS2::VAlignBottom) { - data.valign=RS2::VAlignTop; - } - } - update(); + data.insertionPoint.mirror(axisPoint1, axisPoint2); + //double ang = axisPoint1.angleTo(axisPoint2); + bool readable = RS_Math::isAngleReadable(data.angle); + + Vector vec; + vec.setPolar(1.0, data.angle); + vec.mirror(Vector(0.0, 0.0), axisPoint2 - axisPoint1); + data.angle = vec.angle(); + + bool corr; + data.angle = RS_Math::makeAngleReadable(data.angle, readable, &corr); + + if (corr) + { + if (data.halign == RS2::HAlignLeft) + { + data.halign = RS2::HAlignRight; + } + else if (data.halign == RS2::HAlignRight) + { + data.halign = RS2::HAlignLeft; + } + } + else + { + if (data.valign == RS2::VAlignTop) + { + data.valign = RS2::VAlignBottom; + } + else if (data.valign == RS2::VAlignBottom) + { + data.valign = RS2::VAlignTop; + } + } + + update(); } bool RS_Text::hasEndpointsWithinWindow(Vector /*v1*/, Vector /*v2*/) { - return false; + return false; } - - /** * Implementations must stretch the given range of the entity * by the given offset. */ -void RS_Text::stretch(Vector firstCorner, - Vector secondCorner, - Vector offset) { - - if (getMin().isInWindow(firstCorner, secondCorner) && - getMax().isInWindow(firstCorner, secondCorner)) { - - move(offset); - } +void RS_Text::stretch(Vector firstCorner, Vector secondCorner, Vector offset) +{ + if (getMin().isInWindow(firstCorner, secondCorner) + && getMax().isInWindow(firstCorner, secondCorner)) + move(offset); } - - /** * Dumps the point's data to stdout. */ -std::ostream& operator << (std::ostream& os, const RS_Text& p) { - os << " Text: " << p.getData() << "\n"; - return os; +std::ostream & operator<<(std::ostream & os, const RS_Text & p) +{ + os << " Text: " << p.getData() << "\n"; + return os; } -