QCAD
Open Source 2D CAD
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
RTextRenderer.h
Go to the documentation of this file.
1 
20 #ifndef RTEXTRENDERER_H
21 #define RTEXTRENDERER_H
22 
23 #include "entity_global.h"
24 
25 #include <QTextLayout>
26 
27 #include "RDocument.h"
28 #include "REntityData.h"
29 #include "RPainterPath.h"
30 #include "RPainterPathSource.h"
31 #include "RTextBasedData.h"
32 #include "RVector.h"
33 
34 class QTextDocument;
35 
43 public:
44  enum Target {
45  PainterPaths = 0x01,
46  RichText = 0x02
47  };
48 
49 public:
50  RTextRenderer(const RTextBasedData& textData, bool draft, RTextRenderer::Target target, double fontHeightFactor = 1.0);
51 
52  void renderSimple();
53  void render();
54 
55  QList<RPainterPath> getPainterPaths() const {
56  return painterPaths;
57  }
58 
59  RBox getBoundingBox() const {
60  return boundingBox;
61  }
62 
63  double getHeight() const {
64  return height;
65  }
66 
67  double getWidth() const {
68  return width;
69  }
70 
71  QString getRichText() const {
72  return richText;
73  }
74 
75 private:
76  QList<RPainterPath> getPainterPathsForBlock(
77  const QString& blockText,
78  const QList<QTextLayout::FormatRange>& formats,
79  double& horizontalAdvance,
80  double& horizontalAdvanceNoSpacing,
81  double& ascent,
82  double& descent);
83 
84  QList<RPainterPath> getPainterPathsForBlockTtf(
85  const QString& blockText,
86  const QList<QTextLayout::FormatRange>& formats,
87  double& horizontalAdvance,
88  double& horizontalAdvanceNoSpacing,
89  double& ascent,
90  double& descent);
91 
92  QList<RPainterPath> getPainterPathsForBlockCad(
93  const QString& blockText,
94  const QList<QTextLayout::FormatRange>& formats,
95  double& horizontalAdvance,
96  double& horizontalAdvanceNoSpacing,
97  double& ascent,
98  double& descent);
99 
100  QRectF getCharacterRect(const QString& fontName, const QChar& ch) const;
101  QRectF getCharacterRect(const QFont& font, const QChar& ch) const;
102 
103  QString getRichTextForBlock(const QString& blockText,
104  const QList<QTextLayout::FormatRange>& formats);
105 
106  void setBlockFont(const QString& f) {
107  if (!blockFont.isEmpty()) {
108  blockFont.top() = f;
109  }
110  }
111 
112  QString getBlockFont() const {
113  if (!blockFont.isEmpty()) {
114  return blockFont.top();
115  }
116  return "";
117  }
118 
119  void setUseCadFont(bool on) {
120  if (!useCadFont.isEmpty()) {
121  useCadFont.top() = on;
122  }
123  }
124 
125  bool getUseCadFont() const {
126  if (!useCadFont.isEmpty()) {
127  return useCadFont.top();
128  }
129  return false;
130  }
131 
132  void setBlockBold(bool on) {
133  if (!blockBold.isEmpty()) {
134  blockBold.top() = on;
135  }
136  }
137 
138  bool getBlockBold() const {
139  if (!blockBold.isEmpty()) {
140  return blockBold.top();
141  }
142  return false;
143  }
144 
145  void setBlockItalic(bool on) {
146  if (!blockItalic.isEmpty()) {
147  blockItalic.top() = on;
148  }
149  }
150 
151  bool getBlockItalic() const {
152  if (!blockItalic.isEmpty()) {
153  return blockItalic.top();
154  }
155  return false;
156  }
157 
158  void setBlockHeight(double h) {
159  if (!blockHeight.isEmpty()) {
160  blockHeight.top() = h;
161  }
162  }
163 
164  double getBlockHeight() const {
165  if (!blockHeight.isEmpty()) {
166  return blockHeight.top();
167  }
168  return 1.0;
169  }
170 
171  void setCurrentFormat(QTextCharFormat f) {
172  if (!currentFormat.isEmpty()) {
173  currentFormat.top() = f;
174  }
175  }
176 
177  QTextCharFormat getCurrentFormat() const {
178  if (!currentFormat.isEmpty()) {
179  return currentFormat.top();
180  }
181  return QTextCharFormat();
182  }
183 
184 public:
185  static QString rxLineFeed;
186  static QString rxParagraphFeed;
187  static QString rxHeightChange;
188  //static QString rxRelativeHeightChange;
189  static QString rxStackedText;
190  static QString rxColorChangeIndex;
191  static QString rxColorChangeCustom;
192  static QString rxNonBreakingSpace;
193  static QString rxOverlineOn;
194  static QString rxOverlineOff;
195  static QString rxUnderlineOn;
196  static QString rxUnderlineOff;
197  static QString rxWidthChange;
198  static QString rxObliqueAngleChange;
199  static QString rxTrackChange;
200  static QString rxAlignmentChange;
201  static QString rxFontChangeCad;
202  static QString rxFontChangeTtf;
203  static QString rxBeginBlock;
204  static QString rxEndBlock;
205  static QString rxBackslash;
206  static QString rxCurlyOpen;
207  static QString rxCurlyClose;
208  static QString rxDegree;
209  static QString escDegree;
210  static QString rxPlusMinus;
211  static QString escPlusMinus;
212  static QString rxDiameter;
213  static QString escDiameter;
214  static QString rxUnderlined;
215  static QString rxUnicode;
216 
217  static QString rxAll;
218 
219  static QChar chDegree;
220  static QChar chPlusMinus;
221  static QChar chDiameter;
222 
223 private:
225 
227  QList<RPainterPath> painterPaths;
229  double height;
230  double width;
231  bool draft;
232  QString richText;
234 
235  QStack<bool> useCadFont;
236  QStack<QTextCharFormat> currentFormat;
237  QStack<double> blockHeight;
238  QStack<QString> blockFont;
239  QStack<bool> blockBold;
240  QStack<bool> blockItalic;
241  QStack<QStringList> openTags;
242 };
243 
247 
248 #endif