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  void preparePath(RPainterPath& path,
101  const RColor& color,
102  double cursor,
103  double cxfScale);
104 
105  QRectF getCharacterRect(const QString& fontName, const QChar& ch) const;
106  QRectF getCharacterRect(const QFont& font, const QChar& ch) const;
107 
108  QString getRichTextForBlock(const QString& blockText,
109  const QList<QTextLayout::FormatRange>& formats);
110 
111  void setBlockFont(const QString& f) {
112  if (!blockFont.isEmpty()) {
113  blockFont.top() = f;
114  }
115  }
116 
117  QString getBlockFont() const {
118  if (!blockFont.isEmpty()) {
119  return blockFont.top();
120  }
121  return "";
122  }
123 
124  void setUseCadFont(bool on) {
125  if (!useCadFont.isEmpty()) {
126  useCadFont.top() = on;
127  }
128  }
129 
130  bool getUseCadFont() const {
131  if (!useCadFont.isEmpty()) {
132  return useCadFont.top();
133  }
134  return false;
135  }
136 
137  void setBlockBold(bool on) {
138  if (!blockBold.isEmpty()) {
139  blockBold.top() = on;
140  }
141  }
142 
143  bool getBlockBold() const {
144  if (!blockBold.isEmpty()) {
145  return blockBold.top();
146  }
147  return false;
148  }
149 
150  void setBlockItalic(bool on) {
151  if (!blockItalic.isEmpty()) {
152  blockItalic.top() = on;
153  }
154  }
155 
156  bool getBlockItalic() const {
157  if (!blockItalic.isEmpty()) {
158  return blockItalic.top();
159  }
160  return false;
161  }
162 
163  void setBlockHeight(double h) {
164  if (!blockHeight.isEmpty()) {
165  blockHeight.top() = h;
166  }
167  }
168 
169  double getBlockHeight() const {
170  if (!blockHeight.isEmpty()) {
171  return blockHeight.top();
172  }
173  return 1.0;
174  }
175 
176  void setCurrentFormat(QTextCharFormat f) {
177  if (!currentFormat.isEmpty()) {
178  currentFormat.top() = f;
179  }
180  }
181 
182  QTextCharFormat getCurrentFormat() const {
183  if (!currentFormat.isEmpty()) {
184  return currentFormat.top();
185  }
186  return QTextCharFormat();
187  }
188 
189 public:
190  static QString rxLineFeed;
191  static QString rxParagraphFeed;
192  static QString rxHeightChange;
193  //static QString rxRelativeHeightChange;
194  static QString rxStackedText;
195  static QString rxColorChangeIndex;
196  static QString rxColorChangeCustom;
197  static QString rxNonBreakingSpace;
198  static QString rxOverlineOn;
199  static QString rxOverlineOff;
200  static QString rxUnderlineOn;
201  static QString rxUnderlineOff;
202  static QString rxWidthChange;
203  static QString rxObliqueAngleChange;
204  static QString rxTrackChange;
205  static QString rxAlignmentChange;
206  static QString rxFontChangeCad;
207  static QString rxFontChangeTtf;
208  static QString rxBeginBlock;
209  static QString rxEndBlock;
210  static QString rxBackslash;
211  static QString rxCurlyOpen;
212  static QString rxCurlyClose;
213  static QString rxDegree;
214  static QString escDegree;
215  static QString rxPlusMinus;
216  static QString escPlusMinus;
217  static QString rxDiameter;
218  static QString escDiameter;
219  static QString rxUnderlined;
220  static QString rxUnicode;
221 
222  static QString rxAll;
223 
224  static QChar chDegree;
225  static QChar chPlusMinus;
226  static QChar chDiameter;
227 
228 private:
230 
232  QList<RPainterPath> painterPaths;
234  double height;
235  double width;
236  bool draft;
237  QString richText;
239 
240  QStack<bool> useCadFont;
241  QStack<QTextCharFormat> currentFormat;
242  QStack<double> blockHeight;
243  QStack<QString> blockFont;
244  QStack<bool> blockBold;
245  QStack<bool> blockItalic;
246  QStack<QStringList> openTags;
247 };
248 
252 
253 #endif