Guest User

Code

a guest
Jan 24th, 2021
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.46 KB | None | 0 0
  1. //Complete code below :
  2.  
  3. #include "MainFrame.hpp"
  4. #include "wx/event.h"
  5. #include "wx/gdicmn.h"
  6. #include "wx/gtk/textctrl.h"
  7. #include "wx/gtk/textentry.h"
  8. #include "wx/sizer.h"
  9. #include "wx/textctrl.h"
  10. #include <string>
  11. #include <sstream>
  12.  
  13. template<typename T>
  14. wxString toString(T val){
  15.     std::stringstream ss;
  16.     ss<<val;
  17.     return ss.str();
  18. }
  19.  
  20. enum {  BUTTON_0 = 1000,
  21.         BUTTON_1 = 1001,
  22.         BUTTON_2 = 1002,
  23.         BUTTON_3 = 1003,
  24.         BUTTON_4 = 1004,
  25.         BUTTON_5 = 1005,
  26.         BUTTON_6 = 1006,
  27.         BUTTON_7 = 1007,
  28.         BUTTON_8 = 1008,
  29.         BUTTON_9 = 1009,
  30.         BUTTON_ADD = 1010,
  31.         BUTTON_SUB = 1011,
  32.         BUTTON_MUL = 1012,
  33.         BUTTON_DIV = 1013,
  34.         BUTTON_00 = 1014,
  35.         BUTTON_CLR = 1015,
  36.         BUTTON_RES = 1016,
  37.         BUTTON_DECM = 1017
  38.     };
  39.  
  40. //event table
  41. wxBEGIN_EVENT_TABLE(MainFrame, wxFrame)
  42.     EVT_BUTTON(BUTTON_0, MainFrame::OnButton0)
  43.     EVT_BUTTON(BUTTON_00, MainFrame::OnButton00)
  44.     EVT_BUTTON(BUTTON_1, MainFrame::OnButton1)
  45.     EVT_BUTTON(BUTTON_2, MainFrame::OnButton2)
  46.     EVT_BUTTON(BUTTON_3, MainFrame::OnButton3)
  47.     EVT_BUTTON(BUTTON_4, MainFrame::OnButton4)
  48.     EVT_BUTTON(BUTTON_5, MainFrame::OnButton5)
  49.     EVT_BUTTON(BUTTON_6, MainFrame::OnButton6)
  50.     EVT_BUTTON(BUTTON_7, MainFrame::OnButton7)
  51.     EVT_BUTTON(BUTTON_8, MainFrame::OnButton8)
  52.     EVT_BUTTON(BUTTON_9, MainFrame::OnButton9)
  53.     EVT_BUTTON(BUTTON_DECM, MainFrame::OnDecm)
  54.     EVT_BUTTON(BUTTON_ADD, MainFrame::OnAdd)
  55.     EVT_BUTTON(BUTTON_SUB, MainFrame::OnSub)
  56.     EVT_BUTTON(BUTTON_MUL, MainFrame::OnMul)
  57.     EVT_BUTTON(BUTTON_DIV, MainFrame::OnDiv)
  58.     EVT_BUTTON(BUTTON_CLR, MainFrame::OnClr)
  59.     EVT_BUTTON(BUTTON_RES, MainFrame::OnRes)
  60.     EVT_KEY_DOWN(MainFrame::OnKeypad)
  61. wxEND_EVENT_TABLE()
  62.  
  63. MainFrame::MainFrame() : wxFrame(nullptr, wxID_ANY, "Computerator"){
  64.     pTopBoxSizer = new wxBoxSizer(wxVERTICAL);
  65.     pTopPanel = new wxPanel(this, wxID_ANY);
  66.     //add TopPanel to TopBoxSizer with proportion = 1 and make it expand on frame resize
  67.     //also add 0px border to all sides
  68.     pTopBoxSizer->Add(pTopPanel, 1, wxEXPAND | wxALL, 1);
  69.     //add the TopBoxSizer to this
  70.     this->SetSizer(pTopBoxSizer);
  71.  
  72.     //sub sizer in which we will add child objects
  73.     //this sizer is a child of pTopPanel, i.e inside it
  74.     pSubBoxSizer = new wxBoxSizer(wxVERTICAL); //we will add new widgets vertically
  75.     pTopPanel->SetSizer(pSubBoxSizer); //wx widgets will query this sizer to get minimum size
  76.     // pTopPanel->SetMinSize(wxSize(200, 300));
  77.  
  78.     //text control for entering operations
  79.     pTextCtrl = new wxTextCtrl(pTopPanel, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxTE_READONLY | wxTE_RIGHT);
  80.     //horizontal sizer for TextControl
  81.     pTextCtrlSizer = new wxBoxSizer(wxHORIZONTAL);
  82.     pTextCtrlSizer->Add(pTextCtrl, 1, wxRIGHT | wxLEFT | wxTOP, 10);
  83.     //add this sizer to SubBoxSizer
  84.     pSubBoxSizer->Add(pTextCtrlSizer, 0, wxEXPAND);
  85.  
  86.     //create buttons
  87.     wxSize buttonSize = wxDefaultSize;
  88.     pButtonClr = new wxButton(pTopPanel, BUTTON_CLR, "Clr", wxDefaultPosition, buttonSize);
  89.     pButtonDiv = new wxButton(pTopPanel, BUTTON_DIV, "/", wxDefaultPosition, buttonSize);
  90.     pButtonMul = new wxButton(pTopPanel, BUTTON_MUL, "x", wxDefaultPosition, buttonSize);
  91.     pButton00 = new wxButton(pTopPanel, BUTTON_00, "00", wxDefaultPosition, buttonSize);
  92.     pButtonDecm = new wxButton(pTopPanel, BUTTON_DECM, ".", wxDefaultPosition, buttonSize);
  93.     pButtonSub = new wxButton(pTopPanel, BUTTON_SUB, "-"); //these 3 buttons will be on the right side
  94.     pButtonAdd = new wxButton(pTopPanel, BUTTON_ADD, "+");
  95.     pButtonRes = new wxButton(pTopPanel, BUTTON_RES, "=");
  96.     Buttons.push_back(std::shared_ptr<wxButton>(new wxButton(pTopPanel, BUTTON_0, "0", wxDefaultPosition, buttonSize)));
  97.     Buttons.push_back(std::shared_ptr<wxButton>(new wxButton(pTopPanel, BUTTON_1, "1", wxDefaultPosition, buttonSize)));
  98.     Buttons.push_back(std::shared_ptr<wxButton>(new wxButton(pTopPanel, BUTTON_2, "2", wxDefaultPosition, buttonSize)));
  99.     Buttons.push_back(std::shared_ptr<wxButton>(new wxButton(pTopPanel, BUTTON_3, "3", wxDefaultPosition, buttonSize)));
  100.     Buttons.push_back(std::shared_ptr<wxButton>(new wxButton(pTopPanel, BUTTON_4, "4", wxDefaultPosition, buttonSize)));
  101.     Buttons.push_back(std::shared_ptr<wxButton>(new wxButton(pTopPanel, BUTTON_5, "5", wxDefaultPosition, buttonSize)));
  102.     Buttons.push_back(std::shared_ptr<wxButton>(new wxButton(pTopPanel, BUTTON_6, "6", wxDefaultPosition, buttonSize)));
  103.     Buttons.push_back(std::shared_ptr<wxButton>(new wxButton(pTopPanel, BUTTON_7, "7", wxDefaultPosition, buttonSize)));
  104.     Buttons.push_back(std::shared_ptr<wxButton>(new wxButton(pTopPanel, BUTTON_8, "8", wxDefaultPosition, buttonSize)));
  105.     Buttons.push_back(std::shared_ptr<wxButton>(new wxButton(pTopPanel, BUTTON_9, "9", wxDefaultPosition, buttonSize)));
  106.  
  107.     //add grid sizer for buttons
  108.     pLeftKeypadSizer = new wxGridSizer(5, 3, 10, 10);
  109.     pLeftKeypadSizer->Add(pButtonClr);
  110.     pLeftKeypadSizer->Add(pButtonDiv);
  111.     pLeftKeypadSizer->Add(pButtonMul);
  112.     pLeftKeypadSizer->Add(Buttons[7].get());
  113.     pLeftKeypadSizer->Add(Buttons[8].get());
  114.     pLeftKeypadSizer->Add(Buttons[9].get());
  115.     pLeftKeypadSizer->Add(Buttons[4].get());
  116.     pLeftKeypadSizer->Add(Buttons[5].get());   
  117.     pLeftKeypadSizer->Add(Buttons[6].get());
  118.     pLeftKeypadSizer->Add(Buttons[1].get());
  119.     pLeftKeypadSizer->Add(Buttons[2].get());
  120.     pLeftKeypadSizer->Add(Buttons[3].get());
  121.     pLeftKeypadSizer->Add(pButton00);
  122.     pLeftKeypadSizer->Add(Buttons[0].get());
  123.     pLeftKeypadSizer->Add(pButtonDecm);
  124.  
  125.     //right keypad sizer for -/+/= buttons
  126.     pRightKeypadSizer = new wxBoxSizer(wxVERTICAL);
  127.     pRightKeypadSizer->Add(pButtonSub, 1, wxEXPAND | wxALL, 10);
  128.     pRightKeypadSizer->Add(pButtonAdd, 2, wxEXPAND | wxALL, 10);
  129.     pRightKeypadSizer->Add(pButtonRes, 2, wxEXPAND | wxALL, 10);
  130.  
  131.     //sizer for keypad
  132.     pKeypadSizer = new wxBoxSizer(wxHORIZONTAL);
  133.     pKeypadSizer->Add(pLeftKeypadSizer, 3, wxEXPAND | wxTOP, 10);
  134.     pKeypadSizer->Add(pRightKeypadSizer, 1, wxEXPAND);
  135.  
  136.     //add KeypadSizer to SubBoxSizer
  137.     pSubBoxSizer->Add(pKeypadSizer, 1, wxEXPAND);
  138.     this->SetMinSize(pSubBoxSizer->GetMinSize());
  139.     this->SetSize(pSubBoxSizer->GetSize());
  140.  
  141.     Centre();
  142.     SetFocus();
  143. }
  144.  
  145. void MainFrame::OnAdd(wxCommandEvent &event){
  146.     currentOperand = RIGHT_OPERAND;
  147.     currentOperation = ADD;
  148. }
  149.  
  150. void MainFrame::OnSub(wxCommandEvent &event){
  151.     currentOperand = RIGHT_OPERAND;
  152.     currentOperation = SUB;
  153. }
  154.  
  155. void MainFrame::OnMul(wxCommandEvent &event){
  156.     currentOperand = RIGHT_OPERAND;
  157.     currentOperation = MUL;
  158. }
  159.  
  160. void MainFrame::OnDiv(wxCommandEvent &event){
  161.     currentOperand = RIGHT_OPERAND;
  162.     currentOperation = DIV;
  163. }
  164.  
  165. void MainFrame::OnButton0(wxCommandEvent &event){
  166.     if(currentOperand == LEFT_OPERAND){
  167.         leftOp.push_back('0');
  168.     }else{
  169.         rightOp.push_back('0');
  170.     }
  171.     UpdateRes();
  172. }
  173.  
  174. void MainFrame::OnButton1(wxCommandEvent &event){
  175.     if(currentOperand == LEFT_OPERAND){
  176.         leftOp.push_back('1');
  177.     }else{
  178.         rightOp.push_back('1');
  179.     }
  180.     UpdateRes();
  181. }
  182.  
  183. void MainFrame::OnButton2(wxCommandEvent &event){
  184.     if(currentOperand == LEFT_OPERAND){
  185.         leftOp.push_back('2');
  186.     }else{
  187.         rightOp.push_back('2');
  188.     }
  189.     UpdateRes();
  190. }
  191.  
  192. void MainFrame::OnButton3(wxCommandEvent &event){
  193.     if(currentOperand == LEFT_OPERAND){
  194.         leftOp.push_back('3');
  195.     }else{
  196.         rightOp.push_back('3');
  197.     }
  198.     UpdateRes();
  199. }
  200.  
  201. void MainFrame::OnButton4(wxCommandEvent &event){
  202.     if(currentOperand == LEFT_OPERAND){
  203.         leftOp.push_back('4');
  204.     }else{
  205.         rightOp.push_back('4');
  206.     }
  207.     UpdateRes();
  208. }
  209.  
  210. void MainFrame::OnButton5(wxCommandEvent &event){
  211.     if(currentOperand == LEFT_OPERAND){
  212.         leftOp.push_back('5');
  213.     }else{
  214.         rightOp.push_back('5');
  215.     }
  216.     UpdateRes();
  217. }
  218.  
  219. void MainFrame::OnButton6(wxCommandEvent &event){
  220.     if(currentOperand == LEFT_OPERAND){
  221.         leftOp.push_back('6');
  222.     }else{
  223.         rightOp.push_back('6');
  224.     }
  225.     UpdateRes();
  226. }
  227.  
  228. void MainFrame::OnButton7(wxCommandEvent &event){
  229.     if(currentOperand == LEFT_OPERAND){
  230.         leftOp.push_back('7');
  231.     }else{
  232.         rightOp.push_back('7');
  233.     }
  234.     UpdateRes();
  235. }
  236.  
  237. void MainFrame::OnButton8(wxCommandEvent &event){
  238.     if(currentOperand == LEFT_OPERAND){
  239.         leftOp.push_back('8');
  240.     }else{
  241.         rightOp.push_back('8');
  242.     }
  243.     UpdateRes();
  244. }
  245.  
  246. void MainFrame::OnButton9(wxCommandEvent &event){
  247.     if(currentOperand == LEFT_OPERAND){
  248.         leftOp.push_back('9');
  249.     }else{
  250.         rightOp.push_back('9');
  251.     }
  252.     UpdateRes();
  253.     std::cout<<"clear"<<std::endl;
  254. }
  255.  
  256. void MainFrame::OnButton00(wxCommandEvent &event){
  257.     if(currentOperand == LEFT_OPERAND){
  258.         leftOp.push_back('0');
  259.         leftOp.push_back('0');
  260.     }else{
  261.         rightOp.push_back('0');
  262.         rightOp.push_back('0');
  263.     }
  264.     UpdateRes();
  265. }
  266.  
  267. void MainFrame::OnDecm(wxCommandEvent &event){
  268.     if(currentOperand == LEFT_OPERAND){
  269.         leftOp += ".";
  270.     }else{
  271.         rightOp += ".";
  272.     }
  273.     UpdateRes();
  274. }
  275.  
  276. void MainFrame::OnRes(wxCommandEvent &event){
  277.     if(currentOperand == RIGHT_OPERAND){
  278.         if(currentOperation == ADD){
  279.             result = stod(leftOp) + stod(rightOp);
  280.         }else if(currentOperation == SUB){
  281.             result = stod(leftOp) - stod(rightOp);
  282.         }else if(currentOperation == MUL){
  283.             result = stod(leftOp) * stod(rightOp);
  284.         }else{
  285.             result = stod(leftOp) / stod(rightOp);
  286.         }
  287.         pTextCtrl->Clear();
  288.         pTextCtrl->AppendText(toString(result));
  289.  
  290.         //reset operand and update the result as leftOp
  291.         currentOperand = LEFT_OPERAND;
  292.         leftOp = toString(result);
  293.         rightOp.clear();
  294.     }
  295. }
  296.  
  297. void MainFrame::OnClr(wxCommandEvent &event){
  298.     leftOp.clear();
  299.     rightOp.clear();
  300.     result = 0;
  301.     pTextCtrl->Clear();
  302. }
  303.  
  304. void MainFrame::UpdateRes(){
  305.     if(currentOperand == LEFT_OPERAND){
  306.         pTextCtrl->Clear();
  307.         pTextCtrl->AppendText(toString(leftOp));
  308.     }else{
  309.         pTextCtrl->Clear();
  310.         pTextCtrl->AppendText(toString(rightOp));
  311.     }
  312. }
  313.  
  314. void MainFrame::OnKeypad(wxKeyEvent &event){
  315.     std::cout<<"I called"<<std::endl;
  316.     if(event.GetKeyCode() == WXK_NUMPAD0) OnButton0(e);
  317.     else if(event.GetKeyCode() == WXK_NUMPAD1) OnButton1(e);
  318.     else if(event.GetKeyCode() == WXK_NUMPAD2) OnButton2(e);
  319.     else if(event.GetKeyCode() == WXK_NUMPAD3) OnButton3(e);
  320.     else if(event.GetKeyCode() == WXK_NUMPAD4) OnButton4(e);
  321.     else if(event.GetKeyCode() == WXK_NUMPAD5) OnButton5(e);
  322.     else if(event.GetKeyCode() == WXK_NUMPAD6) OnButton6(e);
  323.     else if(event.GetKeyCode() == WXK_NUMPAD7) OnButton7(e);
  324.     else if(event.GetKeyCode() == WXK_NUMPAD8) OnButton8(e);
  325.     else if(event.GetKeyCode() == WXK_NUMPAD9){
  326.         std::cout<<"Again I called"<<std::endl;
  327.         OnButton9(e);
  328.     }
  329.     else if(event.GetKeyCode() == WXK_NUMPAD_ADD) OnAdd(e);
  330.     else if(event.GetKeyCode() == WXK_NUMPAD_SUBTRACT) OnSub(e);
  331.     else if(event.GetKeyCode() == WXK_NUMPAD_MULTIPLY) OnMul(e);
  332.     else if(event.GetKeyCode() == WXK_NUMPAD_DIVIDE) OnDiv(e);
  333.     else if(event.GetKeyCode() == WXK_NUMPAD_DECIMAL) OnDecm(e);
  334.     else if(event.GetKeyCode() == WXK_RETURN) OnRes(e);
  335.  
  336. }
  337.  
  338.  
Advertisement
Add Comment
Please, Sign In to add comment