1 /****************************************************************************
2 **
3 ** This file is part of the LibreCAD project, a 2D CAD program
4 **
5 ** Copyright (C) 2010 R. van Twisk (librecad@rvt.dds.nl)
6 ** Copyright (C) 2001-2003 RibbonSoft. All rights reserved.
7 **
8 **
9 ** This file may be distributed and/or modified under the terms of the
10 ** GNU General Public License version 2 as published by the Free Software
11 ** Foundation and appearing in the file gpl-2.0.txt included in the
12 ** packaging of this file.
13 **
14 ** This program is distributed in the hope that it will be useful,
15 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
16 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 ** GNU General Public License for more details.
18 **
19 ** You should have received a copy of the GNU General Public License
20 ** along with this program; if not, write to the Free Software
21 ** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 **
23 ** This copyright notice MUST APPEAR in all copies of the script!
24 **
25 **********************************************************************/
26 #include "qg_dlgtext.h"
27
28 #include <QTextCodec>
29 #include <QTextStream>
30 #include <QFileDialog>
31 #include "rs_system.h"
32 #include "rs_settings.h"
33 #include "rs_font.h"
34 #include "rs_graphic.h"
35 #include "rs_math.h"
36
37 /*
38 * Constructs a QG_DlgText as a child of 'parent', with the
39 * name 'name' and widget flags set to 'f'.
40 *
41 * The dialog will by default be modeless, unless you set 'modal' to
42 * true to construct a modal dialog.
43 */
QG_DlgText(QWidget * parent,bool modal,Qt::WindowFlags fl)44 QG_DlgText::QG_DlgText(QWidget* parent, bool modal, Qt::WindowFlags fl)
45 : QDialog(parent, fl), saveSettings(true)
46 {
47 setModal(modal);
48 setupUi(this);
49
50 init();
51 }
52
53 /*
54 * Destroys the object and frees any allocated resources
55 */
~QG_DlgText()56 QG_DlgText::~QG_DlgText()
57 {
58 destroy();
59 // no need to delete child widgets, Qt does it all for us
60 }
61
62 /*
63 * Sets the strings of the subwidgets using the current
64 * language.
65 */
languageChange()66 void QG_DlgText::languageChange()
67 {
68 retranslateUi(this);
69 }
70
init()71 void QG_DlgText::init() {
72 cbFont->init();
73 font=NULL;
74 text = NULL;
75 isNew = false;
76 leOblique->setDisabled(true);
77 updateUniCharComboBox(0);
78 updateUniCharButton(0);
79 }
80
81
updateUniCharComboBox(int)82 void QG_DlgText::updateUniCharComboBox(int) {
83 QString t = cbUniPage->currentText();
84 int i1 = t.indexOf('-');
85 int i2 = t.indexOf(']');
86 int min = t.mid(1, i1-1).toInt(NULL, 16);
87 int max = t.mid(i1+1, i2-i1-1).toInt(NULL, 16);
88
89 cbUniChar->clear();
90 for (int c=min; c<=max; c++) {
91 char buf[5];
92 snprintf(buf, 5, "%04X", c);
93 cbUniChar->addItem(QString("[%1] %2").arg(buf).arg(QChar(c)));
94 }
95 }
96
97 //set saveText to false, so, settings won't be saved during destroy, feature request#3445306
reject()98 void QG_DlgText::reject() {
99 saveSettings=false;
100 QDialog::reject();
101 }
102
destroy()103 void QG_DlgText::destroy() {
104 if (isNew&&saveSettings) {
105 RS_SETTINGS->beginGroup("/Draw");
106 RS_SETTINGS->writeEntry("/TextHeight", leHeight->text());
107 RS_SETTINGS->writeEntry("/TextFont", cbFont->currentText());
108 RS_SETTINGS->writeEntry("/TextAlignmentT", getAlignment());
109 RS_SETTINGS->writeEntry("/TextWidthRelation", leWidthRel->text());
110 RS_SETTINGS->writeEntry("/TextStringT", teText->text());
111 RS_SETTINGS->writeEntry("/TextAngle", leAngle->text());
112 RS_SETTINGS->endGroup();
113 }
114 }
115
116
117 /**
118 * Sets the text entity represented by this dialog.
119 */
setText(RS_Text & t,bool isNew)120 void QG_DlgText::setText(RS_Text& t, bool isNew) {
121 text = &t;
122 this->isNew = isNew;
123
124 QString fon;
125 QString height;
126 QString def;
127 QString alignment;
128 //QString letterSpacing;
129 //QString wordSpacing;
130 QString widthRelation;
131 QString str;
132 //QString shape;
133 QString angle;
134
135 if (isNew) {
136 wPen->hide();
137 lLayer->hide();
138 cbLayer->hide();
139 RS_SETTINGS->beginGroup("/Draw");
140 //default font depending on locale
141 //default font depending on locale (RLZ-> check this: QLocale::system().name() returns "fr_FR")
142 QByteArray iso = RS_System::localeToISO( QLocale::system().name().toLocal8Bit() );
143 // QByteArray iso = RS_System::localeToISO( QTextCodec::locale() );
144 if (iso=="ISO8859-1") {
145 fon = RS_SETTINGS->readEntry("/TextFont", "normallatin1");
146 } else if (iso=="ISO8859-2") {
147 fon = RS_SETTINGS->readEntry("/TextFont", "normallatin2");
148 } else if (iso=="ISO8859-7") {
149 fon = RS_SETTINGS->readEntry("/TextFont", "greekc");
150 } else if (iso=="KOI8-U" || iso=="KOI8-R") {
151 fon = RS_SETTINGS->readEntry("/TextFont", "cyrillic_ii");
152 } else {
153 fon = RS_SETTINGS->readEntry("/TextFont", "standard");
154 }
155 height = RS_SETTINGS->readEntry("/TextHeight", "1.0");
156 def = RS_SETTINGS->readEntry("/TextDefault", "1");
157 alignment = RS_SETTINGS->readEntry("/TextAlignmentT", "7");
158 widthRelation = RS_SETTINGS->readEntry("/TextWidthRelation", "1");
159 str = RS_SETTINGS->readEntry("/TextStringT", "");
160 angle = RS_SETTINGS->readEntry("/TextAngle", "0");
161 RS_SETTINGS->endGroup();
162 } else {
163 fon = text->getStyle();
164 setFont(fon);
165 height = QString("%1").arg(text->getHeight());
166 widthRelation = QString("%1").arg(text->getWidthRel());
167 alignment = QString("%1").arg(text->getAlignment());
168 str = text->getText();
169 angle = QString("%1").arg(RS_Math::rad2deg(text->getAngle()));
170 wPen->setPen(text->getPen(false), true, false, "Pen");
171 RS_Graphic* graphic = text->getGraphic();
172 if (graphic) {
173 cbLayer->init(*(graphic->getLayerList()), false, false);
174 }
175 RS_Layer* lay = text->getLayer(false);
176 if (lay) {
177 cbLayer->setLayer(*lay);
178 }
179 }
180
181 setFont(fon);
182 leHeight->setText(height);
183 setAlignment(alignment.toInt());
184 // setwidthRel(widthRelation.toDouble());
185 leWidthRel->setText(widthRelation);
186 teText->setText(str);
187 leAngle->setText(angle);
188 teText->setFocus();
189 teText->selectAll();
190 }
191
192
193 /**
194 * Updates the text entity represented by the dialog to fit the choices of the user.
195 */
updateText()196 void QG_DlgText::updateText() {
197 if (text) {
198 text->setStyle(cbFont->currentText());
199 text->setHeight(leHeight->text().toDouble());
200 text->setWidthRel(leWidthRel->text().toDouble());
201
202 text->setText(teText->text());
203 text->setAlignment(getAlignment());
204 text->setAngle(RS_Math::deg2rad(leAngle->text().toDouble()));
205 }
206 if (text && !isNew) {
207 text->setPen(wPen->getPen());
208 text->setLayer(cbLayer->currentText());
209 text->update();
210 }
211 }
212
213
214 /*void QG_DlgText::setwidthRel(double rel) {
215 lWidthRel->setText(rel);
216 }*/
217
setAlignmentTL()218 void QG_DlgText::setAlignmentTL() {
219 setAlignment(1);
220 }
221
setAlignmentTC()222 void QG_DlgText::setAlignmentTC() {
223 setAlignment(2);
224 }
225
setAlignmentTR()226 void QG_DlgText::setAlignmentTR() {
227 setAlignment(3);
228 }
229
setAlignmentML()230 void QG_DlgText::setAlignmentML() {
231 setAlignment(4);
232 }
233
setAlignmentMC()234 void QG_DlgText::setAlignmentMC() {
235 setAlignment(5);
236 }
237
setAlignmentMR()238 void QG_DlgText::setAlignmentMR() {
239 setAlignment(6);
240 }
241
setAlignmentLL()242 void QG_DlgText::setAlignmentLL() {
243 setAlignment(7);
244 }
245
setAlignmentLC()246 void QG_DlgText::setAlignmentLC() {
247 setAlignment(8);
248 }
249
setAlignmentLR()250 void QG_DlgText::setAlignmentLR() {
251 setAlignment(9);
252 }
253
setAlignmentBL()254 void QG_DlgText::setAlignmentBL() {
255 setAlignment(10);
256 }
257
setAlignmentBC()258 void QG_DlgText::setAlignmentBC() {
259 setAlignment(11);
260 }
261
setAlignmentBR()262 void QG_DlgText::setAlignmentBR() {
263 setAlignment(12);
264 }
265
setAlignmentFit()266 void QG_DlgText::setAlignmentFit() {
267 setAlignment(13);
268 }
269
setAlignmentAlign()270 void QG_DlgText::setAlignmentAlign() {
271 setAlignment(14);
272 }
273
setAlignmentMiddle()274 void QG_DlgText::setAlignmentMiddle() {
275 setAlignment(15);
276 }
277
setAlignment(int a)278 void QG_DlgText::setAlignment(int a) {
279 bTL->setChecked(false);
280 bTC->setChecked(false);
281 bTR->setChecked(false);
282 bML->setChecked(false);
283 bMC->setChecked(false);
284 bMR->setChecked(false);
285 bLL->setChecked(false);
286 bLC->setChecked(false);
287 bLR->setChecked(false);
288 bBL->setChecked(false);
289 bBC->setChecked(false);
290 bBR->setChecked(false);
291 rbFit->setChecked(false);
292 rbAligned->setChecked(false);
293 rbMiddle->setChecked(false);
294
295 switch (a) {
296 case 1:
297 bTL->setChecked(true);
298 break;
299 case 2:
300 bTC->setChecked(true);
301 break;
302 case 3:
303 bTR->setChecked(true);
304 break;
305 case 4:
306 bML->setChecked(true);
307 break;
308 case 5:
309 bMC->setChecked(true);
310 break;
311 case 6:
312 bMR->setChecked(true);
313 break;
314 case 7:
315 bLL->setChecked(true);
316 break;
317 case 8:
318 bLC->setChecked(true);
319 break;
320 case 9:
321 bLR->setChecked(true);
322 break;
323 case 10:
324 bBL->setChecked(true);
325 break;
326 case 11:
327 bBC->setChecked(true);
328 break;
329 case 12:
330 bBR->setChecked(true);
331 break;
332 case 13:
333 rbFit->setChecked(true);
334 break;
335 case 14:
336 rbAligned->setChecked(true);
337 break;
338 case 15:
339 rbMiddle->setChecked(true);
340 break;
341 default:
342 break;
343 }
344 }
345
getAlignment()346 int QG_DlgText::getAlignment() {
347 if (bTL->isChecked()) {
348 return 1;
349 } else if (bTC->isChecked()) {
350 return 2;
351 } else if (bTR->isChecked()) {
352 return 3;
353 } else if (bML->isChecked()) {
354 return 4;
355 } else if (bMC->isChecked()) {
356 return 5;
357 } else if (bMR->isChecked()) {
358 return 6;
359 } else if (bLL->isChecked()) {
360 return 7;
361 } else if (bLC->isChecked()) {
362 return 8;
363 } else if (bLR->isChecked()) {
364 return 9;
365 } else if (bBL->isChecked()) {
366 return 10;
367 } else if (bBC->isChecked()) {
368 return 11;
369 } else if (bBR->isChecked()) {
370 return 12;
371 } else if (rbFit->isChecked()) {
372 return 13;
373 } else if (rbAligned->isChecked()) {
374 return 14;
375 } else if (rbMiddle->isChecked()) {
376 return 15;
377 }
378
379 return 7;
380 }
381
setFont(const QString & f)382 void QG_DlgText::setFont(const QString& f) {
383 cbFont->setCurrentIndex( cbFont->findText(f) );
384 font = cbFont->getFont();
385 // defaultChanged(false);
386 }
387
388 /*void QG_DlgText::defaultChanged(bool) {
389 if (cbDefault->isChecked() && font) {
390 leLineSpacingFactor->setText(
391 QString("%1").arg(font->getLineSpacingFactor()));
392 }
393 }*/
394
loadText()395 void QG_DlgText::loadText() {
396 QString fn = QFileDialog::getOpenFileName( this, QString(), QString());
397 if (!fn.isEmpty()) {
398 load(fn);
399 }
400 }
401
load(const QString & fn)402 void QG_DlgText::load(const QString& fn) {
403 QFile f(fn);
404 if (!f.open(QIODevice::ReadOnly)) {
405 return;
406 }
407
408 QTextStream ts(&f);
409 teText->setText(ts.readAll());
410 }
411
saveText()412 void QG_DlgText::saveText() {
413 QString fn = QFileDialog::getSaveFileName(this, QString(), QString());
414 if (!fn.isEmpty()) {
415 save(fn);
416 }
417 }
418
save(const QString & fn)419 void QG_DlgText::save(const QString& fn) {
420 QString text = teText->text();
421 QFile f(fn);
422 if (f.open(QIODevice::WriteOnly)) {
423 QTextStream t(&f);
424 t << text;
425 f.close();
426 }
427 }
428
insertSymbol(int)429 void QG_DlgText::insertSymbol(int) {
430 QString str = cbSymbol->currentText();
431 int i=str.indexOf('(');
432 if (i!=-1) {
433 // teText->textCursor().insertText(QString("%1").arg(str.at(i+1)));
434 teText->insert(QString("%1").arg(str.at(i+1)));
435 }
436 }
437
updateUniCharButton(int)438 void QG_DlgText::updateUniCharButton(int) {
439 QString t = cbUniChar->currentText();
440 int i1 = t.indexOf(']');
441 int c = t.mid(1, i1-1).toInt(NULL, 16);
442 bUnicode->setText(QString("%1").arg(QChar(c)));
443 }
444
insertChar()445 void QG_DlgText::insertChar() {
446 QString t = cbUniChar->currentText();
447 int i1 = t.indexOf(']');
448 int c = t.mid(1, i1-1).toInt(NULL, 16);
449 // teText->textCursor().insertText( QString("%1").arg(QChar(c)) );
450 teText->insert( QString("%1").arg(QChar(c)) );
451 }
452
453