Improved keyboard

This commit is contained in:
2021-03-20 18:00:42 +01:00
parent 780d1c6a6c
commit d0345b6249
9 changed files with 86 additions and 139 deletions

View File

@@ -24,24 +24,16 @@ static const char* kKeyAlphaMapSymbol[26] = {
"", "", "\u221A", "\u221E", "\u2103", "\u2109", "\u2116", //7 "", "", "\u221A", "\u221E", "\u2103", "\u2109", "\u2116", //7
}; };
// static const char* kRomaSpell[] = {
// "あアぁァ"
// "ばバびビぶブべべぼボびゃビャびゅビュびょビョ"
// };
enum { enum {
kKeySpace = 26, kKeySpace = 26,
kKeyBackspace, kKeyBackspace,
kKeyWrap, kKeyWrap,
kKeyCase, kKeyCase,
kKeySwitch,
kKeyNumber kKeyNumber
}; };
enum { enum {
kSWCase = 0, kSWCase = 0,
kSWSwitch,
kSWNumber kSWNumber
}; };
@@ -52,44 +44,7 @@ enum {
kLayoutSymbol kLayoutSymbol
}; };
EPDGUI_Keyboard::EPDGUI_Keyboard(int16_t dir, uint32_t style): EPDGUI_Base() { EPDGUI_Keyboard::EPDGUI_Keyboard(uint32_t style): EPDGUI_Base() {
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();
_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 kBaseX = 16;
const uint16_t kBaseY = 700; const uint16_t kBaseY = 700;
const uint16_t kKeyWidth = 44; const uint16_t kKeyWidth = 44;
@@ -124,15 +79,11 @@ EPDGUI_Keyboard::EPDGUI_Keyboard(int16_t dir, uint32_t style): EPDGUI_Base() {
// function key // function key
_sw[kSWCase] = new EPDGUI_Switch(2, kBaseX, kThirdLineY, 60, kKeyHeight); _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, k4thLineY, 124, 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(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)->pushImage(_sw[kSWCase]->getW() / 2 - 16, _sw[kSWCase]->getH() / 2 - 16, 32, 32, ImageResource_upper_32x32);
_sw[kSWCase]->Canvas(1)->ReverseColor(); _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(0, "123");
_sw[kSWNumber]->SetLabel(1, "Abc"); _sw[kSWNumber]->SetLabel(1, "Abc");
@@ -140,11 +91,8 @@ EPDGUI_Keyboard::EPDGUI_Keyboard(int16_t dir, uint32_t style): EPDGUI_Base() {
_key[i] = _btn[i]; _key[i] = _btn[i];
} }
_key[kKeyCase] = _sw[kSWCase]; _key[kKeyCase] = _sw[kSWCase];
_key[kKeySwitch] = _sw[kSWSwitch];
_key[kKeyNumber] = _sw[kSWNumber]; _key[kKeyNumber] = _sw[kSWNumber];
// _sw[kSWSwitch]->SetHide(true);
_layout = kLayoutLowerAlpha; _layout = kLayoutLowerAlpha;
} }
@@ -152,7 +100,7 @@ EPDGUI_Keyboard::~EPDGUI_Keyboard() {
for(int i = 0; i < 29; i++) { for(int i = 0; i < 29; i++) {
delete _btn[i]; delete _btn[i];
} }
for(int i = 0; i < 3; i++) { for(int i = 0; i < 2; i++) {
delete _sw[i]; delete _sw[i];
} }
} }
@@ -162,7 +110,7 @@ void EPDGUI_Keyboard::Draw(m5epd_update_mode_t mode) {
return; return;
} }
for(int i = 0; i < 32; i++) { for(int i = 0; i < 31; i++) {
_key[i]->Draw(mode); _key[i]->Draw(mode);
} }
} }
@@ -172,7 +120,7 @@ void EPDGUI_Keyboard::Draw(M5EPD_Canvas* canvas) {
return; return;
} }
for(int i = 0; i < 32; i++) { for(int i = 0; i < 31; i++) {
_key[i]->Draw(canvas); _key[i]->Draw(canvas);
} }
} }
@@ -186,23 +134,37 @@ void EPDGUI_Keyboard::UpdateState(int16_t x, int16_t y) {
return; return;
} }
// log_d("UpdateState %d, %d", x, y); // log_d("UpdateState %d, %d", x, y);
for(int i = 0; i < 32; i++) { for(int i = 0; i < 31; i++) {
bool keypressed = _key[i]->isInBox(x, y); bool keypressed = _key[i]->isInBox(x, y);
_key[i]->UpdateState(x, y); _key[i]->UpdateState(x, y);
if(keypressed) { if(keypressed) {
if(i < 26) { if(i < 26) {
switch(_layout) { switch(_layout) {
case kLayoutLowerAlpha: _data += kKeyAlphaMapLowerCase[i]; break; case kLayoutLowerAlpha:
case kLayoutUpperAlpha: _data += kKeyAlphaMapUpperCase[i]; break; _data += kKeyAlphaMapLowerCase[i];
case kLayoutNumber: _data += kKeyAlphaMapNumber[i]; break; break;
case kLayoutSymbol: _data += kKeyAlphaMapSymbol[i]; break; case kLayoutUpperAlpha:
_data += kKeyAlphaMapUpperCase[i];
break;
case kLayoutNumber:
_data += kKeyAlphaMapNumber[i];
break;
case kLayoutSymbol:
_data += kKeyAlphaMapSymbol[i];
break;
} }
} }
switch(i) { switch(i) {
case kKeyBackspace: _data += "\u0008"; break; case kKeyBackspace:
case kKeySpace: _data += " "; break; _data += "\u0008";
case kKeyWrap: _data += "\n"; break; break;
case kKeyCase: { case kKeySpace:
_data += " ";
break;
case kKeyWrap:
_data += "\n";
break;
case kKeyCase:
if(_layout == kLayoutNumber || _layout == kLayoutSymbol) { if(_layout == kLayoutNumber || _layout == kLayoutSymbol) {
if(_sw[kSWCase]->getState() == 1) { if(_sw[kSWCase]->getState() == 1) {
for(int j = 0; j < 26; j++) { for(int j = 0; j < 26; j++) {
@@ -235,8 +197,7 @@ void EPDGUI_Keyboard::UpdateState(int16_t x, int16_t y) {
M5.EPD.UpdateFull(UPDATE_MODE_GL16); M5.EPD.UpdateFull(UPDATE_MODE_GL16);
} }
break; break;
} case kKeyNumber:
case kKeyNumber: {
if(_sw[kSWNumber]->getState() == 1) { if(_sw[kSWNumber]->getState() == 1) {
_sw[kSWCase]->setState(0); _sw[kSWCase]->setState(0);
_sw[kSWCase]->Canvas(0)->fillCanvas(0); _sw[kSWCase]->Canvas(0)->fillCanvas(0);
@@ -269,7 +230,6 @@ void EPDGUI_Keyboard::UpdateState(int16_t x, int16_t y) {
} }
} }
} }
}
String EPDGUI_Keyboard::getData(void) { String EPDGUI_Keyboard::getData(void) {
String data = _data; String data = _data;

View File

@@ -11,7 +11,7 @@ public:
static const uint32_t STYLE_DEFAULT = STYLE_INPUTMODE_NORMALTEXT; static const uint32_t STYLE_DEFAULT = STYLE_INPUTMODE_NORMALTEXT;
public: public:
EPDGUI_Keyboard(int16_t dir = 1, uint32_t style = STYLE_DEFAULT); EPDGUI_Keyboard(uint32_t style = STYLE_DEFAULT);
~EPDGUI_Keyboard(); ~EPDGUI_Keyboard();
void Draw(m5epd_update_mode_t mode = UPDATE_MODE_DU4); void Draw(m5epd_update_mode_t mode = UPDATE_MODE_DU4);
void Draw(M5EPD_Canvas* canvas); void Draw(M5EPD_Canvas* canvas);
@@ -21,8 +21,8 @@ public:
private: private:
EPDGUI_Button *_btn[29]; EPDGUI_Button *_btn[29];
EPDGUI_Switch *_sw[3]; EPDGUI_Switch *_sw[2];
EPDGUI_Base *_key[32]; EPDGUI_Base *_key[31];
String _data; String _data;
uint8_t _layout = 0; uint8_t _layout = 0;

View File

@@ -39,26 +39,18 @@ void key_textsize_reset_cb(epdgui_args_vector_t &args) {
((EPDGUI_Textbox*)(args[0]))->SetTextSize(textsize); ((EPDGUI_Textbox*)(args[0]))->SetTextSize(textsize);
} }
Frame_Keyboard::Frame_Keyboard(bool isHorizontal) : Frame_Base() { Frame_Keyboard::Frame_Keyboard() : Frame_Base() {
_frame_name = "Frame_Keyboard"; _frame_name = "Frame_Keyboard";
if(isHorizontal) {
inputbox = new EPDGUI_Textbox(84, 25, 712, 250);
key_textclear = new EPDGUI_Button("CLR", 804, 25, 72, 120);
key_textsize_plus = new EPDGUI_Button("+", 804, 157, 72, 40);
key_textsize_reset = new EPDGUI_Button("26", 804, 196, 72, 40);
key_textsize_minus = new EPDGUI_Button("-", 804, 235, 72, 40);
} else {
const uint16_t kKeyBaseY = 628; const uint16_t kKeyBaseY = 628;
inputbox = new EPDGUI_Textbox(4, 100, 532, 512); inputbox = new EPDGUI_Textbox(4, 100, 532, 512);
key_textclear = new EPDGUI_Button("CLR", 4, kKeyBaseY, 260, 52); key_textclear = new EPDGUI_Button("CLR", 4, kKeyBaseY, 260, 52);
key_textsize_plus = new EPDGUI_Button("+", 448, kKeyBaseY, 88, 52); key_textsize_plus = new EPDGUI_Button("+", 448, kKeyBaseY, 88, 52);
key_textsize_reset = new EPDGUI_Button("26", 360, kKeyBaseY, 88, 52); key_textsize_reset = new EPDGUI_Button("26", 360, kKeyBaseY, 88, 52);
key_textsize_minus = new EPDGUI_Button("-", 272, kKeyBaseY, 88, 52); key_textsize_minus = new EPDGUI_Button("-", 272, kKeyBaseY, 88, 52);
}
inputbox->SetState(EPDGUI_Textbox::EVENT_PRESSED); inputbox->SetState(EPDGUI_Textbox::EVENT_PRESSED);
keyboard = new EPDGUI_Keyboard(isHorizontal); keyboard = new EPDGUI_Keyboard();
key_textclear->AddArgs(EPDGUI_Button::EVENT_RELEASED, 0, (void*)inputbox); key_textclear->AddArgs(EPDGUI_Button::EVENT_RELEASED, 0, (void*)inputbox);
key_textclear->Bind(EPDGUI_Button::EVENT_RELEASED, key_textclear_cb); key_textclear->Bind(EPDGUI_Button::EVENT_RELEASED, key_textclear_cb);

View File

@@ -6,7 +6,7 @@
class Frame_Keyboard : public Frame_Base { class Frame_Keyboard : public Frame_Base {
public: public:
Frame_Keyboard(bool isHorizontal = false); Frame_Keyboard();
~Frame_Keyboard(); ~Frame_Keyboard();
int run(); int run();
int init(epdgui_args_vector_t &args); int init(epdgui_args_vector_t &args);

View File

@@ -35,7 +35,7 @@ void key_setting_cb(epdgui_args_vector_t &args) {
void key_keyboard_cb(epdgui_args_vector_t &args) { void key_keyboard_cb(epdgui_args_vector_t &args) {
Frame_Base *frame = EPDGUI_GetFrame("Frame_Keyboard"); Frame_Base *frame = EPDGUI_GetFrame("Frame_Keyboard");
if(frame == NULL) { if(frame == NULL) {
frame = new Frame_Keyboard(0); frame = new Frame_Keyboard();
EPDGUI_AddFrame("Frame_Keyboard", frame); EPDGUI_AddFrame("Frame_Keyboard", frame);
} }
EPDGUI_PushFrame(frame); EPDGUI_PushFrame(frame);

View File

@@ -6,21 +6,16 @@ void key_passwordclear_cb(epdgui_args_vector_t &args) {
} }
Frame_WifiPassword::Frame_WifiPassword(bool isHorizontal) : Frame_Base() { Frame_WifiPassword::Frame_WifiPassword() : Frame_Base() {
_frame_name = "Frame_WifiPassword"; _frame_name = "Frame_WifiPassword";
if(isHorizontal) {
inputbox = new EPDGUI_Textbox(84, 25, 712, 250);
key_textclear = new EPDGUI_Button("CLR", 804, 25, 72, 120);
} else {
const uint16_t kKeyBaseY = 176; const uint16_t kKeyBaseY = 176;
inputbox = new EPDGUI_Textbox(4, 100, 532, 60); inputbox = new EPDGUI_Textbox(4, 100, 532, 60);
key_textclear = new EPDGUI_Button("CLR", 4, kKeyBaseY, 260, 52); key_textclear = new EPDGUI_Button("CLR", 4, kKeyBaseY, 260, 52);
}
inputbox->SetTextMargin(8, 15, 8, 8); inputbox->SetTextMargin(8, 15, 8, 8);
inputbox->SetState(EPDGUI_Textbox::EVENT_PRESSED); inputbox->SetState(EPDGUI_Textbox::EVENT_PRESSED);
keyboard = new EPDGUI_Keyboard(isHorizontal, EPDGUI_Keyboard::STYLE_INPUTMODE_NEEDCONFIRM); keyboard = new EPDGUI_Keyboard(EPDGUI_Keyboard::STYLE_INPUTMODE_NEEDCONFIRM);
key_textclear->AddArgs(EPDGUI_Button::EVENT_RELEASED, 0, (void*)inputbox); key_textclear->AddArgs(EPDGUI_Button::EVENT_RELEASED, 0, (void*)inputbox);
key_textclear->Bind(EPDGUI_Button::EVENT_RELEASED, key_passwordclear_cb); key_textclear->Bind(EPDGUI_Button::EVENT_RELEASED, key_passwordclear_cb);

View File

@@ -6,7 +6,7 @@
class Frame_WifiPassword : public Frame_Base { class Frame_WifiPassword : public Frame_Base {
public: public:
Frame_WifiPassword(bool isHorizontal = false); Frame_WifiPassword();
~Frame_WifiPassword(); ~Frame_WifiPassword();
int run(); int run();
int init(epdgui_args_vector_t &args); int init(epdgui_args_vector_t &args);

View File

@@ -21,7 +21,7 @@ void key_wifi_cb(epdgui_args_vector_t &args) {
_connect_key = (EPDGUI_Button*)(args[0]); _connect_key = (EPDGUI_Button*)(args[0]);
Frame_Base *frame = EPDGUI_GetFrame("Frame_WifiPassword"); Frame_Base *frame = EPDGUI_GetFrame("Frame_WifiPassword");
if(frame == NULL) { if(frame == NULL) {
frame = new Frame_WifiPassword(false); frame = new Frame_WifiPassword();
EPDGUI_AddFrame("Frame_WifiPassword", frame); EPDGUI_AddFrame("Frame_WifiPassword", frame);
} }
EPDGUI_PushFrame(frame); EPDGUI_PushFrame(frame);

View File

@@ -98,7 +98,7 @@ void SysInit_Start(void) {
EPDGUI_AddFrame("Frame_Settings", frame_setting); EPDGUI_AddFrame("Frame_Settings", frame_setting);
Frame_Settings_Wallpaper *frame_wallpaper = new Frame_Settings_Wallpaper(); Frame_Settings_Wallpaper *frame_wallpaper = new Frame_Settings_Wallpaper();
EPDGUI_AddFrame("Frame_Settings_Wallpaper", frame_wallpaper); EPDGUI_AddFrame("Frame_Settings_Wallpaper", frame_wallpaper);
Frame_Keyboard *frame_keyboard = new Frame_Keyboard(0); Frame_Keyboard *frame_keyboard = new Frame_Keyboard();
EPDGUI_AddFrame("Frame_Keyboard", frame_keyboard); EPDGUI_AddFrame("Frame_Keyboard", frame_keyboard);
Frame_WifiScan *frame_wifiscan = new Frame_WifiScan(); Frame_WifiScan *frame_wifiscan = new Frame_WifiScan();
EPDGUI_AddFrame("Frame_WifiScan", frame_wifiscan); EPDGUI_AddFrame("Frame_WifiScan", frame_wifiscan);