feat(ime_pinyin): add API to use 9-key numeric keypad (#3460)

Like the 9-key Pinyin input mode, it is customized to adapt to the small screen.

Co-authored-by: 100ask <team100ask@outlook.com>
This commit is contained in:
Yobe Zhou
2022-07-08 03:10:30 +08:00
committed by GitHub
parent d8ff7ebd96
commit 8f9c84420e
2 changed files with 23 additions and 12 deletions

View File

@@ -58,7 +58,7 @@ const lv_obj_class_t lv_ime_pinyin_class = {
#if LV_IME_PINYIN_USE_K9_MODE #if LV_IME_PINYIN_USE_K9_MODE
static char * lv_btnm_def_pinyin_k9_map[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 21] = {\ static char * lv_btnm_def_pinyin_k9_map[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 21] = {\
",\0", "1#\0", "abc \0", "def\0", LV_SYMBOL_BACKSPACE"\0", "\n\0", ",\0", "123\0", "abc \0", "def\0", LV_SYMBOL_BACKSPACE"\0", "\n\0",
".\0", "ghi\0", "jkl\0", "mno\0", LV_SYMBOL_KEYBOARD"\0", "\n\0", ".\0", "ghi\0", "jkl\0", "mno\0", LV_SYMBOL_KEYBOARD"\0", "\n\0",
"?\0", "pqrs\0", "tuv\0", "wxyz\0", LV_SYMBOL_NEW_LINE"\0", "\n\0", "?\0", "pqrs\0", "tuv\0", "wxyz\0", LV_SYMBOL_NEW_LINE"\0", "\n\0",
LV_SYMBOL_LEFT"\0", "\0" LV_SYMBOL_LEFT"\0", "\0"
@@ -647,12 +647,13 @@ static void lv_ime_pinyin_kb_event(lv_event_t * e)
const char * txt = lv_btnmatrix_get_btn_text(kb, lv_btnmatrix_get_selected_btn(kb)); const char * txt = lv_btnmatrix_get_btn_text(kb, lv_btnmatrix_get_selected_btn(kb));
if(txt == NULL) return; if(txt == NULL) return;
lv_obj_t * ta = lv_keyboard_get_textarea(pinyin_ime->kb);
#if LV_IME_PINYIN_USE_K9_MODE #if LV_IME_PINYIN_USE_K9_MODE
if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K9) { if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K9) {
lv_obj_t * ta = lv_keyboard_get_textarea(pinyin_ime->kb);
uint16_t tmp_btn_str_len = strlen(pinyin_ime->input_char); uint16_t tmp_btn_str_len = strlen(pinyin_ime->input_char);
if((btn_id >= 16) && (tmp_btn_str_len > 0) && (btn_id < (16 + LV_IME_PINYIN_K9_CAND_TEXT_NUM))) { if((btn_id >= 16) && (tmp_btn_str_len > 0) && (btn_id < (16 + LV_IME_PINYIN_K9_CAND_TEXT_NUM))) {
tmp_btn_str_len = strlen(pinyin_ime->input_char);
lv_memset_00(pinyin_ime->input_char, sizeof(pinyin_ime->input_char)); lv_memset_00(pinyin_ime->input_char, sizeof(pinyin_ime->input_char));
strcat(pinyin_ime->input_char, txt); strcat(pinyin_ime->input_char, txt);
pinyin_input_proc(obj); pinyin_input_proc(obj);
@@ -703,21 +704,32 @@ static void lv_ime_pinyin_kb_event(lv_event_t * e)
#endif #endif
} }
} }
else if((strcmp(txt, "ABC") == 0) || (strcmp(txt, "abc") == 0) || (strcmp(txt, "1#") == 0)) { else if((strcmp(txt, "ABC") == 0) || (strcmp(txt, "abc") == 0) || (strcmp(txt, "1#") == 0) ||
(strcmp(txt, LV_SYMBOL_OK) == 0)) {
pinyin_ime_clear_data(obj); pinyin_ime_clear_data(obj);
return; return;
} }
else if(strcmp(txt, "123") == 0) {
for(uint16_t i = 0; i < strlen(txt); i++)
lv_textarea_del_char(ta);
pinyin_ime_clear_data(obj);
lv_textarea_set_cursor_pos(ta, LV_TEXTAREA_CURSOR_LAST);
lv_ime_pinyin_set_mode(obj, LV_IME_PINYIN_MODE_K9_NUMBER);
lv_keyboard_set_mode(kb, LV_KEYBOARD_MODE_NUMBER);
lv_obj_add_flag(pinyin_ime->cand_panel, LV_OBJ_FLAG_HIDDEN);
}
else if(strcmp(txt, LV_SYMBOL_KEYBOARD) == 0) { else if(strcmp(txt, LV_SYMBOL_KEYBOARD) == 0) {
if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K26) { if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K26) {
lv_ime_pinyin_set_mode(obj, LV_IME_PINYIN_MODE_K9); lv_ime_pinyin_set_mode(obj, LV_IME_PINYIN_MODE_K9);
} }
else { else if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K9) {
lv_ime_pinyin_set_mode(obj, LV_IME_PINYIN_MODE_K26); lv_ime_pinyin_set_mode(obj, LV_IME_PINYIN_MODE_K26);
lv_keyboard_set_mode(pinyin_ime->kb, LV_KEYBOARD_MODE_TEXT_LOWER); lv_keyboard_set_mode(pinyin_ime->kb, LV_KEYBOARD_MODE_TEXT_LOWER);
} }
pinyin_ime_clear_data(obj); else if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K9_NUMBER) {
} lv_ime_pinyin_set_mode(obj, LV_IME_PINYIN_MODE_K9);
else if(strcmp(txt, LV_SYMBOL_OK) == 0) { }
pinyin_ime_clear_data(obj); pinyin_ime_clear_data(obj);
} }
else if((pinyin_ime->mode == LV_IME_PINYIN_MODE_K26) && ((txt[0] >= 'a' && txt[0] <= 'z') || (txt[0] >= 'A' && else if((pinyin_ime->mode == LV_IME_PINYIN_MODE_K26) && ((txt[0] >= 'a' && txt[0] <= 'z') || (txt[0] >= 'A' &&
@@ -940,7 +952,6 @@ static void pinyin_ime_clear_data(lv_obj_t * obj)
{ {
lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
#if LV_IME_PINYIN_USE_K9_MODE #if LV_IME_PINYIN_USE_K9_MODE
if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K9) { if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K9) {
pinyin_ime->k9_input_str_len = 0; pinyin_ime->k9_input_str_len = 0;

View File

@@ -28,6 +28,7 @@ extern "C" {
typedef enum { typedef enum {
LV_IME_PINYIN_MODE_K26, LV_IME_PINYIN_MODE_K26,
LV_IME_PINYIN_MODE_K9, LV_IME_PINYIN_MODE_K9,
LV_IME_PINYIN_MODE_K9_NUMBER,
} lv_ime_pinyin_mode_t; } lv_ime_pinyin_mode_t;
/*Data of pinyin_dict*/ /*Data of pinyin_dict*/
@@ -141,4 +142,3 @@ lv_pinyin_dict_t * lv_ime_pinyin_get_dict(lv_obj_t * obj);
#endif #endif
#endif /*LV_USE_IME_PINYIN*/ #endif /*LV_USE_IME_PINYIN*/