From 7f01dceac3c6f5be7c6745baf14c4b0d092aa31f Mon Sep 17 00:00:00 2001 From: Matt Turner Date: Thu, 20 Dec 2007 00:39:33 +0000 Subject: Create branch to allow shortcuts for buttons. Partial rewrite :( git-svn-id: svn://mattst88.com/svn/calculator/branches/CalculatorButton@9 40705d3a-cdd4-446d-8ced-669f9f7342eb --- COPYING | 25 ++++++++++ Calculator.cpp | 24 ++++++++++ Calculator.h | 10 ++++ CalculatorButton.cpp | 24 ++++++++++ CalculatorButton.h | 17 +++++++ CalculatorWindow.cpp | 133 +++++++++++++++++++++++++++++++++++++++++++++++++++ CalculatorWindow.h | 20 ++++++++ Makefile | 17 +++++++ 8 files changed, 270 insertions(+) create mode 100644 COPYING create mode 100755 Calculator.cpp create mode 100755 Calculator.h create mode 100644 CalculatorButton.cpp create mode 100644 CalculatorButton.h create mode 100644 CalculatorWindow.cpp create mode 100644 CalculatorWindow.h create mode 100755 Makefile diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..bce71b5 --- /dev/null +++ b/COPYING @@ -0,0 +1,25 @@ +* Copyright (c) 2007, Matt Turner +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/Calculator.cpp b/Calculator.cpp new file mode 100755 index 0000000..e823e25 --- /dev/null +++ b/Calculator.cpp @@ -0,0 +1,24 @@ +#include "Calculator.h" + +Calculator::Calculator(int argc, char* argv[]): + Application("application/x-vnd.Calculator", argc, argv) { + + Rect r(Point(100, 100), Point(275, 275)); + + CalculatorWindow * pCalculatorWindow = + new CalculatorWindow(r, "Calculator", WINDOW_LAYOUT_NOTHING, + APPLICATION_WINDOW_NO_VIEW | WINDOW_FLAG_NOT_SIZEABLE); + + pCalculatorWindow->GetTitleWindow()->SetFlags( + (TitleWindowFlags)(pCalculatorWindow->GetTitleWindow()->GetFlags()) + ); + + pCalculatorWindow->Show(); +} + +int main(int argc, char *argv[]) { + Calculator pCalculator(argc, argv); + + return pCalculator.Run(); +} + diff --git a/Calculator.h b/Calculator.h new file mode 100755 index 0000000..596ec1c --- /dev/null +++ b/Calculator.h @@ -0,0 +1,10 @@ +#include +#include + +using namespace SkyGI; + +class Calculator : public Application { + public: + Calculator(int argc, char *argv[]); +}; + diff --git a/CalculatorButton.cpp b/CalculatorButton.cpp new file mode 100644 index 0000000..59fcfe3 --- /dev/null +++ b/CalculatorButton.cpp @@ -0,0 +1,24 @@ +#include "CalculatorButton.h" + +CalculatorButton::CalculatorButton( Window * pParent, + const Rect rFrame, + const String &pLabel, + unsigned int nWindowLayoutFlags, + unsigned int uiVKey) +{ + pButton = new Button(pParent, rFrame, pLabel, nWindowLayoutFlags); + + Shortcut pShortcut(pButton, uiVKey, 0, KEY_QUAL_NONE); + pShortcut.Fire.Connect(this, &CalculatorButton::OnClicked); +} + +CalculatorButton::CalculatorButton( Window * pParent, + const Rect rFrame, + const String &pLabel, + unsigned int nWindowLayoutFlags) +{ + pButton = new Button(pParent, rFrame, pLabel, nWindowLayoutFlags); +} + +void CalculatorButton::OnClicked() { +} diff --git a/CalculatorButton.h b/CalculatorButton.h new file mode 100644 index 0000000..ad16d8c --- /dev/null +++ b/CalculatorButton.h @@ -0,0 +1,17 @@ + +class CalculatorButton : public Button { + public: + CalculatorButton::CalculatorButton( Window * pParent, + const Rect rFrame, + const String &pLabel, + unsigned int nWindowLayoutFlags, + unsigned int uiVKey); + CalculatorButton::CalculatorButton( Window * pParent, + const Rect rFrame, + const String &pLabel, + unsigned int nWindowLayoutFlags); + void OnClicked(); + private: + Button * pButton; +}; + 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; +} + diff --git a/CalculatorWindow.h b/CalculatorWindow.h new file mode 100644 index 0000000..8a29e6a --- /dev/null +++ b/CalculatorWindow.h @@ -0,0 +1,20 @@ + +class CalculatorWindow : public ApplicationWindow { + public: + CalculatorWindow( const Rect &rFrame, + const String& szTitle, + unsigned int nWindowLayoutFlags, + unsigned int uiFlags = 0); + void OnCommand( const MessageCommand *pMessage); + private: + void Clear(); + void doOperation( int next_operation); + + TextView * pText; + String * line; + double total; + double operand; + int operation; + bool new_operand; +}; + diff --git a/Makefile b/Makefile new file mode 100755 index 0000000..0106a82 --- /dev/null +++ b/Makefile @@ -0,0 +1,17 @@ +CPP=g++ +WARN=-W -Wall +CFLAGS=-O2 ${WARN} +LDFLAGS=-los + +EXE=Calculator.app + +OBJS=CalculatorButton.o CalculatorWindow.o Calculator.o + +all: ${OBJS} + ${CPP} ${LDFLAGS} ${OBJS} -o ${EXE} + +%.o: %.cpp + ${CPP} ${CFLAGS} -c -o $@ $< + +clean: + rm ${OBJS} ${EXE} -- cgit v1.2.3