]> Shamusworld >> Repos - architektonas/blob - src/forms/dlgtext.cpp
c3299bc626849ae9025de2213f2fdd7ec6333a38
[architektonas] / src / forms / dlgtext.cpp
1 // dlgtext.cpp
2 //
3 // Part of the Architektonas Project
4 // Originally part of QCad Community Edition by Andrew Mustun
5 // Extensively rewritten and refactored by James L. Hammons
6 // (C) 2010 Underground Software
7 //
8 // JLH = James L. Hammons <jlhamm@acm.org>
9 //
10 // Who  When        What
11 // ---  ----------  -----------------------------------------------------------
12 // JLH  05/28/2010  Created this file. :-)
13 //
14
15 #include "dlgtext.h"
16
17 #include "rs_filterdxf.h"
18 #include "rs_font.h"
19 #include "rs_system.h"
20 #include "rs_text.h"
21 #include "settings.h"
22
23 DlgText::DlgText(QWidget * parent/*= 0*/, Qt::WindowFlags flags/*= 0*/):
24         QDialog(parent, flags)
25 {
26         ui.setupUi(this);
27
28         ui.cbFont->init();
29         font = NULL;
30         text = NULL;
31         isNew = false;
32         updateUniCharComboBox(0);
33         updateUniCharButton(0);
34 }
35
36 DlgText::~DlgText()
37 {
38         if (isNew)
39         {
40                 settings.beginGroup("Draw");
41                 settings.setValue("TextHeight", ui.leHeight->text());
42                 settings.setValue("TextFont", ui.cbFont->currentText());
43                 settings.setValue("TextDefault", ui.cbDefault->isChecked());
44                 settings.setValue("TextAlignment", getAlignment());
45                 //settings.setValue("/TextLetterSpacing", leLetterSpacing->text());
46                 //settings.setValue("/TextWordSpacing", leWordSpacing->text());
47                 settings.setValue("TextLineSpacingFactor", ui.leLineSpacingFactor->text());
48 //              settings.setValue("TextString", ui.teText->text());
49                 settings.setValue("TextString", ui.teText->toPlainText());
50                 //settings.setValue("/TextShape", getShape());
51                 settings.setValue("TextAngle", ui.leAngle->text());
52                 //settings.setValue("/TextRadius", leRadius->text());
53                 settings.endGroup();
54         }
55 }
56
57 void DlgText::updateUniCharComboBox(int)
58 {
59         QString t = ui.cbUniPage->currentText();
60 //      int i1 = t.find('-');
61         int i1 = t.indexOf('-');
62 //      int i2 = t.find(']');
63         int i2 = t.indexOf(']');
64         int min = t.mid(1, i1 - 1).toInt(NULL, 16);
65         int max = t.mid(i1 + 1, i2 - i1 - 1).toInt(NULL, 16);
66         ui.cbUniChar->clear();
67
68         for(int c=min; c<=max; c++)
69         {
70                 char buf[5];
71                 sprintf(buf, "%04X", c);
72 //              ui.cbUniChar->insertItem(QString("[%1] %2").arg(buf).arg(QChar(c)));
73                 ui.cbUniChar->addItem(QString("[%1] %2").arg(buf).arg(QChar(c)));
74         }
75 }
76
77 /**
78  * Sets the text entity represented by this dialog.
79  */
80 void DlgText::setText(RS_Text & t, bool isNew)
81 {
82         text = &t;
83         this->isNew = isNew;
84
85         QString fon;
86         QString height;
87         QString def;
88         QString alignment;
89         //QString letterSpacing;
90         //QString wordSpacing;
91         QString lineSpacingFactor;
92         QString str;
93         //QString shape;
94         QString angle;
95
96         if (isNew)
97         {
98                 settings.beginGroup("Draw");
99                 //default font depending on locale
100 //              Q3CString iso = RS_System::localeToISO( QTextCodec::locale() );
101 //              QString iso = RS_System::localeToISO(QTextCodec::locale());
102                 QString iso = RS_System::localeToISO(QLocale::system().name());
103
104                 if (iso == "ISO8859-1")
105                         fon = settings.value("TextFont", "normallatin1").toString();
106                 else if (iso == "ISO8859-2")
107                         fon = settings.value("TextFont", "normallatin2").toString();
108                 else if (iso == "ISO8859-7")
109                         fon = settings.value("TextFont", "greekc").toString();
110                 else if (iso == "KOI8-U" || iso == "KOI8-R")
111                         fon = settings.value("TextFont", "cyrillic_ii").toString();
112                 else
113                         fon = settings.value("TextFont", "standard").toString();
114
115                 height = settings.value("TextHeight", "1.0").toString();
116                 def = settings.value("TextDefault", true).toBool();
117                 alignment = settings.value("TextAlignment", 1).toInt();
118                 //letterSpacing = settings.value("/TextLetterSpacing", "0");
119                 //wordSpacing = settings.value("/TextWordSpacing", "0");
120                 lineSpacingFactor = settings.value("TextLineSpacingFactor", "1").toString();
121                 str = settings.value("TextString", "").toString();
122                 //shape = settings.value("/TextShape", "0");
123                 angle = settings.value("TextAngle", "0").toString();
124                 //radius = settings.value("/TextRadius", "10");
125                 settings.endGroup();
126         }
127         else
128         {
129                 fon = text->getStyle();
130                 setFont(fon);
131                 height = QString("%1").arg(text->getHeight());
132
133                 if (font != NULL)
134                 {
135                         if (font->getLineSpacingFactor() == text->getLineSpacingFactor())
136                                 def = "1";
137                         else
138                                 def = "0";
139                 }
140
141                 alignment = QString("%1").arg(text->getAlignment());
142                 //QString letterSpacing = settings.value("/TextLetterSpacing", "0");
143                 //QString wordSpacing = settings.value("/TextWordSpacing", "0");
144                 lineSpacingFactor = QString("%1").arg(text->getLineSpacingFactor());
145
146                 str = text->getText();
147                 //QString shape = settings.value("/TextShape", "0");
148                 angle = QString("%1").arg(RS_Math::rad2deg(text->getAngle()));
149         }
150
151         ui.cbDefault->setChecked(def == "1");
152         setFont(fon);
153         ui.leHeight->setText(height);
154         setAlignment(alignment.toInt());
155
156         if (def != "1" || font == NULL)
157         {
158                 //leLetterSpacing->setText(letterSpacing);
159                 //leWordSpacing->setText(wordSpacing);
160                 ui.leLineSpacingFactor->setText(lineSpacingFactor);
161         }
162         else
163         {
164                 //leLetterSpacing->setText(font->getLetterSpacing());
165                 //leWordSpacing->setText(font->getWordSpacing());
166                 ui.leLineSpacingFactor->setText(QString("%1").arg(font->getLineSpacingFactor()));
167         }
168
169 //      ui.teText->setText(str);
170         ui.teText->setPlainText(str);
171         //setShape(shape.toInt());
172         ui.leAngle->setText(angle);
173         //leRadius->setText(radius);
174         ui.teText->setFocus();
175         ui.teText->selectAll();
176 }
177
178 /**
179  * Updates the text entity represented by the dialog to fit the choices of the user.
180  */
181 void DlgText::updateText()
182 {
183         if (text != NULL)
184         {
185                 text->setStyle(ui.cbFont->currentText());
186                 text->setHeight(ui.leHeight->text().toDouble());
187 //              text->setText(RS_FilterDXF::toNativeString(ui.teText->text()));
188                 text->setText(RS_FilterDXF::toNativeString(ui.teText->toPlainText()));
189                 //text->setLetterSpacing(leLetterSpacing.toDouble());
190                 text->setLineSpacingFactor(ui.leLineSpacingFactor->text().toDouble());
191                 text->setAlignment(getAlignment());
192                 text->setAngle(RS_Math::deg2rad(ui.leAngle->text().toDouble()));
193         }
194 }
195
196 void DlgText::setAlignmentTL()
197 {
198         setAlignment(1);
199 }
200
201 void DlgText::setAlignmentTC()
202 {
203         setAlignment(2);
204 }
205
206 void DlgText::setAlignmentTR()
207 {
208         setAlignment(3);
209 }
210
211 void DlgText::setAlignmentML()
212 {
213         setAlignment(4);
214 }
215
216 void DlgText::setAlignmentMC()
217 {
218         setAlignment(5);
219 }
220
221 void DlgText::setAlignmentMR()
222 {
223         setAlignment(6);
224 }
225
226 void DlgText::setAlignmentBL()
227 {
228         setAlignment(7);
229 }
230
231 void DlgText::setAlignmentBC()
232 {
233         setAlignment(8);
234 }
235
236 void DlgText::setAlignmentBR()
237 {
238         setAlignment(9);
239 }
240
241 void DlgText::setAlignment(int a)
242 {
243         ui.bTL->setChecked(false);
244         ui.bTC->setChecked(false);
245         ui.bTR->setChecked(false);
246         ui.bML->setChecked(false);
247         ui.bMC->setChecked(false);
248         ui.bMR->setChecked(false);
249         ui.bBL->setChecked(false);
250         ui.bBC->setChecked(false);
251         ui.bBR->setChecked(false);
252
253         switch (a)
254         {
255         case 1:
256                 ui.bTL->setChecked(true);
257                 break;
258         case 2:
259                 ui.bTC->setChecked(true);
260                 break;
261         case 3:
262                 ui.bTR->setChecked(true);
263                 break;
264         case 4:
265                 ui.bML->setChecked(true);
266                 break;
267         case 5:
268                 ui.bMC->setChecked(true);
269                 break;
270         case 6:
271                 ui.bMR->setChecked(true);
272                 break;
273         case 7:
274                 ui.bBL->setChecked(true);
275                 break;
276         case 8:
277                 ui.bBC->setChecked(true);
278                 break;
279         case 9:
280                 ui.bBR->setChecked(true);
281                 break;
282         default:
283                 break;
284         }
285 }
286
287 int DlgText::getAlignment()
288 {
289         if (ui.bTL->isChecked())
290                 return 1;
291         else if (ui.bTC->isChecked())
292                 return 2;
293         else if (ui.bTR->isChecked())
294                 return 3;
295         else if (ui.bML->isChecked())
296                 return 4;
297         else if (ui.bMC->isChecked())
298                 return 5;
299         else if (ui.bMR->isChecked())
300                 return 6;
301         else if (ui.bBL->isChecked())
302                 return 7;
303         else if (ui.bBC->isChecked())
304                 return 8;
305         else if (ui.bBR->isChecked())
306                 return 9;
307
308         return 1;
309 }
310
311 void DlgText::setFont(const QString & f)
312 {
313 //      ui.cbFont->setCurrentText(f);
314         ui.cbFont->setItemText(ui.cbFont->currentIndex(), f);
315         font = ui.cbFont->getFont();
316         defaultChanged(false);
317 }
318
319 /*
320 void DlgText::setShape(int s) {
321     switch (s) {
322     case 0:
323         rbStraight->setChecked(true);
324         break;
325     case 1:
326         rbRound1->setChecked(true);
327         break;
328     case 2:
329         rbRound2->setChecked(true);
330         break;
331     default:
332         break;
333     }
334 }
335
336 int DlgText::getShape() {
337     if (rbStraight->isOn()) {
338         return 0;
339     } else if (rbRound1->isOn()) {
340         return 1;
341     } else if (rbRound2->isOn()) {
342         return 2;
343     }
344     return 1;
345 }
346 */
347
348 void DlgText::defaultChanged(bool)
349 {
350         if (ui.cbDefault->isChecked() && font != NULL)
351                 ui.leLineSpacingFactor->setText(QString("%1").arg(font->getLineSpacingFactor()));
352 }
353
354 void DlgText::loadText()
355 {
356 //      QString fn = Q3FileDialog::getOpenFileName(QString::null, QString::null, this);
357         QString fn = QFileDialog::getOpenFileName(this);
358
359         if (!fn.isEmpty())
360                 load(fn);
361 }
362
363 void DlgText::load(const QString & fn)
364 {
365         QFile f(fn);
366
367         if (!f.open(QIODevice::ReadOnly))
368                 return;
369
370 //      Q3TextStream ts(&f);
371         QTextStream ts(&f);
372 //      ui.teText->setText(ts.readAll());
373         ui.teText->setPlainText(ts.readAll());
374 }
375
376 void DlgText::saveText()
377 {
378 //      QString fn = Q3FileDialog::getSaveFileName(QString::null, QString::null, this);
379         QString fn = QFileDialog::getSaveFileName(this);
380
381         if (!fn.isEmpty())
382                 save(fn);
383 }
384
385 void DlgText::save(const QString & fn)
386 {
387 //      QString text = ui.teText->text();
388         QString text = ui.teText->toPlainText();
389         QFile f(fn);
390
391         if (f.open(QIODevice::WriteOnly))
392         {
393 //              Q3TextStream t(&f);
394                 QTextStream t(&f);
395                 t << text;
396                 f.close();
397         }
398 }
399
400 void DlgText::insertSymbol(int)
401 {
402         QString str = ui.cbSymbol->currentText();
403 //      int i = str.find('(');
404         int i = str.indexOf('(');
405
406         if (i != -1)
407 //              ui.teText->insert(QString("%1").arg(str.at(i + 1)));
408                 ui.teText->insertPlainText(QString("%1").arg(str.at(i + 1)));
409 }
410
411 void DlgText::updateUniCharButton(int)
412 {
413         QString t = ui.cbUniChar->currentText();
414 //      int i1 = t.find(']');
415         int i1 = t.indexOf(']');
416         int c = t.mid(1, i1 - 1).toInt(NULL, 16);
417         ui.bUnicode->setText(QString("%1").arg(QChar(c)));
418 }
419
420 void DlgText::insertChar()
421 {
422         QString t = ui.cbUniChar->currentText();
423 //      int i1 = t.find(']');
424         int i1 = t.indexOf(']');
425         int c = t.mid(1, i1 - 1).toInt(NULL, 16);
426 //      ui.teText->insert(QString("%1").arg(QChar(c)));
427         ui.teText->insertPlainText(QString("%1").arg(QChar(c)));
428 }