From 403687d8d25dfa7fc0ffe84ffe488ea342b055aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20A=C3=9Fmus?= Date: Sat, 28 Mar 2009 19:45:45 +0000 Subject: [PATCH] * Beautified everything with the help of BControlLook. * When embedded on the desktop, draw with alpha compositing. * Implemented flashing the pressed keys. * Clicking the calculator icon in compressed mode will evaluate. * Cleaned up dead code, did some refactoring. * Removed Audio Feedback option, since the feature is currently missing support in Haiku. (play_sound() unimplemented) git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@29763 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/apps/deskcalc/CalcView.cpp | 525 ++++++++++++++--------- src/apps/deskcalc/CalcView.h | 10 +- src/apps/deskcalc/DeskCalc.h | 8 - src/apps/deskcalc/ExpressionTextView.cpp | 29 +- 4 files changed, 354 insertions(+), 218 deletions(-) delete mode 100644 src/apps/deskcalc/DeskCalc.h diff --git a/src/apps/deskcalc/CalcView.cpp b/src/apps/deskcalc/CalcView.cpp index de575ea1a7..03f3ef6052 100644 --- a/src/apps/deskcalc/CalcView.cpp +++ b/src/apps/deskcalc/CalcView.cpp @@ -21,14 +21,17 @@ #include #include #include +#include #include #include #include #include #include +#include #include #include #include +#include #include #include "CalcApplication.h" @@ -37,15 +40,20 @@ #include "ExpressionTextView.h" -const uint8 K_COLOR_OFFSET = 32; -const float K_FONT_YPROP = 0.6f; -const float K_FONT_XPROP = 0.6f; -const float K_DISPLAY_YPROP = 0.2f; +//const uint8 K_COLOR_OFFSET = 32; +const float kFontScaleY = 0.4f; +const float kFontScaleX = 0.4f; +const float kExpressionFontScaleY = 0.6f; +const float kDisplayScaleY = 0.2f; + +static const bigtime_t kFlashOnOffInterval = 100000; enum { - K_OPTIONS_AUTO_NUM_LOCK = 'opan', - K_OPTIONS_AUDIO_FEEDBACK = 'opaf', - K_OPTIONS_SHOW_KEYPAD = 'opsk' + MSG_OPTIONS_AUTO_NUM_LOCK = 'opan', + MSG_OPTIONS_AUDIO_FEEDBACK = 'opaf', + MSG_OPTIONS_SHOW_KEYPAD = 'opsk', + + MSG_UNFLASH_KEY = 'uflk' }; // default calculator key pad layout @@ -56,12 +64,17 @@ const char *kDefaultKeypadDescription = "0 . BS = C \n"; +enum { + FLAGS_FLASH_KEY = 1 << 0, + FLAGS_MOUSE_DOWN = 1 << 1 +}; + struct CalcView::CalcKey { char label[8]; char code[8]; char keymap[4]; uint32 flags; - float width; +// float width; }; @@ -75,34 +88,35 @@ CalcView *CalcView::Instantiate(BMessage *archive) CalcView::CalcView(BRect frame, rgb_color rgbBaseColor, BMessage *settings) - : BView(frame, "DeskCalc", B_FOLLOW_ALL_SIDES, - B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE | B_FRAME_EVENTS), - fColums(5), - fRows(4), + : + BView(frame, "DeskCalc", B_FOLLOW_ALL_SIDES, + B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE | B_FRAME_EVENTS), + fColums(5), + fRows(4), - fBaseColor(rgbBaseColor), - fExpressionBGColor((rgb_color){ 0, 0, 0, 255 }), + fBaseColor(rgbBaseColor), + fExpressionBGColor((rgb_color){ 0, 0, 0, 255 }), - fWidth(1), - fHeight(1), + fWidth(1), + fHeight(1), - fKeypadDescription(strdup(kDefaultKeypadDescription)), - fKeypad(NULL), + fKeypadDescription(strdup(kDefaultKeypadDescription)), + fKeypad(NULL), #ifdef __HAIKU__ - fCalcIcon(new BBitmap(BRect(0, 0, 15, 15), 0, B_RGBA32)), + fCalcIcon(new BBitmap(BRect(0, 0, 15, 15), 0, B_RGBA32)), #else - fCalcIcon(new BBitmap(BRect(0, 0, 15, 15), 0, B_CMAP8)), + fCalcIcon(new BBitmap(BRect(0, 0, 15, 15), 0, B_CMAP8)), #endif - fPopUpMenu(NULL), - fAutoNumlockItem(NULL), - fAudioFeedbackItem(NULL), - fShowKeypadItem(NULL), - fAboutItem(NULL), + fPopUpMenu(NULL), + fAutoNumlockItem(NULL), + fAudioFeedbackItem(NULL), + fShowKeypadItem(NULL), + fAboutItem(NULL), - fOptions(new CalcOptions()), - fShowKeypad(true) + fOptions(new CalcOptions()), + fShowKeypad(true) { // create expression text view fExpressionTextView = new ExpressionTextView(_ExpressionRect(), this); @@ -127,33 +141,34 @@ CalcView::CalcView(BRect frame, rgb_color rgbBaseColor, BMessage *settings) CalcView::CalcView(BMessage* archive) - : BView(archive), - fColums(5), - fRows(4), + : + BView(archive), + fColums(5), + fRows(4), - fBaseColor((rgb_color){ 128, 128, 128, 255 }), - fExpressionBGColor((rgb_color){ 0, 0, 0, 255 }), + fBaseColor((rgb_color){ 128, 128, 128, 255 }), + fExpressionBGColor((rgb_color){ 0, 0, 0, 255 }), - fWidth(1), - fHeight(1), + fWidth(1), + fHeight(1), - fKeypadDescription(strdup(kDefaultKeypadDescription)), - fKeypad(NULL), + fKeypadDescription(strdup(kDefaultKeypadDescription)), + fKeypad(NULL), #ifdef __HAIKU__ - fCalcIcon(new BBitmap(BRect(0, 0, 15, 15), 0, B_RGBA32)), + fCalcIcon(new BBitmap(BRect(0, 0, 15, 15), 0, B_RGBA32)), #else - fCalcIcon(new BBitmap(BRect(0, 0, 15, 15), 0, B_CMAP8)), + fCalcIcon(new BBitmap(BRect(0, 0, 15, 15), 0, B_CMAP8)), #endif - fPopUpMenu(NULL), - fAutoNumlockItem(NULL), - fAudioFeedbackItem(NULL), - fShowKeypadItem(NULL), - fAboutItem(NULL), + fPopUpMenu(NULL), + fAutoNumlockItem(NULL), + fAudioFeedbackItem(NULL), + fShowKeypadItem(NULL), + fAboutItem(NULL), - fOptions(new CalcOptions()), - fShowKeypad(true) + fOptions(new CalcOptions()), + fShowKeypad(true) { // create expression text view fExpressionTextView = new ExpressionTextView(_ExpressionRect(), this); @@ -182,8 +197,9 @@ CalcView::~CalcView() void CalcView::AttachedToWindow() { - SetFont(be_bold_font); - + if (be_control_look == NULL) + SetFont(be_bold_font); + BRect frame(Frame()); FrameResized(frame.Width(), frame.Height()); @@ -219,12 +235,12 @@ CalcView::MessageReceived(BMessage* message) // handle paste case B_PASTE: // access system clipboard - if (be_clipboard->Lock()){ + if (be_clipboard->Lock()) { BMessage *clipper = be_clipboard->Data(); //clipper->PrintToStream(); Paste(clipper); be_clipboard->Unlock(); - } // end if + } break; // (replicant) about box requested @@ -232,22 +248,30 @@ CalcView::MessageReceived(BMessage* message) AboutRequested(); break; - case K_OPTIONS_AUTO_NUM_LOCK: + case MSG_OPTIONS_AUTO_NUM_LOCK: fOptions->auto_num_lock = !fOptions->auto_num_lock; fAutoNumlockItem->SetMarked(fOptions->auto_num_lock); break; - case K_OPTIONS_AUDIO_FEEDBACK: + case MSG_OPTIONS_AUDIO_FEEDBACK: fOptions->audio_feedback = !fOptions->audio_feedback; fAudioFeedbackItem->SetMarked(fOptions->audio_feedback); break; - case K_OPTIONS_SHOW_KEYPAD: + case MSG_OPTIONS_SHOW_KEYPAD: fOptions->show_keypad = !fOptions->show_keypad; fShowKeypadItem->SetMarked(fOptions->show_keypad); _ShowKeypad(fOptions->show_keypad); break; - + + case MSG_UNFLASH_KEY: + { + int32 key; + if (message->FindInt32("key", &key) == B_OK) + _FlashKey(key, 0); + break; + } + default: BView::MessageReceived(message); break; @@ -259,13 +283,24 @@ CalcView::MessageReceived(BMessage* message) void CalcView::Draw(BRect updateRect) { + bool drawBackground = true; + if (Parent() && Window()->Bounds() != Frame()) { + // CalcView is embedded somewhere, most likely the Tracker Desktop + // shelf. + drawBackground = false; + } + + SetHighColor(fBaseColor); BRect expressionRect(_ExpressionRect()); if (updateRect.Intersects(expressionRect)) { - if (!fShowKeypad && expressionRect.Height() >= fCalcIcon->Bounds().Height()) { + if (!fShowKeypad + && expressionRect.Height() >= fCalcIcon->Bounds().Height()) { // render calc icon expressionRect.left = fExpressionTextView->Frame().right + 2; - SetHighColor(fBaseColor); - FillRect(updateRect & expressionRect); + if (drawBackground) { + SetHighColor(fBaseColor); + FillRect(updateRect & expressionRect); + } if (fCalcIcon->ColorSpace() == B_RGBA32) { SetDrawingMode(B_OP_ALPHA); @@ -287,39 +322,55 @@ CalcView::Draw(BRect updateRect) // render border around expression text view expressionRect = fExpressionTextView->Frame(); expressionRect.InsetBy(-2, -2); - BeginLineArray(8); + if (fShowKeypad && drawBackground) { + expressionRect.InsetBy(-2, -2); + StrokeRect(expressionRect); + expressionRect.InsetBy(1, 1); + StrokeRect(expressionRect); + expressionRect.InsetBy(1, 1); + } - rgb_color lightShadow = tint_color(fBaseColor, B_DARKEN_1_TINT); - rgb_color darkShadow = tint_color(fBaseColor, B_DARKEN_3_TINT); - - AddLine(BPoint(expressionRect.left, expressionRect.bottom), - BPoint(expressionRect.left, expressionRect.top), - lightShadow); - AddLine(BPoint(expressionRect.left + 1, expressionRect.top), - BPoint(expressionRect.right, expressionRect.top), - lightShadow); - AddLine(BPoint(expressionRect.right, expressionRect.top + 1), - BPoint(expressionRect.right, expressionRect.bottom), - fLightColor); - AddLine(BPoint(expressionRect.left + 1, expressionRect.bottom), - BPoint(expressionRect.right - 1, expressionRect.bottom), - fLightColor); - - expressionRect.InsetBy(1, 1); - AddLine(BPoint(expressionRect.left, expressionRect.bottom), - BPoint(expressionRect.left, expressionRect.top), - darkShadow); - AddLine(BPoint(expressionRect.left + 1, expressionRect.top), - BPoint(expressionRect.right, expressionRect.top), - darkShadow); - AddLine(BPoint(expressionRect.right, expressionRect.top + 1), - BPoint(expressionRect.right, expressionRect.bottom), - fBaseColor); - AddLine(BPoint(expressionRect.left + 1, expressionRect.bottom), - BPoint(expressionRect.right - 1, expressionRect.bottom), - fBaseColor); - - EndLineArray(); + if (be_control_look != NULL) { + uint32 flags = 0; + if (!drawBackground) + flags |= BControlLook::B_BLEND_FRAME; + be_control_look->DrawTextControlBorder(this, expressionRect, + updateRect, fBaseColor, flags); + } else { + BeginLineArray(8); + + rgb_color lightShadow = tint_color(fBaseColor, B_DARKEN_1_TINT); + rgb_color darkShadow = tint_color(fBaseColor, B_DARKEN_3_TINT); + + AddLine(BPoint(expressionRect.left, expressionRect.bottom), + BPoint(expressionRect.left, expressionRect.top), + lightShadow); + AddLine(BPoint(expressionRect.left + 1, expressionRect.top), + BPoint(expressionRect.right, expressionRect.top), + lightShadow); + AddLine(BPoint(expressionRect.right, expressionRect.top + 1), + BPoint(expressionRect.right, expressionRect.bottom), + fLightColor); + AddLine(BPoint(expressionRect.left + 1, expressionRect.bottom), + BPoint(expressionRect.right - 1, expressionRect.bottom), + fLightColor); + + expressionRect.InsetBy(1, 1); + AddLine(BPoint(expressionRect.left, expressionRect.bottom), + BPoint(expressionRect.left, expressionRect.top), + darkShadow); + AddLine(BPoint(expressionRect.left + 1, expressionRect.top), + BPoint(expressionRect.right, expressionRect.top), + darkShadow); + AddLine(BPoint(expressionRect.right, expressionRect.top + 1), + BPoint(expressionRect.right, expressionRect.bottom), + fBaseColor); + AddLine(BPoint(expressionRect.left + 1, expressionRect.bottom), + BPoint(expressionRect.right - 1, expressionRect.bottom), + fBaseColor); + + EndLineArray(); + } } if (!fShowKeypad) @@ -327,76 +378,118 @@ CalcView::Draw(BRect updateRect) // calculate grid sizes BRect keypadRect(_KeypadRect()); + + if (be_control_look != NULL) { + if (drawBackground) + StrokeRect(keypadRect); + keypadRect.InsetBy(1, 1); + } + float sizeDisp = keypadRect.top; - float sizeCol = fWidth / (float)fColums; - float sizeRow = (fHeight - sizeDisp) / (float)fRows; + float sizeCol = (keypadRect.Width() + 1) / (float)fColums; + float sizeRow = (keypadRect.Height() + 1) / (float)fRows; - if (updateRect.Intersects(keypadRect)) { - // TODO: support pressed keys + if (!updateRect.Intersects(keypadRect)) + return; - // paint keypad b/g - SetHighColor(fBaseColor); - FillRect(updateRect & keypadRect); - - // render key main grid - BeginLineArray(((fColums + fRows) << 1) + 1); - - // render cols - AddLine(BPoint(0.0, sizeDisp), - BPoint(0.0, fHeight), - fLightColor); - for (int col = 1; col < fColums; col++) { - AddLine(BPoint(col * sizeCol - 1.0, sizeDisp), - BPoint(col * sizeCol - 1.0, fHeight), - fDarkColor); - AddLine(BPoint(col * sizeCol, sizeDisp), - BPoint(col * sizeCol, fHeight), - fLightColor); - } - AddLine(BPoint(fColums * sizeCol, sizeDisp), - BPoint(fColums * sizeCol, fHeight), - fDarkColor); - - // render rows - for (int row = 0; row < fRows; row++) { - AddLine(BPoint(0.0, sizeDisp + row * sizeRow - 1.0), - BPoint(fWidth, sizeDisp + row * sizeRow - 1.0), - fDarkColor); - AddLine(BPoint(0.0, sizeDisp + row * sizeRow), - BPoint(fWidth, sizeDisp + row * sizeRow), - fLightColor); - } - AddLine(BPoint(0.0, sizeDisp + fRows * sizeRow), - BPoint(fWidth, sizeDisp + fRows * sizeRow), - fDarkColor); - - // main grid complete - EndLineArray(); - - // render key symbols - float halfSizeCol = sizeCol * 0.5f; - SetHighColor(fButtonTextColor); - SetLowColor(fBaseColor); - SetDrawingMode(B_OP_COPY); + SetFontSize(min_c(sizeRow * kFontScaleY, sizeCol * kFontScaleX)); - float fontSize = - min_c(((fHeight - sizeDisp) / (float)fRows) * K_FONT_YPROP, - (fWidth / (float)fColums) * K_FONT_XPROP); - - SetFontSize(fontSize); - - float baselineOffset = ((fHeight - sizeDisp) / (float)fRows) - * (1.0 - K_FONT_YPROP) * 0.5; + if (be_control_look != NULL) { CalcKey *key = fKeypad; for (int row = 0; row < fRows; row++) { for (int col = 0; col < fColums; col++) { - float halfSymbolWidth = StringWidth(key->label) * 0.5f; - DrawString(key->label, - BPoint(col * sizeCol + halfSizeCol - halfSymbolWidth, - sizeDisp + (row + 1) * sizeRow - baselineOffset)); + BRect frame; + frame.left = keypadRect.left + col * sizeCol; + frame.right = keypadRect.left + (col + 1) * sizeCol - 1; + frame.top = sizeDisp + row * sizeRow; + frame.bottom = sizeDisp + (row + 1) * sizeRow - 1; + + if (drawBackground) { + SetHighColor(fBaseColor); + StrokeRect(frame); + } + frame.InsetBy(1, 1); + + uint32 flags = 0; + if (!drawBackground) + flags |= BControlLook::B_BLEND_FRAME; + if (key->flags != 0) + flags |= BControlLook::B_ACTIVATED; + + be_control_look->DrawButtonFrame(this, frame, updateRect, + fBaseColor, fBaseColor, flags); + + be_control_look->DrawButtonBackground(this, frame, updateRect, + fBaseColor, flags); + + be_control_look->DrawLabel(this, key->label, frame, updateRect, + fBaseColor, flags, BAlignment(B_ALIGN_HORIZONTAL_CENTER, + B_ALIGN_VERTICAL_CENTER)); + key++; } } + return; + } + + // TODO: support pressed keys + + // paint keypad b/g + SetHighColor(fBaseColor); + FillRect(updateRect & keypadRect); + + // render key main grid + BeginLineArray(((fColums + fRows) << 1) + 1); + + // render cols + AddLine(BPoint(0.0, sizeDisp), + BPoint(0.0, fHeight), + fLightColor); + for (int col = 1; col < fColums; col++) { + AddLine(BPoint(col * sizeCol - 1.0, sizeDisp), + BPoint(col * sizeCol - 1.0, fHeight), + fDarkColor); + AddLine(BPoint(col * sizeCol, sizeDisp), + BPoint(col * sizeCol, fHeight), + fLightColor); + } + AddLine(BPoint(fColums * sizeCol, sizeDisp), + BPoint(fColums * sizeCol, fHeight), + fDarkColor); + + // render rows + for (int row = 0; row < fRows; row++) { + AddLine(BPoint(0.0, sizeDisp + row * sizeRow - 1.0), + BPoint(fWidth, sizeDisp + row * sizeRow - 1.0), + fDarkColor); + AddLine(BPoint(0.0, sizeDisp + row * sizeRow), + BPoint(fWidth, sizeDisp + row * sizeRow), + fLightColor); + } + AddLine(BPoint(0.0, sizeDisp + fRows * sizeRow), + BPoint(fWidth, sizeDisp + fRows * sizeRow), + fDarkColor); + + // main grid complete + EndLineArray(); + + // render key symbols + float halfSizeCol = sizeCol * 0.5f; + SetHighColor(fButtonTextColor); + SetLowColor(fBaseColor); + SetDrawingMode(B_OP_COPY); + + float baselineOffset = ((fHeight - sizeDisp) / (float)fRows) + * (1.0 - kFontScaleY) * 0.5; + CalcKey *key = fKeypad; + for (int row = 0; row < fRows; row++) { + for (int col = 0; col < fColums; col++) { + float halfSymbolWidth = StringWidth(key->label) * 0.5f; + DrawString(key->label, + BPoint(col * sizeCol + halfSizeCol - halfSymbolWidth, + sizeDisp + (row + 1) * sizeRow - baselineOffset)); + key++; + } } } @@ -421,11 +514,20 @@ CalcView::MouseDown(BPoint point) return; } - if (!fShowKeypad) + if (!fShowKeypad) { + if (fCalcIcon != NULL) { + BRect bounds(Bounds()); + bounds.left = bounds.right - fCalcIcon->Bounds().Width(); + if (bounds.Contains(point)) { + // user clicked on calculator icon + fExpressionTextView->ApplyChanges(); + } + } return; + } // calculate grid sizes - float sizeDisp = fHeight * K_DISPLAY_YPROP; + float sizeDisp = fHeight * kDisplayScaleY; float sizeCol = fWidth / (float)fColums; float sizeRow = (fHeight - sizeDisp) / (float)fRows; @@ -438,7 +540,25 @@ CalcView::MouseDown(BPoint point) (gridRow >= 0) && (gridRow < fRows)) { // process key press - _PressKey(gridRow * fColums + gridCol); + int key = gridRow * fColums + gridCol; + _FlashKey(key, FLAGS_MOUSE_DOWN); + _PressKey(key); + + // make sure we receive the mouse up! + SetMouseEventMask(B_POINTER_EVENTS, B_LOCK_WINDOW_FOCUS); + } +} + + +void +CalcView::MouseUp(BPoint point) +{ + int keys = fRows * fColums; + for (int i = 0; i < keys; i++) { + if (fKeypad[i].flags & FLAGS_MOUSE_DOWN) { + _FlashKey(i, 0); + break; + } } } @@ -522,7 +642,10 @@ CalcView::FrameResized(float width, float height) // layout expression text view BRect frame = _ExpressionRect(); - frame.InsetBy(2, 2); + if (fShowKeypad) + frame.InsetBy(4, 4); + else + frame.InsetBy(2, 2); if (!fShowKeypad) frame.right -= ceilf(fCalcIcon->Bounds().Width() * 1.5); @@ -531,17 +654,15 @@ CalcView::FrameResized(float width, float height) fExpressionTextView->ResizeTo(frame.Width(), frame.Height()); frame.OffsetTo(B_ORIGIN); - frame.InsetBy(2, 2); + float inset = (frame.Height() - fExpressionTextView->LineHeight(0)) / 2; + frame.InsetBy(inset, inset); fExpressionTextView->SetTextRect(frame); // configure expression text view font size and color - float sizeDisp = fShowKeypad ? fHeight * K_DISPLAY_YPROP : fHeight; + float sizeDisp = fShowKeypad ? fHeight * kDisplayScaleY : fHeight; BFont font(be_bold_font); - font.SetSize(sizeDisp * K_FONT_YPROP); -// fExpressionTextView->SetViewColor(fExpressionBGColor); -// fExpressionTextView->SetLowColor(fExpressionBGColor); -// fExpressionTextView->SetFontAndColor(&font, B_FONT_ALL, &fExpressionTextColor); -fExpressionTextView->SetFontAndColor(&font, B_FONT_ALL); + font.SetSize(sizeDisp * kExpressionFontScaleY); + fExpressionTextView->SetFontAndColor(&font, B_FONT_ALL); } @@ -630,7 +751,7 @@ CalcView::Paste(BMessage *message) BPoint dropPoint = ConvertFromScreen(message->DropPoint()); // calculate current keypad area - float sizeDisp = fHeight * K_DISPLAY_YPROP; + float sizeDisp = fHeight * kDisplayScaleY; BRect keypadRect(0.0, sizeDisp, fWidth, fHeight); // check location of color drop @@ -773,13 +894,7 @@ CalcView::Evaluate() return; } - // audio feedback - if (fOptions->audio_feedback) { - BEntry zimp("zimp.AIFF"); - entry_ref zimp_ref; - zimp.GetRef(&zimp_ref); - play_sound(&zimp_ref, true, false, false); - } + _AudioFeedback(false); // evaluate expression BString value; @@ -806,7 +921,7 @@ CalcView::FlashKey(const char* bytes, int32 numBytes) temp.Append(bytes, numBytes); int32 key = _KeyForLabel(temp.String()); if (key >= 0) - _FlashKey(key); + _FlashKey(key, FLAGS_FLASH_KEY); } @@ -837,11 +952,12 @@ CalcView::_ParseCalcDesc(const char* keypadDescription) strcpy(key->code, key->label); // set keymap - if (strlen(key->label) == 1) { + if (strlen(key->label) == 1) strcpy(key->keymap, key->label); - } else { + else *key->keymap = '\0'; - } // end if + + key->flags = 0; // add this to the expression text view, so that it // will forward the respective KeyDown event to us @@ -870,23 +986,14 @@ CalcView::_PressKey(int key) } else { // check for evaluation order if (fKeypad[key].code[0] == '\n') { - Evaluate(); + fExpressionTextView->ApplyChanges(); } else { // insert into expression text fExpressionTextView->Insert(fKeypad[key].code); - - // audio feedback - if (fOptions->audio_feedback) { - BEntry zimp("key.AIFF"); - entry_ref zimp_ref; - zimp.GetRef(&zimp_ref); - play_sound(&zimp_ref, true, false, true); - } } } - // redraw display -// _InvalidateExpression(); + _AudioFeedback(true); } @@ -913,9 +1020,36 @@ CalcView::_KeyForLabel(const char *label) const void -CalcView::_FlashKey(int32 key) +CalcView::_FlashKey(int32 key, uint32 flashFlags) { - // TODO ... + if (flashFlags != 0) + fKeypad[key].flags |= flashFlags; + else + fKeypad[key].flags = 0; + Invalidate(); + + if (fKeypad[key].flags == FLAGS_FLASH_KEY) { + BMessage message(MSG_UNFLASH_KEY); + message.AddInt32("key", key); + BMessageRunner::StartSending(BMessenger(this), &message, + kFlashOnOffInterval, 1); + } +} + + +void +CalcView::_AudioFeedback(bool inBackGround) +{ + // TODO: Use beep events... This interface is not implemented on Haiku + // anyways... +#if 0 + if (fOptions->audio_feedback) { + BEntry zimp("key.AIFF"); + entry_ref zimp_ref; + zimp.GetRef(&zimp_ref); + play_sound(&zimp_ref, true, false, inBackGround); + } +#endif } @@ -955,11 +1089,11 @@ CalcView::_CreatePopUpMenu() { // construct items fAutoNumlockItem = new BMenuItem("Enable Num Lock on start up", - new BMessage(K_OPTIONS_AUTO_NUM_LOCK)); + new BMessage(MSG_OPTIONS_AUTO_NUM_LOCK)); fAudioFeedbackItem = new BMenuItem("Audio Feedback", - new BMessage(K_OPTIONS_AUDIO_FEEDBACK)); + new BMessage(MSG_OPTIONS_AUDIO_FEEDBACK)); fShowKeypadItem = new BMenuItem("Show Keypad", - new BMessage(K_OPTIONS_SHOW_KEYPAD)); + new BMessage(MSG_OPTIONS_SHOW_KEYPAD)); fAboutItem = new BMenuItem("About DeskCalc", new BMessage(B_ABOUT_REQUESTED)); @@ -972,7 +1106,9 @@ CalcView::_CreatePopUpMenu() fPopUpMenu = new BPopUpMenu("pop-up", false, false); fPopUpMenu->AddItem(fAutoNumlockItem); - fPopUpMenu->AddItem(fAudioFeedbackItem); +// TODO: Enabled when we use beep events which can be configured in the Sounds +// preflet. +// fPopUpMenu->AddItem(fAudioFeedbackItem); fPopUpMenu->AddItem(fShowKeypadItem); fPopUpMenu->AddSeparatorItem(); fPopUpMenu->AddItem(fAboutItem); @@ -984,7 +1120,7 @@ CalcView::_ExpressionRect() const { BRect r(0.0, 0.0, fWidth, fHeight); if (fShowKeypad) { - r.bottom = floorf(fHeight * K_DISPLAY_YPROP); + r.bottom = floorf(fHeight * kDisplayScaleY) + 1; } return r; } @@ -997,7 +1133,7 @@ CalcView::_KeypadRect() const if (fShowKeypad) { r.right = fWidth; r.bottom = fHeight; - r.top = floorf(fHeight * K_DISPLAY_YPROP) + 1; + r.top = floorf(fHeight * kDisplayScaleY); } return r; } @@ -1011,16 +1147,17 @@ CalcView::_ShowKeypad(bool show) fShowKeypad = show; if (fShowKeypadItem && fShowKeypadItem->IsMarked() ^ fShowKeypad) - fShowKeypadItem->SetMarked(fShowKeypad); + fShowKeypadItem->SetMarked(fShowKeypad); - float height = fShowKeypad ? fHeight / K_DISPLAY_YPROP - : fHeight * K_DISPLAY_YPROP; + float height = fShowKeypad ? fHeight / kDisplayScaleY + : fHeight * kDisplayScaleY; BWindow* window = Window(); if (window) { if (window->Bounds() == Frame()) { + window->SetSizeLimits(100.0, 400.0, + fShowKeypad ? 100.0 : 20.0, fShowKeypad ? 400.0 : 60.0); window->ResizeTo(fWidth, height); - window->SetSizeLimits(100.0, 400.0, fShowKeypad ? 100.0 : 20.0, 400.0); } else ResizeTo(fWidth, height); } diff --git a/src/apps/deskcalc/CalcView.h b/src/apps/deskcalc/CalcView.h index 863ce3ddeb..b828d4507b 100644 --- a/src/apps/deskcalc/CalcView.h +++ b/src/apps/deskcalc/CalcView.h @@ -39,6 +39,7 @@ class CalcView : public BView { virtual void MessageReceived(BMessage* message); virtual void Draw(BRect updateRect); virtual void MouseDown(BPoint point); + virtual void MouseUp(BPoint point); virtual void KeyDown(const char* bytes, int32 numBytes); virtual void MakeFocus(bool focused = true); virtual void FrameResized(float width, float height); @@ -65,18 +66,15 @@ class CalcView : public BView { void FlashKey(const char* bytes, int32 numBytes); - void AddExpressionToHistory(const char* expression); - void PreviousExpression(); - void NextExpression(); - private: void _ParseCalcDesc(const char* keypadDescription); void _PressKey(int key); void _PressKey(const char* label); int32 _KeyForLabel(const char* label) const; - void _FlashKey(int32 key); - + void _FlashKey(int32 key, uint32 flashFlags); + void _AudioFeedback(bool inBackGround); + void _Colorize(); void _CreatePopUpMenu(); diff --git a/src/apps/deskcalc/DeskCalc.h b/src/apps/deskcalc/DeskCalc.h deleted file mode 100644 index 6d8afa746e..0000000000 --- a/src/apps/deskcalc/DeskCalc.h +++ /dev/null @@ -1,8 +0,0 @@ -/* -** /boot/home/projects/develop/ThirdParty/Haiku/src/apps/deskcalc/DeskCalc.h -** -** Automatically generated by BResourceParser on -** Tuesday, June 06, 2006 at 17:38:14. -** -*/ - diff --git a/src/apps/deskcalc/ExpressionTextView.cpp b/src/apps/deskcalc/ExpressionTextView.cpp index 5ecc7e0569..f37dd60f18 100644 --- a/src/apps/deskcalc/ExpressionTextView.cpp +++ b/src/apps/deskcalc/ExpressionTextView.cpp @@ -22,14 +22,15 @@ static const int32 kMaxPreviousExpressions = 20; ExpressionTextView::ExpressionTextView(BRect frame, CalcView* calcView) - : InputTextView(frame, "expression text view", - (frame.OffsetToCopy(B_ORIGIN)).InsetByCopy(2, 2), - B_FOLLOW_NONE, B_WILL_DRAW), - fCalcView(calcView), - fKeypadLabels(""), - fPreviousExpressions(20), - fHistoryPos(0), - fCurrentExpression("") + : + InputTextView(frame, "expression text view", + (frame.OffsetToCopy(B_ORIGIN)).InsetByCopy(2, 2), + B_FOLLOW_NONE, B_WILL_DRAW), + fCalcView(calcView), + fKeypadLabels(""), + fPreviousExpressions(20), + fHistoryPos(0), + fCurrentExpression("") { SetStylable(false); SetDoesUndo(true); @@ -75,12 +76,16 @@ ExpressionTextView::KeyDown(const char* bytes, int32 numBytes) BString current = Text(); // handle in InputTextView, except B_TAB - if (bytes[0] != B_TAB) + if (bytes[0] == '=') + ApplyChanges(); + else if (bytes[0] != B_TAB) InputTextView::KeyDown(bytes, numBytes); // pass on to CalcView if this was a label on a key if (fKeypadLabels.FindFirst(bytes[0]) >= 0) fCalcView->FlashKey(bytes, numBytes); + else if (bytes[0] == B_BACKSPACE) + fCalcView->FlashKey("BS", 2); // as soon as something is typed, we are at the // end of the expression history @@ -126,6 +131,7 @@ void ExpressionTextView::ApplyChanges() { AddExpressionToHistory(Text()); + fCalcView->FlashKey("=", 1); fCalcView->Evaluate(); } @@ -154,6 +160,8 @@ ExpressionTextView::BackSpace() { const char bytes[1] = { B_BACKSPACE }; KeyDown(bytes, 1); + + fCalcView->FlashKey("BS", 2); } @@ -161,6 +169,8 @@ void ExpressionTextView::Clear() { SetText(""); + + fCalcView->FlashKey("C", 1); } @@ -267,4 +277,3 @@ ExpressionTextView::SaveSettings(BMessage* archive) const return B_OK; } -