Initial commit
This commit is contained in:
370
src/epdgui/epdgui_keyboard.cpp
Normal file
370
src/epdgui/epdgui_keyboard.cpp
Normal file
@@ -0,0 +1,370 @@
|
||||
#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;
|
||||
}
|
||||
Reference in New Issue
Block a user