- 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");