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