Files
M5PaperOS/src/epdgui/epdgui_keyboard.cpp
2020-11-12 16:52:21 +08:00

370 lines
14 KiB
C++

#include "epdgui_keyboard.h"
static const char* kKeyAlphaMapLowerCase[26] = {
"q", "w", "e", "r", "t", "y", "u", "i", "o", "p", //10
"a", "s", "d", "f", "g", "h", "j", "k", "l", //9
"z", "x", "c", "v", "b", "n", "m", //7
};
static const char* kKeyAlphaMapUpperCase[26] = {
"Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", //10
"A", "S", "D", "F", "G", "H", "J", "K", "L", //9
"Z", "X", "C", "V", "B", "N", "M", //7
};
static const char* kKeyAlphaMapNumber[26] = {
"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", //10
"-", "/", ":", ";", "(", ")", "$", "&", "@", //9
"_", "\"", ".", ",", "?", "!", "'", //7
};
static const char* kKeyAlphaMapSymbol[26] = {
"[", "]", "{", "}", "#", "%", "^", "*", "+", "=", //10
"_", "\\", "|", "~", "<", ">", "", "£", "¥", //9
"", "", "\u221A", "\u221E", "\u2103", "\u2109", "\u2116", //7
};
// static const char* kRomaSpell[] = {
// "あアぁァ"
// "ばバびビぶブべべぼボびゃビャびゅビュびょビョ"
// };
enum
{
kKeySpace = 26,
kKeyBackspace,
kKeyWrap,
kKeyCase,
kKeySwitch,
kKeyNumber
};
enum
{
kSWCase = 0,
kSWSwitch,
kSWNumber
};
enum
{
kLayoutLowerAlpha = 0,
kLayoutUpperAlpha,
kLayoutNumber,
kLayoutSymbol
};
EPDGUI_Keyboard::EPDGUI_Keyboard(int16_t dir, uint32_t style): EPDGUI_Base()
{
uint8_t language = GetLanguage();
if(dir) // Horizontal
{
const uint16_t kKeyWidth = 72;
const uint16_t kKeyHeight = 44;
const uint16_t kKeyInterval = 8;
const uint16_t kFirstLineY = 302;
const uint16_t kSecondLineY = 356;
const uint16_t kThirdLineY = 410;
const uint16_t k4thLineY = 464;
const uint16_t kBaseX = 84;
for(int i = 0; i < 10; i++)
{
_btn[i] = new EPDGUI_Button(kKeyAlphaMapLowerCase[i], kBaseX + (kKeyInterval + kKeyWidth) * i, kFirstLineY, kKeyWidth, kKeyHeight);
}
for(int i = 10; i < 19; i++)
{
_btn[i] = new EPDGUI_Button(kKeyAlphaMapLowerCase[i], kBaseX + 40 + (kKeyInterval + kKeyWidth) * (i - 10), kSecondLineY, kKeyWidth, kKeyHeight);
}
for(int i = 19; i < 26; i++)
{
_btn[i] = new EPDGUI_Button(kKeyAlphaMapLowerCase[i], kBaseX + 118 + (kKeyInterval + kKeyWidth) * (i - 19), kThirdLineY, kKeyWidth, kKeyHeight);
}
_btn[kKeyBackspace] = new EPDGUI_Button("", kBaseX + 792 - 96, kThirdLineY, 96, kKeyHeight);
_btn[kKeyBackspace]->CanvasNormal()->pushImage(_btn[kKeyBackspace]->getW() / 2 - 16, _btn[kKeyBackspace]->getH() / 2 - 16, 32, 32, ImageResource_backspace_32x32);
_btn[kKeyBackspace]->CanvasPressed()->fillCanvas(0);
_btn[kKeyBackspace]->CanvasPressed()->pushImage(_btn[kKeyBackspace]->getW() / 2 - 16, _btn[kKeyBackspace]->getH() / 2 - 16, 32, 32, ImageResource_backspace_32x32);
_btn[kKeyBackspace]->CanvasPressed()->ReverseColor();
if(language == LANGUAGE_JA)
{
_btn[kKeySpace] = new EPDGUI_Button("空白", kBaseX + 162, k4thLineY, 468, kKeyHeight);
if(style & STYLE_INPUTMODE_NORMALTEXT)
_btn[kKeyWrap] = new EPDGUI_Button("改行", kBaseX + 792 - 152, k4thLineY, 152, kKeyHeight);
else if(style & STYLE_INPUTMODE_NEEDCONFIRM)
_btn[kKeyWrap] = new EPDGUI_Button("確認", kBaseX + 792 - 152, k4thLineY, 152, kKeyHeight);
}
else if(language == LANGUAGE_ZH)
{
_btn[kKeySpace] = new EPDGUI_Button("空格", kBaseX + 162, k4thLineY, 468, kKeyHeight);
if(style & STYLE_INPUTMODE_NORMALTEXT)
_btn[kKeyWrap] = new EPDGUI_Button("换行", kBaseX + 792 - 152, k4thLineY, 152, kKeyHeight);
else if(style & STYLE_INPUTMODE_NEEDCONFIRM)
_btn[kKeyWrap] = new EPDGUI_Button("确认", kBaseX + 792 - 152, k4thLineY, 152, kKeyHeight);
}
else
{
_btn[kKeySpace] = new EPDGUI_Button("Space", kBaseX + 162, k4thLineY, 468, kKeyHeight);
if(style & STYLE_INPUTMODE_NORMALTEXT)
_btn[kKeyWrap] = new EPDGUI_Button("Wrap", kBaseX + 792 - 152, k4thLineY, 152, kKeyHeight);
else if(style & STYLE_INPUTMODE_NEEDCONFIRM)
_btn[kKeyWrap] = new EPDGUI_Button("Confirm", kBaseX + 792 - 152, k4thLineY, 152, kKeyHeight);
}
// function key
_sw[kSWCase] = new EPDGUI_Switch(2, kBaseX, kThirdLineY, 96, kKeyHeight);
_sw[kSWSwitch] = new EPDGUI_Switch(2, kBaseX, k4thLineY, 68, kKeyHeight);
_sw[kSWNumber] = new EPDGUI_Switch(2, kBaseX + 162 - kKeyInterval - 68, k4thLineY, 68, kKeyHeight);
}
else
{
const uint16_t kBaseX = 16;
const uint16_t kBaseY = 700;
const uint16_t kKeyWidth = 44;
const uint16_t kKeyHeight = 52;
const uint16_t kKeyInterval = 8;
const uint16_t kFirstLineY = kBaseY;
const uint16_t kSecondLineY = kBaseY + 64;
const uint16_t kThirdLineY = kSecondLineY + 64;
const uint16_t k4thLineY = kThirdLineY + 64;
for(int i = 0; i < 10; i++)
{
_btn[i] = new EPDGUI_Button(kKeyAlphaMapLowerCase[i], kBaseX + (kKeyInterval + kKeyWidth) * i, kFirstLineY, kKeyWidth, kKeyHeight);
}
for(int i = 10; i < 19; i++)
{
_btn[i] = new EPDGUI_Button(kKeyAlphaMapLowerCase[i], kBaseX + 28 + (kKeyInterval + kKeyWidth) * (i - 10), kSecondLineY, kKeyWidth, kKeyHeight);
}
for(int i = 19; i < 26; i++)
{
_btn[i] = new EPDGUI_Button(kKeyAlphaMapLowerCase[i], kBaseX + 80 + (kKeyInterval + kKeyWidth) * (i - 19), kThirdLineY, kKeyWidth, kKeyHeight);
}
_btn[kKeyBackspace] = new EPDGUI_Button("", kBaseX + 512 - 60, kThirdLineY, 60, kKeyHeight);
_btn[kKeyBackspace]->CanvasNormal()->pushImage(_btn[kKeyBackspace]->getW() / 2 - 16, _btn[kKeyBackspace]->getH() / 2 - 16, 32, 32, ImageResource_backspace_32x32);
_btn[kKeyBackspace]->CanvasPressed()->fillCanvas(0);
_btn[kKeyBackspace]->CanvasPressed()->pushImage(_btn[kKeyBackspace]->getW() / 2 - 16, _btn[kKeyBackspace]->getH() / 2 - 16, 32, 32, ImageResource_backspace_32x32);
_btn[kKeyBackspace]->CanvasPressed()->ReverseColor();
if(language == LANGUAGE_JA)
{
_btn[kKeySpace] = new EPDGUI_Button("空白", kBaseX + 132, k4thLineY, 244, kKeyHeight);
if(style & STYLE_INPUTMODE_NORMALTEXT)
_btn[kKeyWrap] = new EPDGUI_Button("改行", kBaseX + 512 - 128, k4thLineY, 128, kKeyHeight);
else if(style & STYLE_INPUTMODE_NEEDCONFIRM)
_btn[kKeyWrap] = new EPDGUI_Button("確認", kBaseX + 512 - 128, k4thLineY, 128, kKeyHeight);
}
else if(language == LANGUAGE_ZH)
{
_btn[kKeySpace] = new EPDGUI_Button("空格", kBaseX + 132, k4thLineY, 244, kKeyHeight);
if(style & STYLE_INPUTMODE_NORMALTEXT)
_btn[kKeyWrap] = new EPDGUI_Button("换行", kBaseX + 512 - 128, k4thLineY, 128, kKeyHeight);
else if(style & STYLE_INPUTMODE_NEEDCONFIRM)
_btn[kKeyWrap] = new EPDGUI_Button("确认", kBaseX + 512 - 128, k4thLineY, 128, kKeyHeight);
}
else
{
_btn[kKeySpace] = new EPDGUI_Button("Space", kBaseX + 132, k4thLineY, 244, kKeyHeight);
if(style & STYLE_INPUTMODE_NORMALTEXT)
_btn[kKeyWrap] = new EPDGUI_Button("Wrap", kBaseX + 512 - 128, k4thLineY, 128, kKeyHeight);
else if(style & STYLE_INPUTMODE_NEEDCONFIRM)
_btn[kKeyWrap] = new EPDGUI_Button("Confirm", kBaseX + 512 - 128, k4thLineY, 128, kKeyHeight);
}
// function key
_sw[kSWCase] = new EPDGUI_Switch(2, kBaseX, kThirdLineY, 60, kKeyHeight);
_sw[kSWSwitch] = new EPDGUI_Switch(2, kBaseX, k4thLineY, 56, kKeyHeight);
_sw[kSWNumber] = new EPDGUI_Switch(2, kBaseX + 56 + kKeyInterval, k4thLineY, 60, kKeyHeight);
}
_sw[kSWCase]->Canvas(0)->pushImage(_sw[kSWCase]->getW() / 2 - 16, _sw[kSWCase]->getH() / 2 - 16, 32, 32, ImageResource_upper_32x32);
_sw[kSWCase]->Canvas(1)->pushImage(_sw[kSWCase]->getW() / 2 - 16, _sw[kSWCase]->getH() / 2 - 16, 32, 32, ImageResource_upper_32x32);
_sw[kSWCase]->Canvas(1)->ReverseColor();
_sw[kSWSwitch]->SetLabel(0, ""); //TODO: Support for kana input
_sw[kSWSwitch]->SetLabel(1, "Aa");
_sw[kSWNumber]->SetLabel(0, "123");
_sw[kSWNumber]->SetLabel(1, "Abc");
for(int i = 0; i < 29; i++)
{
_key[i] = _btn[i];
}
_key[kKeyCase] = _sw[kSWCase];
_key[kKeySwitch] = _sw[kSWSwitch];
_key[kKeyNumber] = _sw[kSWNumber];
// _sw[kSWSwitch]->SetHide(true);
_layout = kLayoutLowerAlpha;
}
EPDGUI_Keyboard::~EPDGUI_Keyboard()
{
for(int i = 0; i < 29; i++)
{
delete _btn[i];
}
for(int i = 0; i < 3; i++)
{
delete _sw[i];
}
}
void EPDGUI_Keyboard::Draw(m5epd_update_mode_t mode)
{
if(_ishide)
{
return;
}
for(int i = 0; i < 32; i++)
{
_key[i]->Draw(mode);
}
}
void EPDGUI_Keyboard::Draw(M5EPD_Canvas* canvas)
{
if(_ishide)
{
return;
}
for(int i = 0; i < 32; i++)
{
_key[i]->Draw(canvas);
}
}
void EPDGUI_Keyboard::Bind(int16_t state, void (* func_cb)(epdgui_args_vector_t&))
{
}
void EPDGUI_Keyboard::UpdateState(int16_t x, int16_t y)
{
if(!_isenable)
{
return;
}
// log_d("UpdateState %d, %d", x, y);
for(int i = 0; i < 32; i++)
{
bool keypressed = _key[i]->isInBox(x, y);
_key[i]->UpdateState(x, y);
if(keypressed)
{
if(i < 26)
{
switch(_layout)
{
case kLayoutLowerAlpha: _data += kKeyAlphaMapLowerCase[i]; break;
case kLayoutUpperAlpha: _data += kKeyAlphaMapUpperCase[i]; break;
case kLayoutNumber: _data += kKeyAlphaMapNumber[i]; break;
case kLayoutSymbol: _data += kKeyAlphaMapSymbol[i]; break;
}
}
switch(i)
{
case kKeyBackspace: _data += "\u0008"; break;
case kKeySpace: _data += " "; break;
case kKeyWrap: _data += "\n"; break;
case kKeyCase:
{
if(_layout == kLayoutNumber || _layout == kLayoutSymbol)
{
if(_sw[kSWCase]->getState() == 1)
{
for(int j = 0; j < 26; j++)
{
_btn[j]->setLabel(kKeyAlphaMapNumber[j]);
_layout = kLayoutNumber;
}
}
else
{
for(int j = 0; j < 26; j++)
{
_btn[j]->setLabel(kKeyAlphaMapSymbol[j]);
_layout = kLayoutSymbol;
}
}
_sw[kSWCase]->UpdateState(-1, -1);
Draw(UPDATE_MODE_NONE);
M5.EPD.UpdateFull(UPDATE_MODE_GL16);
}
else
{
if(_sw[kSWCase]->getState() == 1)
{
for(int j = 0; j < 26; j++)
{
_btn[j]->setLabel(kKeyAlphaMapLowerCase[j]);
_layout = kLayoutLowerAlpha;
}
}
else
{
for(int j = 0; j < 26; j++)
{
_btn[j]->setLabel(kKeyAlphaMapUpperCase[j]);
_layout = kLayoutUpperAlpha;
}
}
_sw[kSWCase]->UpdateState(-1, -1);
Draw(UPDATE_MODE_NONE);
M5.EPD.UpdateFull(UPDATE_MODE_GL16);
}
break;
}
case kKeyNumber:
{
if(_sw[kSWNumber]->getState() == 1)
{
_sw[kSWCase]->setState(0);
_sw[kSWCase]->Canvas(0)->fillCanvas(0);
_sw[kSWCase]->Canvas(1)->fillCanvas(0);
_sw[kSWCase]->Canvas(0)->drawRect(0, 0, _sw[kSWCase]->getW(), _sw[kSWCase]->getH(), 15);
_sw[kSWCase]->Canvas(1)->drawRect(0, 0, _sw[kSWCase]->getW(), _sw[kSWCase]->getH(), 15);
_sw[kSWCase]->Canvas(0)->pushImage(_sw[kSWCase]->getW() / 2 - 16, _sw[kSWCase]->getH() / 2 - 16, 32, 32, ImageResource_upper_32x32);
_sw[kSWCase]->Canvas(1)->pushImage(_sw[kSWCase]->getW() / 2 - 16, _sw[kSWCase]->getH() / 2 - 16, 32, 32, ImageResource_upper_32x32);
_sw[kSWCase]->Canvas(1)->ReverseColor();
for(int j = 0; j < 26; j++)
{
_btn[j]->setLabel(kKeyAlphaMapLowerCase[j]);
_layout = kLayoutLowerAlpha;
}
}
else
{
_sw[kSWCase]->setState(0);
_sw[kSWCase]->SetLabel(0, "#+-");
_sw[kSWCase]->SetLabel(1, "123");
for(int j = 0; j < 26; j++)
{
_btn[j]->setLabel(kKeyAlphaMapNumber[j]);
_layout = kLayoutNumber;
}
}
_sw[kSWNumber]->UpdateState(-1, -1);
Draw(UPDATE_MODE_NONE);
M5.EPD.UpdateFull(UPDATE_MODE_GL16);
break;
}
}
}
}
}
String EPDGUI_Keyboard::getData(void)
{
String data = _data;
_data = "";
return data;
}