181 lines
4.7 KiB
C++
181 lines
4.7 KiB
C++
//
|
|
// Copyright 2005 The Android Open Source Project
|
|
//
|
|
// Simulated device data.
|
|
//
|
|
|
|
// For compilers that support precompilation, include "wx/wx.h".
|
|
#include "wx/wxprec.h"
|
|
|
|
// Otherwise, include all standard headers
|
|
#ifndef WX_PRECOMP
|
|
# include "wx/wx.h"
|
|
#endif
|
|
#include "wx/image.h" // needed for Windows build
|
|
|
|
#include "LinuxKeys.h"
|
|
#include "PhoneButton.h"
|
|
|
|
using namespace android;
|
|
|
|
|
|
/*
|
|
* Create a PhoneButton without a backing image.
|
|
*/
|
|
bool PhoneButton::Create(const char* label)
|
|
{
|
|
assert(!mHasImage); // quick check for re-use
|
|
|
|
mKeyCode = LookupKeyCode(label);
|
|
if (mKeyCode == kKeyCodeUnknown) {
|
|
fprintf(stderr, "WARNING: key code '%s' not recognized\n", label);
|
|
// keep going
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/*
|
|
* Create a PhoneButton with an associated image. Don't load the image yet.
|
|
*/
|
|
bool PhoneButton::Create(const char* label, const char* imageFileName,
|
|
int x, int y)
|
|
{
|
|
if (!Create(label))
|
|
return false;
|
|
|
|
if (mSelectedImage.Create(imageFileName, x, y))
|
|
mHasImage = true;
|
|
else
|
|
fprintf(stderr, "Warning: image create (%s, %d, %d) failed\n",
|
|
imageFileName, x, y);
|
|
|
|
return true;
|
|
}
|
|
|
|
/*
|
|
* Load the image, if any.
|
|
*/
|
|
bool PhoneButton::LoadResources(void)
|
|
{
|
|
if (!mHasImage)
|
|
return true; // no image associated with this button
|
|
|
|
bool result = mSelectedImage.LoadResources();
|
|
if (result)
|
|
CreateHighlightedBitmap();
|
|
return result;
|
|
}
|
|
|
|
/*
|
|
* Unload the image if we loaded one.
|
|
*/
|
|
bool PhoneButton::UnloadResources(void)
|
|
{
|
|
if (!mHasImage)
|
|
return true;
|
|
|
|
return mSelectedImage.UnloadResources();
|
|
}
|
|
|
|
/* use an inline instead of macro so we don't evaluate args multiple times */
|
|
static inline int MinVal(int a, int b) { return (a < b ? a : b); }
|
|
|
|
/*
|
|
* Create the "highlighted" bitmap from the "selected" image.
|
|
*/
|
|
void PhoneButton::CreateHighlightedBitmap(void)
|
|
{
|
|
wxBitmap* src = mSelectedImage.GetBitmap();
|
|
assert(src != NULL);
|
|
wxImage tmpImage = src->ConvertToImage();
|
|
|
|
unsigned char* pRGB = tmpImage.GetData(); // top-left RGBRGB...
|
|
int x, y;
|
|
|
|
/*
|
|
* Modify the color used for the "highlight" image.
|
|
*/
|
|
for (y = tmpImage.GetHeight()-1; y >= 0; --y) {
|
|
for (x = tmpImage.GetWidth()-1; x >= 0; --x) {
|
|
*(pRGB) = MinVal(*(pRGB) + *(pRGB) / 8, 255);
|
|
*(pRGB+1) = MinVal(*(pRGB+1) + *(pRGB+1) / 8, 255);
|
|
*(pRGB+2) = *(pRGB+2) * 5 / 8;
|
|
|
|
pRGB += 3;
|
|
}
|
|
}
|
|
|
|
mHighlightedBitmap = wxBitmap(tmpImage);
|
|
}
|
|
|
|
/*
|
|
* Check to see if the button "collides" with the specified point.
|
|
*
|
|
* This is currently a simple rectangle check, but could be modified
|
|
* to take image transparency into account.
|
|
*/
|
|
bool PhoneButton::CheckCollision(int x, int y) const
|
|
{
|
|
if (!mHasImage)
|
|
return false;
|
|
|
|
return (x >= mSelectedImage.GetX() &&
|
|
x < mSelectedImage.GetX() + mSelectedImage.GetWidth() &&
|
|
y >= mSelectedImage.GetY() &&
|
|
y < mSelectedImage.GetY() + mSelectedImage.GetHeight());
|
|
}
|
|
|
|
/*
|
|
* Look up a key code based on a string.
|
|
*
|
|
* Returns kKeyCodeUnknown if the label doesn't match anything.
|
|
*/
|
|
KeyCode PhoneButton::LookupKeyCode(const char* label) const
|
|
{
|
|
static const struct {
|
|
const char* label;
|
|
int keyCode;
|
|
} codeList[] = {
|
|
{ "soft-left", KEY_MENU },
|
|
{ "soft-right", KEY_KBDILLUMUP },
|
|
{ "home", KEY_HOME },
|
|
{ "back", KEY_BACK },
|
|
{ "call", KEY_F3 },
|
|
{ "phone-dial", KEY_F3 },
|
|
{ "end-call", KEY_F4 },
|
|
{ "phone-hangup", KEY_F4 },
|
|
{ "0", KEY_0 },
|
|
{ "1", KEY_1 },
|
|
{ "2", KEY_2 },
|
|
{ "3", KEY_3 },
|
|
{ "4", KEY_4 },
|
|
{ "5", KEY_5 },
|
|
{ "6", KEY_6 },
|
|
{ "7", KEY_7 },
|
|
{ "8", KEY_8 },
|
|
{ "9", KEY_9 },
|
|
{ "star", KEY_SWITCHVIDEOMODE },
|
|
{ "pound", KEY_KBDILLUMTOGGLE },
|
|
{ "dpad-up", KEY_UP },
|
|
{ "dpad-down", KEY_DOWN },
|
|
{ "dpad-left", KEY_LEFT },
|
|
{ "dpad-right", KEY_RIGHT },
|
|
{ "dpad-center", KEY_REPLY },
|
|
{ "volume-up", KEY_VOLUMEUP },
|
|
{ "volume-down", KEY_VOLUMEDOWN },
|
|
{ "power", KEY_POWER },
|
|
{ "camera", KEY_CAMERA },
|
|
//{ "clear", kKeyCodeClear },
|
|
};
|
|
const int numCodes = sizeof(codeList) / sizeof(codeList[0]);
|
|
|
|
for (int i = 0; i < numCodes; i++) {
|
|
if (strcmp(label, codeList[i].label) == 0)
|
|
return (KeyCode) codeList[i].keyCode;
|
|
}
|
|
|
|
return kKeyCodeUnknown;
|
|
};
|
|
|