1 #include "mainwidget.h"
2 #include "ui_mainwidget.h"
3 #include "buttexts.h"
4 #include "dialogsettings.h"
5 #include "functors.h"
6
GetHFButton(int h)7 inline int GetHFButton(int h)
8 {
9 return h - DIFF_HEIGHT > MIN_HEIGHT? h - DIFF_HEIGHT: MIN_HEIGHT;
10 }
11
12
13 //----------------------------------------------------------------------------------------------------------------------
MainWidget(QWidget * parent)14 MainWidget::MainWidget(QWidget *parent) :
15 QWidget(parent, Qt::WindowMinimizeButtonHint | Qt::WindowCloseButtonHint),
16 ui(new Ui::MainWidget), loger(log_dirname, log_filename)
17 {
18 ui->setupUi(this);
19
20 settings.loadSettings();
21
22 this->setContentsMargins(spacing / 2, 0, spacing / 2, spacing / 2);
23
24 setWindowIcon(QIcon(":/Icons/Icons/Calculator-50.png"));
25
26 //QApplication::setStyle("fusion");
27 QApplication::setStyle("freeze");
28
29 CreateMenus();
30 CreateWidgets();
31 InitLocale();
32 DefaultKeysMap();
33
34 parser->SetVariable("default_color", "#000000", e_type_var::STRING);
35 parser->SetVariable("number_color", String(pb.getColor(Pnl::Dig)->name().toStdString().c_str()), e_type_var::STRING);
36 parser->SetVariable("function_color", String(pb.getColor(Pnl::Func)->name().toStdString().c_str()), e_type_var::STRING);
37 parser->SetVariable("delimiter_color", String(pb.getColor(Pnl::Op)->name().toStdString().c_str()), e_type_var::STRING);
38
39 SendKey(Qt::Key_F3); //Rad
40 SendKey(Qt::Key_F6); //Dec
41
42 EnableLogList();
43
44 LoadMemory();
45 LoadExpression();
46
47 this->setFocus();
48 }
49
50
51 //----------------------------------------------------------------------------------------------------------------------
~MainWidget()52 MainWidget::~MainWidget()
53 {
54 SaveExpression(parser->GetExpression() + (wDisplay->result().isEmpty()? "": " ="));
55 settings.saveSettings();
56
57 delete cbxlogList;
58 delete ui;
59 delete parser;
60 delete mePress;
61 delete meRelease;
62 }
63
64
65 //----------------------------------------------------------------------------------------------------------------------
ReCreateMouseEvents()66 void MainWidget::ReCreateMouseEvents()
67 {
68 delete mePress;
69 delete meRelease;
70
71 mePress = new QMouseEvent(QEvent::MouseButtonPress, posMousePress, Qt::LeftButton,
72 Qt::LeftButton, Qt::NoModifier);
73 meRelease = new QMouseEvent(QEvent::MouseButtonRelease, posMousePress, Qt::LeftButton,
74 Qt::LeftButton, Qt::NoModifier);
75 }
76
77
78 //----------------------------------------------------------------------------------------------------------------------
isLoging()79 bool MainWidget::isLoging()
80 {
81 return (settings.getSetting("Loging").toBool());
82 }
83
84
85 //----------------------------------------------------------------------------------------------------------------------
isLogList()86 bool MainWidget::isLogList()
87 {
88 return (settings.getSetting("logList").toBool() && cbxlogList != nullptr);
89 }
90
91
92 //----------------------------------------------------------------------------------------------------------------------
EnableLogList()93 void MainWidget::EnableLogList()
94 {
95 if(cbxlogList != nullptr)
96 cbxlogList->setVisible(settings.getSetting("logList").toBool());
97 }
98
99
100 //----------------------------------------------------------------------------------------------------------------------
LoadMemory()101 void MainWidget::LoadMemory()
102 {
103 SetMemory(settings.getSetting("memory").toString());
104 }
105
106
107 //----------------------------------------------------------------------------------------------------------------------
SaveMemory(const QString & value)108 void MainWidget::SaveMemory(const QString& value)
109 {
110 settings.setSetting("memory", value);
111 settings.saveSettingsByKind(kindset::state);
112 }
113
114
115 //----------------------------------------------------------------------------------------------------------------------
CreateMenus(void)116 void MainWidget::CreateMenus(void)
117 {
118 MenuBar = new QMenuBar(this);
119 MenuBar->setContentsMargins(0, 0, 0, 0);
120
121 MenuView = new QMenu();
122 MenuEdit = new QMenu();
123 MenuHelp = new QMenu();
124 MenuLanguages = new QMenu();
125
126 MenuBar->addMenu(MenuView);
127 MenuBar->addMenu(MenuEdit);
128 MenuBar->addMenu(MenuHelp);
129
130 for (auto& s: sViews)
131 {
132 ActionViews.append(MenuView->addAction(s));
133 ActionViews.last()->setCheckable(true);
134 }
135 ActionViews.last()->setEnabled(false);
136 connect(MenuView, SIGNAL(triggered(QAction*)), SLOT(slotView(QAction*)));
137
138 for (auto& s: sLanguages)
139 {
140 ActionLanguages.append(MenuLanguages->addAction(s));
141 ActionLanguages.last()->setCheckable(true);
142 }
143 connect(MenuLanguages, SIGNAL(triggered(QAction*)), SLOT(slotLanguage(QAction*)));
144
145
146 ActionCopy = MenuEdit->addAction("", this, SLOT(slotCopy(void)), Qt::CTRL + Qt::Key_Insert);
147 ActionPaste = MenuEdit->addAction("", this, SLOT(slotPaste(void)), Qt::SHIFT + Qt::Key_Insert);
148 MenuEdit->addSeparator();
149 MenuEdit->addMenu(MenuLanguages);
150 ActionSettings = MenuEdit->addAction("", this, SLOT(slotSettings(void)));
151
152 ActionContextHelp = MenuHelp->addAction("", this, SLOT(slotEnterWhatIsThis(void)), Qt::SHIFT + Qt::Key_F1);
153 ActionAbout = MenuHelp->addAction("", this, SLOT(slotAbout(void)));
154
155 MenuOnButton = new QMenu(this);
156 ActionWhatIs = MenuOnButton->addAction("", this, SLOT(slotMenuWhatIsThis(void)));
157 }
158
159
160 //----------------------------------------------------------------------------------------------------------------------
SetLocaleTexts()161 void MainWidget::SetLocaleTexts()
162 {
163 setWindowTitle(tr("Calculator"));
164
165 MenuView->setTitle(tr("View"));
166 MenuEdit->setTitle(tr("Edit"));
167 MenuHelp->setTitle(tr("Help"));
168 MenuLanguages->setTitle(tr("Languages"));
169 ActionCopy->setText(tr("&Copy"));
170 ActionPaste->setText(tr("&Paste"));
171 ActionSettings->setText(tr("Settings"));
172 ActionContextHelp->setText(tr("Contex help"));
173 ActionWhatIs->setText(tr("What is this?"));
174 ActionAbout->setText(tr("About..."));
175
176
177 for (QAction *action: ActionViews) {
178 action->setText(QObject::tr(sViews[ActionViews.indexOf(action)].toStdString().c_str()));
179 }
180 for (QAction *action: ActionLanguages) {
181 action->setText(tr(sLanguages[ActionLanguages.indexOf(action)].toStdString().c_str()));
182 }
183 for (QCalcWidget *w: vec_btns) {w->LoadWhatIsText();}
184 }
185
186 //----------------------------------------------------------------------------------------------------------------------
slotView(QAction * action)187 void MainWidget::slotView(QAction* action)
188 {
189 if(action == nullptr) return;
190 settings.setSetting("appview", ActionViews.indexOf(action));
191 SetView(ActionViews.indexOf(action));
192 }
193
194 //----------------------------------------------------------------------------------------------------------------------
slotLanguage(QAction * action)195 void MainWidget::slotLanguage(QAction* action)
196 {
197 if(action == nullptr) return;
198 settings.setSetting("Language", ActionLanguages.indexOf(action));
199 SetLocale(static_cast<Langs>(ActionLanguages.indexOf(action)));
200 }
201
slotOnPopupLogList()202 void MainWidget::slotOnPopupLogList()
203 {
204 if(logModel.rowCount(QModelIndex()) == 0)
205 logModel.addItems(loger.ReadLast(settings.getSetting("log_rate").toInt()));
206 else
207 logModel.addItems(loger.ReadLast(), true);
208 }
209
slotActivatedLogList(const QString & value)210 void MainWidget::slotActivatedLogList(const QString &value)
211 {
212 if(!value.isEmpty())
213 {
214 auto log_value = value;
215 if(log_value.contains('='))
216 log_value = log_value.left(log_value.indexOf('=') - 1);
217 pasteExpression(log_value);
218 }
219 }
220
221
222 //----------------------------------------------------------------------------------------------------------------------
slotAbout(void)223 void MainWidget::slotAbout(void)
224 {
225 QMessageBox::about(this, tr("About"), tr("AboutProgram"));
226 }
227
228
229 //----------------------------------------------------------------------------------------------------------------------
slotCopy(void)230 void MainWidget::slotCopy(void)
231 {
232 QString s = parser->GetExpression();
233 if(!wDisplay->result().isEmpty())
234 {
235 if(parser->Run())
236 s = s + " = " + parser->DoubleToString(parser->GetResult(), PRECISION_FOR_DOUBLE);
237 else
238 s = s + " " + parser->listErrors();
239 }
240 QApplication::clipboard()->setText(s);
241 }
242
243 //----------------------------------------------------------------------------------------------------------------------
slotPaste(void)244 void MainWidget::slotPaste(void)
245 {
246 QString pasteString = QApplication::clipboard()->text();
247 if(pasteString.isEmpty() || "" == pasteString)
248 return;
249
250 pasteExpression(pasteString);
251 }
252
253
254 //----------------------------------------------------------------------------------------------------------------------
slotSettings(void)255 void MainWidget::slotSettings(void)
256 {
257 DialogSettings* dialog_settings = new DialogSettings(&settings, this);
258 if (dialog_settings->exec() == QDialog::Accepted)
259 {
260 EnableLogList();
261
262 if(settings.getSetting("appview").toInt() != 2) //programming
263 SetView(settings.getSetting("appview").toInt());
264 ResizeAll(settings.getSetting("button_width").toUInt(), settings.getSetting("button_height").toUInt());
265 SetLocale(static_cast<Langs>(settings.getSetting("Language").toInt()));
266
267 settings.saveSettingsByKind(kindset::appearance);
268 settings.saveSettingsByKind(kindset::misc);
269
270 if(settings.isChanged("log_rate"))
271 logModel.clear();
272 }
273 delete dialog_settings;
274 }
275
276
277
278 //----------------------------------------------------------------------------------------------------------------------
pasteExpression(const QString & exp)279 void MainWidget::pasteExpression(const QString &exp)
280 {
281 QString value, num_val;
282 QString expression = exp;
283
284 SendKey(Qt::Key_Escape);
285
286 TokenList Tokens;
287 Token tok;
288 CalcParser tempParser;
289 sKeyMod km = {0, 0};
290 QCalcWidget *w = nullptr;
291
292 tempParser.SetParams(&expression, 0, parser->DRG());
293 Tokens = tempParser.RefTokens();
294
295 bPasting = true;
296 for(auto it = Tokens.begin(); it != Tokens.end(); ++it)
297 {
298 tok = *it;
299 value = tok.Value();
300 if(tok.Type() == t_type::UNK || tok.Type() == t_type::ERR) continue;
301 if(tok.Type() == t_type::NUMBER)
302 {
303 for(String::iterator sit = value.begin(); sit != value.end(); ++sit)
304 {
305 num_val = *sit;
306 if(num_val == ",")
307 num_val = ".";
308
309 //Следующие замены для корректной вставки чисел в формате 1.e+01
310 if(num_val == "e")
311 num_val = "exp";
312
313 if(num_val == "+")
314 num_val = "";
315
316 if(num_val == "-")
317 num_val = "+/-";
318 km = FindKeyByValue(num_val);
319 SendKey(km.key, km.mod);
320 }
321
322 }
323 else
324 {
325 SetMode(SModes::Hyp, false);
326 SetMode(SModes::Inv, false);
327 km = FindKeyByValue(value);
328 if(km.key == 0 && km.mod == 0) //Если не найдено сочетание клавиш для функции
329 continue;
330
331 w = FindWidgetByKey(km);
332 if(w)
333 {
334 if(tok.Type() == t_type::FUNCTION && tok.Value() != w->Value())
335 {
336 if(w->Hypable())
337 SetMode(SModes::Hyp, true);
338 else
339 if(w->Invable())
340 SetMode(SModes::Inv, true);
341 }
342 ClickToWidget(w->widget);
343 }
344
345 if(tok.Value() == "=")
346 break;
347 }
348 }
349 bPasting = false;
350 }
351
352
353 //----------------------------------------------------------------------------------------------------------------------
SendKey(int Key,unsigned int Mod)354 void MainWidget::SendKey(int Key, unsigned int Mod)
355 {
356 QKeyEvent *ke = new QKeyEvent(QEvent::KeyPress, Key, static_cast<Qt::KeyboardModifiers>(Mod));
357 QApplication::sendEvent(this, ke);
358 delete ke;
359 }
360
361
362 //----------------------------------------------------------------------------------------------------------------------
ClickToWidget(QWidget * widget,int msec)363 void MainWidget::ClickToWidget(QWidget *widget, int msec)
364 {
365 QTime time;
366 if(widget)
367 {
368 if(!widget->isVisible())
369 (static_cast<QAbstractButton*>(widget))->click();
370 else
371 {
372 if(!(mePress && meRelease)) return;
373 QApplication::sendEvent(widget, mePress);
374 time.start();
375 for(; time.elapsed() < msec;){}
376 QApplication::sendEvent(widget, meRelease);
377 }
378 }
379 }
380
381
382 //----------------------------------------------------------------------------------------------------------------------
focusOutEvent(QFocusEvent * fe)383 void MainWidget::focusOutEvent(QFocusEvent * fe)
384 {
385 this->setFocus();
386 QWidget::focusOutEvent(fe);
387 }
388
389
390 //----------------------------------------------------------------------------------------------------------------------
FindKeyByValue(QString value)391 sKeyMod MainWidget::FindKeyByValue(QString value)
392 {
393 sKeyMod km = {0, 0};
394 auto mit = map_val_key.find(value);
395 if(mit != map_val_key.end())
396 km = *mit;
397 return km;
398 }
399
400
401 //----------------------------------------------------------------------------------------------------------------------
FindWidgetByKey(sKeyMod km)402 QCalcWidget* MainWidget::FindWidgetByKey(sKeyMod km)
403 {
404 auto mit = map_keys.find(km);
405 if(mit != map_keys.end())
406 return *mit;
407 return nullptr;
408 }
409
410
411 //----------------------------------------------------------------------------------------------------------------------
keyPressEvent(QKeyEvent * pe)412 void MainWidget::keyPressEvent(QKeyEvent* pe)
413 {
414 QCalcWidget *cw;
415 sKeyMod km{pe->key(), pe->modifiers()};
416
417 cw = FindWidgetByKey(km);
418 if(!cw && km.mod)
419 {
420 km.mod = 0;
421 cw = FindWidgetByKey(km);
422
423 }
424 if(cw)
425 ClickToWidget(cw->widget);
426 else
427 QWidget::keyPressEvent(pe);
428 }
429
430
431 //----------------------------------------------------------------------------------------------------------------------
mousePressEvent(QMouseEvent * mpe)432 void MainWidget::mousePressEvent(QMouseEvent *mpe)
433 {
434 mpe->accept();
435 curr_widget = nullptr;
436
437 curr_widget = this->childAt(mpe->pos());
438
439 curr_GlobalPos = mpe->globalPos();
440 if(mpe->button() == Qt::RightButton && !QWhatsThis::inWhatsThisMode())
441 if(curr_widget)
442 MenuOnButton->exec(mpe->globalPos());
443
444 }
445
446
447 //----------------------------------------------------------------------------------------------------------------------
slotMenuWhatIsThis(void)448 void MainWidget::slotMenuWhatIsThis(void)
449 {
450 if(curr_widget)
451 QWhatsThis::showText(curr_GlobalPos, curr_widget->whatsThis());
452 }
453
454
455 //----------------------------------------------------------------------------------------------------------------------
slotEnterWhatIsThis(void)456 void MainWidget::slotEnterWhatIsThis(void)
457 {
458 QWhatsThis::enterWhatsThisMode();
459 }
460
461
462 //----------------------------------------------------------------------------------------------------------------------
event(QEvent * e)463 bool MainWidget::event(QEvent *e)
464 {
465 if((e->type() == QEvent::Leave || e->type() == QEvent::LeaveWhatsThisMode) && curr_widget)
466 curr_widget->update();
467
468 return QWidget::event(e);
469 }
470
showEvent(QShowEvent * event)471 void MainWidget::showEvent(QShowEvent *event)
472 {
473 SetView(settings.getSetting("appview").toInt(), true);
474 this->QWidget::showEvent(event);
475 //qDebug() << settings.getSetting("posy").toInt();
476 }
477
resizeEvent(QResizeEvent * event)478 void MainWidget::resizeEvent(QResizeEvent *event)
479 {
480 this->QWidget::resizeEvent(event);
481 }
482
483
moveEvent(QMoveEvent * event)484 void MainWidget::moveEvent(QMoveEvent *event)
485 {
486 this->QWidget::moveEvent(event);
487 settings.saveSettingsScreen(event->pos().x(), event->pos().y());
488 }
489
490
491 //----------------------------------------------------------------------------------------------------------------------
InitLocale()492 void MainWidget::InitLocale()
493 {
494 qtTrans = new QTranslator(this);
495 qtTransPopup = new QTranslator(this);
496 qtTransErrors = new QTranslator(this);
497
498 Langs lang = Langs::En;
499 QLocale locale;
500
501 if(settings.getSetting("Language").toInt() == 0)
502 {
503 if(locale.language() == QLocale::Russian)
504 lang = Langs::Ru;
505 if(locale.language() == QLocale::English)
506 lang = Langs::En;
507 }
508 else
509 lang = static_cast<Langs>(settings.getSetting("Language").toInt());
510
511 SetLocale(lang);
512 }
513
514
515 //----------------------------------------------------------------------------------------------------------------------
SetLocale(Langs indexLang)516 void MainWidget::SetLocale(Langs indexLang)
517 {
518 int selectedIndex = static_cast<int>(indexLang);
519 int index = 0;
520
521 LoadLocale(sShortLanguages[selectedIndex]);
522 for (QAction *action: ActionLanguages){
523 action->setChecked(selectedIndex == index++);
524 }
525 }
526
527
528 //----------------------------------------------------------------------------------------------------------------------
SetView(int indexView,bool isFirst)529 void MainWidget::SetView(int indexView, bool isFirst)
530 {
531 int index = 0;
532 for (QAction *action: ActionViews){
533 action->setChecked(indexView == index++);
534 }
535
536 if(settings.isChanged("appview") || isFirst)
537 {
538 if(!InitLayouts())
539 QApplication::exit(-1);
540 }
541 }
542
543
544 //----------------------------------------------------------------------------------------------------------------------
LoadLocale(const QString & sloc)545 void MainWidget::LoadLocale(const QString& sloc)
546 {
547 QString localePath = ":/locales";
548
549 qtTrans->load("acalc_" + sloc, localePath);
550 qtTransPopup->load("popup_" + sloc, localePath);
551 qtTransErrors->load("errors_" + sloc, localePath);
552
553 qApp->installTranslator(qtTrans);
554 qApp->installTranslator(qtTransPopup);
555 qApp->installTranslator(qtTransErrors);
556 SetLocaleTexts();
557 }
558
559
560 //----------------------------------------------------------------------------------------------------------------------
InitLayouts()561 bool MainWidget::InitLayouts()
562 {
563 QCalcWidget* rw;
564 QString rv;
565
566 FreeLayouts();
567
568 switch(static_cast<CalcView>(settings.getSetting("appview").toInt()))
569 {
570 case CalcView::Original:
571 for (QCalcWidget* widget: vec_btns) {
572 if(widget->GetType() == Pnl::Nop) widget->SetType(widget->GetSavedType());
573 if(widget->IsReplace()) widget->UnReplace();
574 }
575 LayoutOriginal();
576 break;
577 case CalcView::Simple:
578 for (QCalcWidget* widget: vec_btns) {
579 rv = widget->GetReplaceValue();
580 if("" != rv)
581 {
582 rw = FindButtonByValue(rv);
583 if(rw) rw->Replace(widget);
584 }
585
586 if(widget->IsNopable()) widget->SetType(Pnl::Nop);
587 }
588 LayoutSimple();
589 break;
590 case CalcView::Programmable:
591 LayoutProgrammable();
592 break;
593 }
594
595 for(auto i = 0; i < static_cast<int>(Pnl::Nop); ++i)
596 {
597 Pnl atype = static_cast<Pnl>(i);
598 FillLayoutWidgets(atype);
599 }
600
601 ResizeAll(settings.getSetting("button_width").toUInt(), settings.getSetting("button_height").toUInt());
602 return true;
603 }
604
605
606 //----------------------------------------------------------------------------------------------------------------------
FreeLayouts(void)607 void MainWidget::FreeLayouts(void)
608 {
609 CalcView appview = static_cast<CalcView>(settings.getSetting("appview").toInt());
610 pb.getPanel(Pnl::Abc)->setVisible(appview == CalcView::Original);
611 pb.getPanel(Pnl::Mem)->setVisible(appview == CalcView::Original);
612 pb.getPanel(Pnl::Func)->setVisible(appview == CalcView::Original);
613 pb.getPanel(Pnl::Scale)->setVisible(appview == CalcView::Original);
614 pb.getPanel(Pnl::Drg)->setVisible(appview == CalcView::Original);
615 pb.getPanel(Pnl::FuncModes)->setVisible(appview == CalcView::Original);
616
617
618 for(std::pair<Pnl, QFrame*> panel: pb.panels())
619 {
620 QLayout *l = panel.second->layout();
621 for(int i = 0; i < l->count(); ++i)
622 l->removeItem(l->itemAt(i));
623 }
624
625 this->repaint();
626 delete wBottom->layout();
627 delete wMode->layout();
628 wDisplay->deleteLayout();
629 delete this->layout();
630 }
631
632
633 //----------------------------------------------------------------------------------------------------------------------
FillLayoutWidgets(Pnl atype)634 void MainWidget::FillLayoutWidgets(Pnl atype)
635 {
636 std::for_each(vec_btns.begin(), vec_btns.end(), [=] (QCalcWidget* w)
637 {
638 if(w->GetType() == atype)
639 static_cast<QGridLayout*>(pb.getPanel(atype)->layout())->addWidget(w->widget, static_cast<int>(w->i), static_cast<int>(w->j), static_cast<int>(w->n_rows), static_cast<int>(w->n_cols));
640 });
641 }
642
643
644 //----------------------------------------------------------------------------------------------------------------------
LayoutOriginal(void)645 void MainWidget::LayoutOriginal(void)
646 {
647 QVBoxLayout *lMain = new QVBoxLayout();
648 QVBoxLayout *lMenu = new QVBoxLayout();
649 QHBoxLayout *lBottom = new QHBoxLayout();
650 QBoxLayout *lMemAbc = new QVBoxLayout();
651
652 lMain->setContentsMargins(0, 0, 0, 0);
653 lMain->setSpacing(spacing);
654
655 lMenu->setContentsMargins(0, 0, 0, 0);
656 lMenu->setSpacing(0);
657 lMenu->addWidget(MenuBar);
658
659
660 lMain->addLayout(lMenu);
661 lMain->addWidget(cbxlogList);
662 lMain->addWidget(wDisplay);
663 lMain->addWidget(wMode);
664 lMain->addWidget(pb.getPanel(Pnl::Func));
665 lMain->addWidget(wBottom);
666
667
668 lMemAbc->setMargin(0);
669 lMemAbc->setSpacing(spacing);
670 lMemAbc->addWidget(pb.getPanel(Pnl::Mem));
671 lMemAbc->addWidget(pb.getPanel(Pnl::Abc));
672
673 lBottom->setMargin(0);
674 lBottom->setSpacing(spacing);
675 lBottom->addWidget(pb.getPanel(Pnl::Dig), Qt::AlignLeft);
676 lBottom->addWidget(pb.getPanel(Pnl::Op), Qt::AlignLeft);
677 lBottom->addLayout(lMemAbc);
678
679 InitModesLayouts();
680
681
682 wDisplay->Layout();
683 wBottom->setLayout(lBottom);
684
685 this->setLayout(lMain);
686 }
687
688
689 //----------------------------------------------------------------------------------------------------------------------
LayoutSimple(void)690 void MainWidget::LayoutSimple(void)
691 {
692 QVBoxLayout *lMain = new QVBoxLayout();
693 QVBoxLayout *lMenu = new QVBoxLayout();
694 QHBoxLayout *lBottom = new QHBoxLayout();
695 QHBoxLayout *lMode = new QHBoxLayout();
696
697 //lMain->setContentsMargins(spacing, 0, spacing, spacing);
698 lMain->setContentsMargins(0, 0, 0, 0);
699 lMain->setSpacing(spacing);
700
701 lMenu->setContentsMargins(0, 0, 0, 0);
702 lMenu->setSpacing(0);
703 lMenu->addWidget(MenuBar);
704
705 lMain->addLayout(lMenu);
706 lMain->addWidget(cbxlogList);
707 lMain->addWidget(wDisplay);
708 lMain->addWidget(wMode);
709 lMain->addWidget(wBottom);
710
711 lBottom->setMargin(0);
712 lBottom->setSpacing(spacing);
713 lBottom->addWidget(pb.getPanel(Pnl::Dig), Qt::AlignLeft);
714 lBottom->addWidget(pb.getPanel(Pnl::Op), Qt::AlignLeft);
715
716 lMode->setContentsMargins(0, 0, spacing, 0);
717 lMode->setSpacing(spacing);
718 lMode->addStretch();
719 lMode->addWidget(pb.getPanel(Pnl::ServButtons));
720
721 wBottom->setLayout(lBottom);
722 wMode->setLayout(lMode);
723 wDisplay->Layout();
724 this->setLayout(lMain);
725 }
726
727
728 //----------------------------------------------------------------------------------------------------------------------
LayoutProgrammable(void)729 void MainWidget::LayoutProgrammable(void)
730 {
731 //
732 }
733
734
735 //----------------------------------------------------------------------------------------------------------------------
InitModesLayouts()736 void MainWidget::InitModesLayouts()
737 {
738 QHBoxLayout *lModeBottom = new QHBoxLayout();
739 QVBoxLayout *lMode = new QVBoxLayout();
740 QHBoxLayout *lModeTop = new QHBoxLayout();
741
742 lMode->setMargin(0);
743 lMode->setSpacing(spacing);
744 lMode->addLayout(lModeTop);
745 lMode->addLayout(lModeBottom);
746
747 lModeBottom->setMargin(0);
748 lModeBottom->setSpacing(spacing);
749
750 lModeBottom->addWidget(pb.getPanel(Pnl::Scale));
751 lModeBottom->addWidget(pb.getPanel(Pnl::Drg));
752
753 lModeTop->setContentsMargins(0, 0, spacing, 0);
754 lModeTop->setSpacing(spacing);
755 lModeTop->addWidget(pb.getPanel(Pnl::FuncModes));
756 lModeTop->addStretch();
757 lModeTop->addWidget(pb.getPanel(Pnl::ServButtons));
758
759 wMode->setLayout(lMode);
760 }
761
762
763
764 //----------------------------------------------------------------------------------------------------------------------
CreateWidgets()765 void MainWidget::CreateWidgets()
766 {
767 wDisplay = new CalcDisplay(this);
768 wMode = new QFrame(this);
769 wBottom = new QFrame(this);
770
771 cbxlogList = new QLogComboBox(this);
772 cbxlogList->setModel(&logModel);
773 connect(cbxlogList, SIGNAL(OnPopup()), SLOT(slotOnPopupLogList()));
774 connect(cbxlogList, SIGNAL(activated(const QString&)), SLOT(slotActivatedLogList(const QString&)));
775
776
777 wBottom->setContentsMargins(0, 0, 0, 0);
778 wMode->setContentsMargins(0, 0, 0, 0);
779
780 wDisplay->setContentsMargins(0, 0, 0, 0);
781
782 wDisplay->setFrameStyle(shape);
783
784 CreateButtons(Pnl::Dig);
785 CreateButtons(Pnl::Op);
786 CreateButtons(Pnl::Mem);
787 CreateButtons(Pnl::Abc);
788 CreateButtons(Pnl::Func);
789 CreateButtons(Pnl::Scale);
790 CreateButtons(Pnl::Drg);
791 CreateButtons(Pnl::FuncModes);
792 CreateButtons(Pnl::ServButtons);
793 }
794
795
796 //----------------------------------------------------------------------------------------------------------------------
CreateButtons(Pnl atype)797 void MainWidget::CreateButtons(Pnl atype)
798 {
799 QString *s;
800 QString *s_v;
801 int index;
802
803 QCalcWidget *cw;
804 auto max_i = pb.getRows(atype);
805 auto max_j = pb.getCols(atype);
806
807 QColor *color = pb.getColor(atype);
808 std::vector<QCalcWidget*>::iterator it;
809
810 switch(atype)
811 {
812 case Pnl::Dig:
813 {
814 s = sDigits;
815 s_v = svDigits;
816 break;
817 }
818 case Pnl::Op:
819 {
820 s = sOperators;
821 s_v = svOperators;
822 break;
823 }
824 case Pnl::Abc:
825 {
826 s = sAbc;
827 s_v = sAbc;
828 break;
829 }
830 case Pnl::Mem:
831 {
832 s = sMem;
833 s_v = sMem;
834
835 lblMem = new QLabel();
836 lblMem->setFrameStyle(QFrame::WinPanel);
837 lblMem->setAlignment(Qt::AlignCenter);
838 vec_btns.push_back(new QCalcWidget(lblMem, 1, 0, atype, "", "", 1, 3, true));
839 break;
840 }
841 case Pnl::Func:
842 {
843 s = sFunc;
844 s_v = svFunc;
845 break;
846 }
847 case Pnl::Scale:
848 vec_btns.push_back(new QCalcWidget(new QRadioButton(sScales[static_cast<int>(Scales::Hex)]), 0, 0, atype));
849 vec_btns.push_back(new QCalcWidget(new QRadioButton(sScales[static_cast<int>(Scales::Dec)]), 0, 1, atype));
850 vec_btns.push_back(new QCalcWidget(new QRadioButton(sScales[static_cast<int>(Scales::Oct)]), 0, 2, atype));
851 vec_btns.push_back(new QCalcWidget(new QRadioButton(sScales[static_cast<int>(Scales::Bin)]), 0, 3, atype));
852 for (auto it: vec_btns)
853 {
854 cw = it;
855 if(cw->GetType() == atype)
856 connect(cw, SIGNAL(ClickServButton(QString)), SLOT(ProcessClickScale(QString)));
857 }
858 return;
859 case Pnl::Drg:
860 vec_btns.push_back(new QCalcWidget(new QRadioButton(sDrg[static_cast<int>(Drg::Deg)]), 0, 0, atype));
861 connect(vec_btns.back(), SIGNAL(ClickServButton(QString)), SLOT(ProcessClickDRG(QString)));
862
863 vec_btns.push_back(new QCalcWidget(new QRadioButton(sDrg[static_cast<int>(Drg::Rad)]), 0, 1, atype));
864 connect(vec_btns.back(), SIGNAL(ClickServButton(QString)), SLOT(ProcessClickDRG(QString)));
865
866 vec_btns.push_back(new QCalcWidget(new QRadioButton(sDrg[static_cast<int>(Drg::Grad)]), 0, 2, atype));
867 connect(vec_btns.back(), SIGNAL(ClickServButton(QString)), SLOT(ProcessClickDRG(QString)));
868 return;
869 case Pnl::FuncModes:
870 vec_btns.push_back(new QCalcWidget(new QCheckBox(sModes[static_cast<int>(SModes::Inv)]), 0, 0, atype));
871 connect(vec_btns.back(), SIGNAL(ClickServButton(QString)), SLOT(ProcessClickFuncModes(QString)));
872
873 vec_btns.push_back(new QCalcWidget(new QCheckBox(sModes[static_cast<int>(SModes::Hyp)]), 0, 1, atype));
874 connect(vec_btns.back(), SIGNAL(ClickServButton(QString)), SLOT(ProcessClickFuncModes(QString)));
875 return;
876 case Pnl::ServButtons:
877 vec_btns.push_back(new QCalcWidget(new QPushButton(), 0, 0, atype, sServ[static_cast<int>(Serv::BackSpace)]));
878 connect(vec_btns.back(), SIGNAL(ClickButton(QString)), SLOT(ProcessClickServ(QString)));
879
880 vec_btns.push_back(new QCalcWidget(new QPushButton(), 0, 1, atype, sServ[static_cast<int>(Serv::CE)]));
881 connect(vec_btns.back(), SIGNAL(ClickButton(QString)), SLOT(ProcessClickServ(QString)));
882
883 vec_btns.push_back(new QCalcWidget(new QPushButton(), 0, 2, atype, "C", sServ[static_cast<int>(Serv::Esc)]));
884 connect(vec_btns.back(), SIGNAL(ClickButton(QString)), SLOT(ProcessClickServ(QString)));
885 return;
886 default:
887 return;
888 }
889
890 for(auto i = 0; i < max_i; ++i)
891 for(auto j = 0; j < max_j; ++j)
892 {
893 index = max_j * i + j;
894 cw = new QCalcWidget(new QPushButton(), i, j, atype, s[index], s_v[index]);
895 cw->SetTextColor(color);
896
897 if(atype == Pnl::Mem)
898 connect(cw, SIGNAL(ClickButton(QString)), SLOT(ProcessClickMem(QString)));
899 else
900 connect(cw, SIGNAL(ClickButton(QString)), SLOT(ProcessClick(QString)));
901
902 if(atype == Pnl::Func)
903 {
904 cw->SetAltTexts(svAltFunc[index], sAltFunc[index]);
905 cw->hyp = sHypInv[index] == "h";
906 cw->inv = sHypInv[index] == "i";
907 }
908 if(atype == Pnl::Op)
909 {
910 cw->SetNopable(bOpNops[index]);
911 cw->SetReplaceValue(sOpReps[index]);
912 }
913
914
915 vec_btns.push_back(cw);
916 }
917 }
918
919
920 //----------------------------------------------------------------------------------------------------------------------
ResizeWidgets(int w,int h,Pnl atype)921 void MainWidget::ResizeWidgets(int w, int h, Pnl atype)
922 {
923 for (QCalcWidget* widget: vec_btns) { if(widget->GetType() == atype) widget->SetSize(w, h);}
924 }
925
926
927 //----------------------------------------------------------------------------------------------------------------------
SetSizeOfWidgets(int button_w,int button_h)928 void MainWidget::SetSizeOfWidgets(int button_w, int button_h)
929 {
930 int i_left, i_top, i_right, i_bottom;
931 int func_button_h = GetHFButton(button_h);
932
933 i_left = i_right = i_top = i_bottom = 0;
934
935 this->getContentsMargins(&i_left, &i_top, &i_right, &i_bottom);
936
937 pb.setSizeButton(Pnl::Dig, button_w, button_h);
938
939 switch(static_cast<CalcView>(settings.getSetting("appview").toInt()))
940 {
941 case CalcView::Original:
942 pb.setSizeButton(Pnl::Op, button_w, button_h);
943 pb.setSizeButton(Pnl::Abc, button_w, button_h);
944 pb.getPanel(Pnl::Mem)->setFixedSize(pb.getPanel(Pnl::Abc)->width(), pb.getPanel(Pnl::Op)->height() - pb.getPanel(Pnl::Abc)->height() - spacing);
945 wBottom->setFixedSize(pb.getPanel(Pnl::Dig)->width() + pb.getPanel(Pnl::Op)->width() + pb.getPanel(Pnl::Mem)->width() + spacing * 2,
946 pb.getPanel(Pnl::Dig)->height());
947
948 button_func_w = (wBottom->width() - spacing * (pb.getCols(Pnl::Func) + 1)) / pb.getCols(Pnl::Func);
949 pb.setSizeButton(Pnl::Func, button_func_w, func_button_h);
950 pb.setSizeButton(Pnl::Scale, button_func_w, func_button_h);
951 pb.setSizeButton(Pnl::FuncModes, button_func_w, func_button_h);
952 pb.getPanel(Pnl::Drg)->setFixedSize(wBottom->width() - pb.getPanel(Pnl::Scale)->width() - spacing,
953 pb.getPanel(Pnl::Scale)->height());
954
955 wMode->setFixedSize(wBottom->width(), pb.getPanel(Pnl::Scale)->height() + pb.getPanel(Pnl::FuncModes)->height() + spacing);
956 ResizeWidgets(button_w, pb.getPanel(Pnl::FuncModes)->height(), Pnl::ServButtons);
957
958 this->setFixedSize(wBottom->width() + i_left + i_right,
959 wBottom->height() + pb.getPanel(Pnl::Func)->height() + wMode->height() +
960 (isLogList()? cbxlogList->height() + spacing: 0) +
961 wDisplay->height() + spacing * 4 + MenuBar->height() + i_top + i_bottom);
962 break;
963 case CalcView::Simple:
964 pb.setSizeButton(Pnl::Op, button_w, button_h, button_w + spacing);
965 wBottom->setFixedSize(pb.getPanel(Pnl::Dig)->width() + pb.getPanel(Pnl::Op)->width() + spacing, pb.getPanel(Pnl::Dig)->height());
966
967 wMode->setFixedSize(wBottom->width(), func_button_h + i_top + i_bottom);
968 ResizeWidgets(button_w, wMode->height(), Pnl::ServButtons);
969
970 this->setFixedSize(wBottom->width() + i_left + i_right,
971 wBottom->height() + wMode->height() +
972 (isLogList()? cbxlogList->height() + spacing: 0) +
973 wDisplay->height() + spacing * 3 + MenuBar->height() + i_top + i_bottom);
974
975 break;
976 case CalcView::Programmable:
977 //
978 break;
979 }
980 }
981
982
983 //----------------------------------------------------------------------------------------------------------------------
ResizeAll(unsigned new_button_w,unsigned new_button_h)984 void MainWidget::ResizeAll(unsigned new_button_w, unsigned new_button_h)
985 {
986 settings.setSetting("button_width", new_button_w);
987 settings.setSetting("button_height", new_button_h);
988
989
990 int logical_w = (QPaintDevice::logicalDpiX() * settings.getSetting("button_width").toInt()) / DEFAULT_DPI;
991 int logical_h = (QPaintDevice::logicalDpiY() * settings.getSetting("button_height").toInt()) / DEFAULT_DPI;
992
993 ResizeWidgets(logical_w, logical_h, Pnl::Dig);
994 ResizeWidgets(logical_w, logical_h, Pnl::Op);
995 ResizeWidgets(logical_w, logical_h, Pnl::Mem);
996 ResizeWidgets(logical_w, logical_h, Pnl::Abc);
997
998 SetSizeOfWidgets(logical_w, logical_h);
999
1000 ResizeWidgets(button_func_w, GetHFButton(logical_h), Pnl::Func);
1001 ResizeWidgets(button_func_w + spacing, GetHFButton(logical_h), Pnl::Scale);
1002 ResizeWidgets(button_func_w + spacing, GetHFButton(logical_h), Pnl::Drg);
1003 ResizeWidgets(button_func_w + spacing, GetHFButton(logical_h), Pnl::FuncModes);
1004
1005 posMousePress.setX(logical_w / 2);
1006 posMousePress.setY(logical_h / 3);
1007 ReCreateMouseEvents();
1008 }
1009
1010
1011 //----------------------------------------------------------------------------------------------------------------------
AddToken(const QString & stok)1012 bool MainWidget::AddToken(const QString& stok)
1013 {
1014 bool res;
1015 QString s = stok;
1016 res = parser->AddToken(&s);
1017 if(!res)
1018 Alert();
1019 else
1020 SaveExpression(parser->GetExpression());
1021 return res;
1022 }
1023
1024
1025 //----------------------------------------------------------------------------------------------------------------------
ProcessClick(const QString & sButtonValue)1026 void MainWidget::ProcessClick(const QString& sButtonValue)
1027 {
1028 bool accessRun;
1029 if(sButtonValue == "=")
1030 {
1031 accessRun = parser->Run();
1032 if(accessRun)
1033 UpdateDisplay(ud::Result);
1034 else
1035 UpdateDisplay(ud::Errors);
1036 }
1037 else
1038 {
1039 QString s = sButtonValue;
1040 if(s == "^2") //Для перевода степени в нужную систему счисления
1041 s = "^" + parser->DoubleToString(2);
1042 if(s == "^3")
1043 s = "^" + parser->DoubleToString(3);
1044
1045 AddToken(s);
1046 UpdateDisplay();
1047 }
1048 }
1049
1050
1051 //----------------------------------------------------------------------------------------------------------------------
SetMemory(QString value,CalcParser * p)1052 bool MainWidget::SetMemory(QString value, CalcParser* p)
1053 {
1054 CalcParser* l_parser = nullptr;
1055 bool result = false;
1056
1057 l_parser = (p == nullptr? new CalcParser(&value): p);
1058
1059 if(l_parser->Run())
1060 {
1061 inMemory = l_parser->GetResult();
1062 if(value == "")
1063 lblMem->setText("");
1064 else
1065 lblMem->setText(l_parser->DoubleToString(inMemory, 6));
1066 result = true;
1067 }
1068
1069 if(p == nullptr)
1070 delete l_parser;
1071
1072 return result;
1073 }
1074
1075
1076 //----------------------------------------------------------------------------------------------------------------------
LoadExpression()1077 void MainWidget::LoadExpression()
1078 {
1079 QString exp = settings.getSetting("expression").toString();
1080 if(!exp.isEmpty() && exp != "0")
1081 {
1082 without_logging = true;
1083 pasteExpression(exp);
1084 without_logging = false;
1085 }
1086 }
1087
1088
1089 //----------------------------------------------------------------------------------------------------------------------
SaveExpression(const QString & value)1090 void MainWidget::SaveExpression(const QString &value)
1091 {
1092 settings.setSetting("expression", value);
1093 }
1094
1095
1096
1097 //----------------------------------------------------------------------------------------------------------------------
ProcessClickMem(const QString & sButtonValue)1098 void MainWidget::ProcessClickMem(const QString& sButtonValue)
1099 {
1100 QString stok = sButtonValue;
1101
1102 if(stok == sMem[0])
1103 {
1104 if(SetMemory("0", parser))
1105 SaveMemory(parser->GetExpression());
1106 else
1107 UpdateDisplay(ud::Errors);
1108
1109 }
1110 if(stok == sMem[1])
1111 {
1112 if(lblMem->text().isEmpty())
1113 return;
1114
1115 QString sMemory = parser->DoubleToString(fabs(inMemory), PRECISION_FOR_DOUBLE);
1116 if(AddToken(sMemory))
1117 {
1118 if(inMemory < 0)
1119 parser->AddPrefixOp("-");
1120 }
1121
1122 UpdateDisplay();
1123 }
1124 if(stok == sMem[2])
1125 {
1126 lblMem->setText("");
1127 inMemory = 0;
1128 SaveMemory("");
1129 }
1130
1131 }
1132
1133
1134 //----------------------------------------------------------------------------------------------------------------------
ProcessClickScale(const QString & sButtonValue)1135 void MainWidget::ProcessClickScale(const QString& sButtonValue)
1136 {
1137 QString scale = sButtonValue;
1138
1139 if(scale == "Hex")
1140 parser->SetScale(16);
1141 if(scale == "Dec")
1142 parser->SetScale(10);
1143 if(scale == "Oct")
1144 parser->SetScale(8);
1145 if(scale == "Bin")
1146 parser->SetScale(2);
1147 UpdateDisplay();
1148 }
1149
1150
1151 //----------------------------------------------------------------------------------------------------------------------
ProcessClickServ(const QString & sButtonValue)1152 void MainWidget::ProcessClickServ(const QString& sButtonValue)
1153 {
1154 if(sButtonValue == "Back")
1155 parser->ToBack();
1156 if(sButtonValue == "CE")
1157 parser->ToBack(false);
1158 if(sButtonValue == "ESC")
1159 parser->SetParams(nullptr, parser->Scale(), parser->DRG());
1160
1161 UpdateDisplay();
1162 }
1163
1164
1165 //----------------------------------------------------------------------------------------------------------------------
ProcessClickDRG(const QString & sButtonValue)1166 void MainWidget::ProcessClickDRG(const QString& sButtonValue)
1167 {
1168
1169 Drg drg_mode = Drg::Rad;
1170
1171 if(sButtonValue == "Deg")
1172 drg_mode = Drg::Deg;
1173 if(sButtonValue == "Rad")
1174 drg_mode = Drg::Rad;
1175 if(sButtonValue == "Grad")
1176 drg_mode = Drg::Grad;
1177 parser->SetDRG(drg_mode);
1178
1179 UpdateDisplay();
1180 }
1181
1182
1183 //----------------------------------------------------------------------------------------------------------------------
ProcessClickFuncModes(const QString & sModeValue)1184 void MainWidget::ProcessClickFuncModes(const QString& sModeValue)
1185 {
1186 QCalcWidget* w = FindButtonByValue(sModeValue);
1187 if(!w) return;
1188
1189 stFuncMode FM = {sModeValue, reinterpret_cast<QCheckBox*>(reinterpret_cast<QCalcWidget*>(w->widget))->isChecked()};
1190 std::for_each(vec_btns.begin(), vec_btns.end(), bind2nd(setHypInv(), FM));
1191 }
1192
1193
1194 //----------------------------------------------------------------------------------------------------------------------
SetMode(SModes mode,bool on)1195 void MainWidget::SetMode(SModes mode, bool on)
1196 {
1197 std::vector<QCalcWidget*> btns_fm;
1198 btns_fm.resize(std::count_if(vec_btns.begin(), vec_btns.end(), bind2nd(checkBtnType(), Pnl::FuncModes)));
1199 std::copy_if(vec_btns.begin(), vec_btns.end(), btns_fm.begin(), bind2nd(checkBtnType(), Pnl::FuncModes));
1200
1201 if(static_cast<int>(mode) < static_cast<int>(SModes::Inv) || static_cast<int>(mode) > static_cast<int>(SModes::Hyp) ) return;
1202 QCheckBox *cb = reinterpret_cast<QCheckBox*>(btns_fm.at(static_cast<int>(mode))->widget);
1203 if(cb->isChecked() != on)
1204 cb->click();
1205 }
1206
1207
1208
1209 //----------------------------------------------------------------------------------------------------------------------
UpdateDisplay(ud how_update)1210 void MainWidget::UpdateDisplay(ud how_update)
1211 {
1212 QString expression;
1213 QString errors;
1214 QString result;
1215
1216 expression = parser->GetExpression();
1217 errors = parser->listErrors();
1218
1219 wDisplay->setExpression(parser->GetExpression("", true));
1220
1221 if(how_update == ud::Errors)
1222 wDisplay->setResult(errors);
1223 else
1224 if(how_update == ud::Result)
1225 {
1226 result = parser->DoubleToString(parser->GetResult(), PRECISION_FOR_DOUBLE);
1227 wDisplay->setResult("= " + result);
1228
1229 if(isLoging() && !without_logging)
1230 loger.Add(expression + " = " + result);
1231 }
1232 else
1233 if(how_update == ud::Empty)
1234 wDisplay->setResult("");
1235
1236 if(!lblMem->text().isEmpty())
1237 lblMem->setText(parser->DoubleToString(inMemory, 6));
1238 }
1239
1240
1241 //----------------------------------------------------------------------------------------------------------------------
Alert(void)1242 void MainWidget::Alert(void)
1243 {
1244 if(!bPasting)
1245 QApplication::beep();
1246 }
1247
1248
1249 //----------------------------------------------------------------------------------------------------------------------
FindButtonByValue(QString value)1250 QCalcWidget* MainWidget::FindButtonByValue(QString value)
1251 {
1252 auto it = std::find_if(vec_btns.begin(), vec_btns.end(), bind2nd(buttonIsValue(), value));
1253 return *it;
1254 }
1255
1256
1257 //----------------------------------------------------------------------------------------------------------------------
AssignKeyToButton(QString button_value,int key,unsigned int mod)1258 void MainWidget::AssignKeyToButton(QString button_value, int key, unsigned int mod)
1259 {
1260 QCalcWidget *calcwidget = nullptr;
1261 sKeyMod keymod = {key, mod};
1262
1263 calcwidget = FindButtonByValue(button_value);
1264 if(calcwidget)
1265 {
1266 map_keys[keymod] = calcwidget;
1267 map_val_key[button_value] = keymod;
1268
1269 if(calcwidget->AltValue() != button_value)
1270 map_val_key[calcwidget->AltValue()] = keymod;
1271 }
1272 }
1273
1274
1275 //----------------------------------------------------------------------------------------------------------------------
DefaultKeysMap(void)1276 void MainWidget::DefaultKeysMap(void)
1277 {
1278 AssignKeyToButton("0", Qt::Key_0);
1279 AssignKeyToButton("1", Qt::Key_1);
1280 AssignKeyToButton("2", Qt::Key_2);
1281 AssignKeyToButton("3", Qt::Key_3);
1282 AssignKeyToButton("4", Qt::Key_4);
1283 AssignKeyToButton("5", Qt::Key_5);
1284 AssignKeyToButton("6", Qt::Key_6);
1285 AssignKeyToButton("7", Qt::Key_7);
1286 AssignKeyToButton("8", Qt::Key_8);
1287 AssignKeyToButton("9", Qt::Key_9);
1288
1289 AssignKeyToButton(".", Qt::Key_Comma);
1290 AssignKeyToButton(".", Qt::Key_Period);
1291 AssignKeyToButton("+/-", Qt::Key_F9);
1292 AssignKeyToButton("*", Qt::Key_Asterisk);
1293 AssignKeyToButton("+", Qt::Key_Plus);
1294 AssignKeyToButton("-", Qt::Key_Minus);
1295 AssignKeyToButton("-", Qt::Key_Underscore, Qt::ShiftModifier);
1296 AssignKeyToButton("/", Qt::Key_Slash);
1297
1298 AssignKeyToButton("!", Qt::Key_Exclam);
1299 AssignKeyToButton("~", Qt::Key_AsciiTilde);
1300 AssignKeyToButton("%", Qt::Key_Percent);
1301 AssignKeyToButton("&", Qt::Key_Ampersand);
1302 AssignKeyToButton("|", Qt::Key_Bar);
1303 AssignKeyToButton("<<", Qt::Key_Less);
1304 AssignKeyToButton(">>", Qt::Key_Greater);
1305
1306 AssignKeyToButton("=", Qt::Key_Return);
1307 AssignKeyToButton("=", Qt::Key_Enter);
1308 AssignKeyToButton("=", Qt::Key_Equal);
1309 AssignKeyToButton("Back", Qt::Key_Backspace);
1310 AssignKeyToButton("CE", Qt::Key_Delete);
1311 AssignKeyToButton("ESC", Qt::Key_Escape);
1312
1313 AssignKeyToButton("A", Qt::Key_A);
1314 AssignKeyToButton("B", Qt::Key_B);
1315 AssignKeyToButton("C", Qt::Key_C);
1316 AssignKeyToButton("D", Qt::Key_D);
1317 AssignKeyToButton("E", Qt::Key_E);
1318 AssignKeyToButton("F", Qt::Key_F);
1319
1320 AssignKeyToButton("(", Qt::Key_ParenLeft);
1321 AssignKeyToButton(")", Qt::Key_ParenRight);
1322 AssignKeyToButton("sin(", Qt::Key_S, Qt::ControlModifier);
1323 AssignKeyToButton("cos(", Qt::Key_C, Qt::ControlModifier);
1324 AssignKeyToButton("tan(", Qt::Key_T, Qt::ControlModifier);
1325 AssignKeyToButton("ctan(", Qt::Key_O, Qt::ControlModifier);
1326 AssignKeyToButton("asin(", Qt::Key_S, Qt::ShiftModifier);
1327 AssignKeyToButton("acos(", Qt::Key_C, Qt::ShiftModifier);
1328 AssignKeyToButton("atan(", Qt::Key_T, Qt::ShiftModifier);
1329 AssignKeyToButton("actan(", Qt::Key_O, Qt::ShiftModifier);
1330 AssignKeyToButton("pi", Qt::Key_P);
1331 AssignKeyToButton("ln(", Qt::Key_N, Qt::ControlModifier);
1332 AssignKeyToButton("log(", Qt::Key_L, Qt::ControlModifier);
1333 AssignKeyToButton("exp(", Qt::Key_E, Qt::ControlModifier);
1334 AssignKeyToButton("ln(", Qt::Key_N, Qt::ControlModifier);
1335 AssignKeyToButton("1/x", Qt::Key_Slash, Qt::ControlModifier);
1336 AssignKeyToButton("1/x", Qt::Key_Slash, Qt::ControlModifier | Qt::KeypadModifier);
1337 AssignKeyToButton("exp", Qt::Key_X, Qt::ControlModifier);
1338 AssignKeyToButton("^2", Qt::Key_2, Qt::ControlModifier);
1339 AssignKeyToButton("^3", Qt::Key_3, Qt::ControlModifier);
1340 AssignKeyToButton("^", Qt::Key_AsciiCircum);
1341 AssignKeyToButton("^", Qt::Key_6, Qt::ControlModifier);
1342 AssignKeyToButton("fact(", Qt::Key_F, Qt::ControlModifier);
1343 AssignKeyToButton("dms(", Qt::Key_M);
1344
1345 AssignKeyToButton("Hex", Qt::Key_F5);
1346 AssignKeyToButton("Dec", Qt::Key_F6);
1347 AssignKeyToButton("Oct", Qt::Key_F7);
1348 AssignKeyToButton("Bin", Qt::Key_F8);
1349
1350 AssignKeyToButton("Deg", Qt::Key_F2);
1351 AssignKeyToButton("Rad", Qt::Key_F3);
1352 AssignKeyToButton("Grad", Qt::Key_F4);
1353
1354 AssignKeyToButton("Hyp", Qt::Key_H);
1355 AssignKeyToButton("Inv", Qt::Key_I);
1356
1357 AssignKeyToButton("MS", Qt::Key_M, Qt::ControlModifier);
1358 AssignKeyToButton("MR", Qt::Key_R, Qt::ControlModifier);
1359 AssignKeyToButton("MC", Qt::Key_E, Qt::ShiftModifier);
1360
1361 //AssignKeyToButton("exp(", Qt::Key_P, Qt::ControlModifier); //Добавление функции без кнопки на окне.
1362 }
1363
1364