diff options
author | Matt Turner <mattst88@gmail.com> | 2007-12-20 00:39:33 +0000 |
---|---|---|
committer | Matt Turner <mattst88@gmail.com> | 2007-12-20 00:39:33 +0000 |
commit | 7f01dceac3c6f5be7c6745baf14c4b0d092aa31f (patch) | |
tree | a8bc8c92fd3c9d61a17e2afaf8e8bdab4f210a66 /CalculatorWindow.cpp |
Create branch to allow shortcuts for buttons. Partial rewrite :(CalculatorButton
git-svn-id: svn://mattst88.com/svn/calculator/branches/CalculatorButton@9 40705d3a-cdd4-446d-8ced-669f9f7342eb
Diffstat (limited to 'CalculatorWindow.cpp')
-rw-r--r-- | CalculatorWindow.cpp | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/CalculatorWindow.cpp b/CalculatorWindow.cpp new file mode 100644 index 0000000..ebbbc77 --- /dev/null +++ b/CalculatorWindow.cpp @@ -0,0 +1,133 @@ +#include "skyos/vkey.h" + +#include "CalculatorWindow.h" +#include "CalculatorButton.h" + +CalculatorWindow::CalculatorWindow( const Rect &rFrame, + const String& szTitle, + unsigned int nWindowLayoutFlags, + unsigned int uiFlags + ): ApplicationWindow(rFrame, szTitle, nWindowLayoutFlags, 0, uiFlags) +{ + Clear(); + + pText = new TextView(this, Rect(15, 30, 160, 50), WINDOW_LAYOUT_FOLLOW_RIGHT, TEXTVIEW_FLAG_SINGLE_LINE); + pText->Enable(false); + pText->Set("0.0"); + + CalculatorButton * pCalculatorButton; + + pCalculatorButton = new CalculatorButton(this, Rect(Point(15, 60), Point(40, 82)), "7", 0, VKEY_KEYPAD_7); + pCalculatorButton = new CalculatorButton(this, Rect(Point(45, 60), Point(70, 82)), "8", 0, VKEY_KEYPAD_8); + pCalculatorButton = new CalculatorButton(this, Rect(Point(75, 60), Point(100, 82)), "9", 0, VKEY_KEYPAD_9); + pCalculatorButton = new CalculatorButton(this, Rect(Point(105, 60), Point(160, 82)), "Clear", 0, VKEY_BACKSPACE); + + pCalculatorButton = new CalculatorButton(this, Rect(Point(15, 87), Point(40, 109)), "4", 0, VKEY_KEYPAD_4); + pCalculatorButton = new CalculatorButton(this, Rect(Point(45, 87), Point(70, 109)), "5", 0, VKEY_KEYPAD_5); + pCalculatorButton = new CalculatorButton(this, Rect(Point(75, 87), Point(100, 109)), "6", 0, VKEY_KEYPAD_6); + pCalculatorButton = new CalculatorButton(this, Rect(Point(105, 87), Point(130, 109)), "+", 0, VKEY_KEYPAD_PLUS); + pCalculatorButton = new CalculatorButton(this, Rect(Point(135, 87), Point(160, 109)), "-", 0, VKEY_KEYPAD_MINUS); + + pCalculatorButton = new CalculatorButton(this, Rect(Point(15, 114), Point(40, 136)), "1", 0, VKEY_KEYPAD_1); + pCalculatorButton = new CalculatorButton(this, Rect(Point(45, 114), Point(70, 136)), "2", 0, VKEY_KEYPAD_2); + pCalculatorButton = new CalculatorButton(this, Rect(Point(75, 114), Point(100, 136)), "3", 0, VKEY_KEYPAD_3); + pCalculatorButton = new CalculatorButton(this, Rect(Point(105, 114), Point(130, 136)), "\u00D7", 0, VKEY_KEYPAD_MULT); + pCalculatorButton = new CalculatorButton(this, Rect(Point(135, 114), Point(160, 136)), "\u00F7", 0, VKEY_KEYPAD_DIVIDE); + + pCalculatorButton = new CalculatorButton(this, Rect(Point(15, 141), Point(40, 163)), "0", 0, VKEY_KEYPAD_0); + pCalculatorButton = new CalculatorButton(this, Rect(Point(45, 141), Point(70, 163)), ".", 0, VKEY_KEYPAD_SPERATOR); // FIXME: SPERATOR (sic) + pCalculatorButton = new CalculatorButton(this, Rect(Point(75, 141), Point(100, 164)), "\u00B1", 0); + pCalculatorButton = new CalculatorButton(this, Rect(Point(105, 141), Point(160, 164)), "=", 0, VKEY_KEYPAD_ENTER); +} + +void CalculatorWindow::OnCommand(const MessageCommand *pMessage) { + const String minus = String("-"); + const String point = String("."); + char c[2] = {'0', '\0'}; + int message = pMessage->GetID(); + + line = pText->GetDocument()->GetLine(0); + + switch (message) { + case BUTTON_ZERO: + case BUTTON_ONE: + case BUTTON_TWO: + case BUTTON_THREE: + case BUTTON_FOUR: + case BUTTON_FIVE: + case BUTTON_SIX: + case BUTTON_SEVEN: + case BUTTON_EIGHT: + case BUTTON_NINE: + c[0] += message; + if (new_operand) { + pText->Set((const char *)&c); + new_operand = false; + } else { + pText->Append((const char *)&c); + } + break; + case BUTTON_PLUS: + case BUTTON_MINUS: + case BUTTON_TIMES: + case BUTTON_DIVIDE: + case BUTTON_EQUALS: + doOperation(message); + break; + case BUTTON_POINT: +/* if(line->find(point)) { // FIXME: figure out how to do this more directly + pText->Append(point); + }*/ + if (!strchr(line->c_str(), '.')) { + pText->Append(point); + } + break; + case BUTTON_SIGN: + if (line->c_str()[0] != '-') { + pText->Insert(minus, Point(0, 0)); + } else { + pText->Remove(Point(0,0)); + } + break; + case BUTTON_CLEAR: + Clear(); + pText->Set("0.0"); + break; + } + printf("line: %s; total: %.0f; operand: %.0f; operator: %d\n", line->c_str(), total, operand, operation); +} + +void CalculatorWindow::Clear() { + operation = BUTTON_PLUS; + total = 0.0; + operand = 0.0; + new_operand = true; +} + +void CalculatorWindow::doOperation(int next_operation) { + char str[32] = {0}; + + operand = atof(line->c_str()); + + switch (operation) { + case BUTTON_PLUS: + total += operand; + break; + case BUTTON_MINUS: + total -= operand; + break; + case BUTTON_TIMES: + total *= operand; + break; + case BUTTON_DIVIDE: + total /= operand; + break; + } + snprintf(str, 32, "%f", total); + pText->Set((const char *)&str); + + operation = next_operation; + operand = 0.0; + new_operand = true; +} + |