From 551d7ae7667eeb251689587df3f6ef24faa4dd70 Mon Sep 17 00:00:00 2001 From: "kkoenig1@optonline.com" Date: Wed, 26 Jan 2022 06:40:17 -0500 Subject: [PATCH] keyboard changes --- .../thirdparty/libopenui/src/basenumberedit.h | 4 +- .../libopenui/src/keyboard_base.cpp | 60 ++++ .../thirdparty/libopenui/src/keyboard_base.h | 42 +-- .../libopenui/src/keyboard_number.cpp | 86 +++--- .../libopenui/src/keyboard_number.h | 6 +- .../libopenui/src/keyboard_text.cpp | 269 +----------------- .../thirdparty/libopenui/src/keyboard_text.h | 10 +- .../thirdparty/libopenui/src/numberedit.cpp | 79 ++--- .../src/thirdparty/libopenui/src/numberedit.h | 2 - .../src/thirdparty/libopenui/src/textedit.cpp | 84 +----- radio/src/thirdparty/libopenui/src/textedit.h | 3 +- 11 files changed, 159 insertions(+), 486 deletions(-) diff --git a/radio/src/thirdparty/libopenui/src/basenumberedit.h b/radio/src/thirdparty/libopenui/src/basenumberedit.h index cefe8c081..525618634 100644 --- a/radio/src/thirdparty/libopenui/src/basenumberedit.h +++ b/radio/src/thirdparty/libopenui/src/basenumberedit.h @@ -25,8 +25,8 @@ class BaseNumberEdit: public FormField { public: BaseNumberEdit(Window * parent, const rect_t &rect, int vmin, int vmax, - std::function getValue, std::function setValue = nullptr, WindowFlags windowFlags = 0, LcdFlags textFlags = 0): - FormField(parent, rect, windowFlags, textFlags), + std::function getValue, std::function setValue = nullptr, WindowFlags windowFlags = 0, LcdFlags textFlags = 0, LvglWidgetFactory *factory = nullptr): + FormField(parent, rect, windowFlags, textFlags, factory), vmin(vmin), vmax(vmax), _getValue(std::move(getValue)), diff --git a/radio/src/thirdparty/libopenui/src/keyboard_base.cpp b/radio/src/thirdparty/libopenui/src/keyboard_base.cpp index 1295fec1c..a02e5897e 100644 --- a/radio/src/thirdparty/libopenui/src/keyboard_base.cpp +++ b/radio/src/thirdparty/libopenui/src/keyboard_base.cpp @@ -21,6 +21,66 @@ Keyboard * Keyboard::activeKeyboard = nullptr; lv_obj_t *Keyboard::keyboard = nullptr; +static void keyboard_event_cb(lv_event_t * e) +{ + auto code = lv_event_get_code(e); + Keyboard *kb = (Keyboard *) lv_event_get_user_data(e); + if (code == LV_EVENT_READY) { + pushEvent(EVT_VIRTUAL_KEY('\n')); + kb->hide(); + } +} + + +Keyboard::Keyboard(coord_t height) : + FormWindow(nullptr, {0, LCD_H - height, LCD_W, height}, OPAQUE) +{ + // set the background of the window and opacity to 100% + lv_obj_set_style_bg_color(lvobj, makeLvColor(COLOR_THEME_SECONDARY1), LV_PART_MAIN); + lv_obj_set_style_bg_opa(lvobj, LV_OPA_100, LV_PART_MAIN); + + if (keyboard == nullptr) { + keyboard = lv_keyboard_create(lv_scr_act()); + lv_obj_add_event_cb(keyboard, keyboard_event_cb, LV_EVENT_ALL, this); + + + lv_obj_set_size(keyboard, LCD_W, LCD_H * 2 / 5); + lv_obj_clear_flag(keyboard, LV_OBJ_FLAG_HIDDEN); + } +} + +void Keyboard::clearField() +{ + TRACE("CLEAR FIELD"); + if (keyboard != nullptr) { + lv_obj_add_flag(keyboard, LV_OBJ_FLAG_HIDDEN); + } + + detach(); + if (fields) { + fields->setHeight(oldHeight); + fields = nullptr; + } + if (fieldContainer) { + fieldContainer->setHeight(LCD_H - 0 - fieldContainer->top()); + fieldContainer = nullptr; + } + if (field) { + field->setEditMode(false); + field->changeEnd(); + field = nullptr; + } +} + +void Keyboard::hide() +{ + if (activeKeyboard) { + activeKeyboard->clearField(); + activeKeyboard = nullptr; + } +} + + coord_t calcScrollOffsetForField(FormField *newField, Window *topWindow) { // now we need to calculate the offset of the field in the fields scroll container diff --git a/radio/src/thirdparty/libopenui/src/keyboard_base.h b/radio/src/thirdparty/libopenui/src/keyboard_base.h index bb717ff36..d0c729254 100644 --- a/radio/src/thirdparty/libopenui/src/keyboard_base.h +++ b/radio/src/thirdparty/libopenui/src/keyboard_base.h @@ -25,45 +25,9 @@ class Keyboard: public FormWindow { public: - explicit Keyboard(coord_t height) : - FormWindow(nullptr, {0, LCD_H - height, LCD_W, height}, OPAQUE) - { - // set the background of the window and opacity to 100% - lv_obj_set_style_bg_color(lvobj, makeLvColor(COLOR_THEME_SECONDARY1), LV_PART_MAIN); - lv_obj_set_style_bg_opa(lvobj, LV_OPA_100, LV_PART_MAIN); - } - - void clearField() - { - TRACE("CLEAR FIELD"); - if (keyboard != nullptr) { - lv_obj_add_flag(keyboard, LV_OBJ_FLAG_HIDDEN); - } - - detach(); - if (fields) { - fields->setHeight(oldHeight); - fields = nullptr; - } - if (fieldContainer) { - fieldContainer->setHeight(LCD_H - 0 - fieldContainer->top()); - fieldContainer = nullptr; - } - if (field) { - field->setEditMode(false); - field->changeEnd(); - field = nullptr; - } - } - - static void hide() - { - if (activeKeyboard) { - activeKeyboard->clearField(); - activeKeyboard = nullptr; - } - } - + explicit Keyboard(coord_t height); + void clearField(); + static void hide(); protected: static Keyboard * activeKeyboard; diff --git a/radio/src/thirdparty/libopenui/src/keyboard_number.cpp b/radio/src/thirdparty/libopenui/src/keyboard_number.cpp index daf04c1f4..7308663b9 100644 --- a/radio/src/thirdparty/libopenui/src/keyboard_number.cpp +++ b/radio/src/thirdparty/libopenui/src/keyboard_number.cpp @@ -22,59 +22,58 @@ #include "libopenui_globals.h" constexpr coord_t KEYBOARD_HEIGHT = 90; - NumberKeyboard * NumberKeyboard::_instance = nullptr; NumberKeyboard::NumberKeyboard() : Keyboard(KEYBOARD_HEIGHT) { - new TextButton(this, {LCD_W / 2 - 115, 10, 50, 30}, "<<", - [=]() -> uint8_t { - pushEvent(EVT_VIRTUAL_KEY_BACKWARD); - return 0; - }, BUTTON_BACKGROUND | OPAQUE | NO_FOCUS); + // new TextButton(this, {LCD_W / 2 - 115, 10, 50, 30}, "<<", + // [=]() -> uint8_t { + // pushEvent(EVT_VIRTUAL_KEY_BACKWARD); + // return 0; + // }, BUTTON_BACKGROUND | OPAQUE | NO_FOCUS); - new TextButton(this, {LCD_W / 2 - 55, 10, 50, 30}, "-", - [=]() -> uint8_t { - pushEvent(EVT_VIRTUAL_KEY_MINUS); - return 0; - }, BUTTON_BACKGROUND | OPAQUE | NO_FOCUS); + // new TextButton(this, {LCD_W / 2 - 55, 10, 50, 30}, "-", + // [=]() -> uint8_t { + // pushEvent(EVT_VIRTUAL_KEY_MINUS); + // return 0; + // }, BUTTON_BACKGROUND | OPAQUE | NO_FOCUS); - new TextButton(this, {LCD_W / 2 + 5, 10, 50, 30}, "+", - [=]() -> uint8_t { - pushEvent(EVT_VIRTUAL_KEY_PLUS); - return 0; - }, BUTTON_BACKGROUND | OPAQUE | NO_FOCUS); + // new TextButton(this, {LCD_W / 2 + 5, 10, 50, 30}, "+", + // [=]() -> uint8_t { + // pushEvent(EVT_VIRTUAL_KEY_PLUS); + // return 0; + // }, BUTTON_BACKGROUND | OPAQUE | NO_FOCUS); - new TextButton(this, {LCD_W / 2 + 65, 10, 50, 30}, ">>", - [=]() -> uint8_t { - pushEvent(EVT_VIRTUAL_KEY_FORWARD); - return 0; - }, BUTTON_BACKGROUND | OPAQUE | NO_FOCUS); + // new TextButton(this, {LCD_W / 2 + 65, 10, 50, 30}, ">>", + // [=]() -> uint8_t { + // pushEvent(EVT_VIRTUAL_KEY_FORWARD); + // return 0; + // }, BUTTON_BACKGROUND | OPAQUE | NO_FOCUS); - new TextButton(this, {LCD_W / 2 - 115, 50, 50, 30}, "MIN", - [=]() -> uint8_t { - pushEvent(EVT_VIRTUAL_KEY_MIN); - return 0; - }, BUTTON_BACKGROUND | OPAQUE | NO_FOCUS); + // new TextButton(this, {LCD_W / 2 - 115, 50, 50, 30}, "MIN", + // [=]() -> uint8_t { + // pushEvent(EVT_VIRTUAL_KEY_MIN); + // return 0; + // }, BUTTON_BACKGROUND | OPAQUE | NO_FOCUS); - new TextButton(this, {LCD_W / 2 + 65, 50, 50, 30}, "MAX", - [=]() -> uint8_t { - pushEvent(EVT_VIRTUAL_KEY_MAX); - return 0; - }, BUTTON_BACKGROUND | OPAQUE | NO_FOCUS); + // new TextButton(this, {LCD_W / 2 + 65, 50, 50, 30}, "MAX", + // [=]() -> uint8_t { + // pushEvent(EVT_VIRTUAL_KEY_MAX); + // return 0; + // }, BUTTON_BACKGROUND | OPAQUE | NO_FOCUS); - new TextButton(this, { LCD_W/2 - 55, 50, 50, 30 }, "DEF", - [=]() -> uint8_t { - pushEvent(EVT_VIRTUAL_KEY_DEFAULT); - return 0; - }, BUTTON_BACKGROUND | OPAQUE | NO_FOCUS); + // new TextButton(this, { LCD_W/2 - 55, 50, 50, 30 }, "DEF", + // [=]() -> uint8_t { + // pushEvent(EVT_VIRTUAL_KEY_DEFAULT); + // return 0; + // }, BUTTON_BACKGROUND | OPAQUE | NO_FOCUS); - new TextButton(this, { LCD_W/2 + 5, 50, 50, 30 }, "+/-", - [=]() -> uint8_t { - pushEvent(EVT_VIRTUAL_KEY_SIGN); - return 0; - }, BUTTON_BACKGROUND | OPAQUE | NO_FOCUS); + // new TextButton(this, { LCD_W/2 + 5, 50, 50, 30 }, "+/-", + // [=]() -> uint8_t { + // pushEvent(EVT_VIRTUAL_KEY_SIGN); + // return 0; + // }, BUTTON_BACKGROUND | OPAQUE | NO_FOCUS); } NumberKeyboard::~NumberKeyboard() @@ -82,8 +81,3 @@ NumberKeyboard::~NumberKeyboard() _instance = nullptr; } -void NumberKeyboard::paint(BitmapBuffer * dc) -{ - lcdSetColor(RGB(0xE0, 0xE0, 0xE0)); - dc->clear(CUSTOM_COLOR); -} diff --git a/radio/src/thirdparty/libopenui/src/keyboard_number.h b/radio/src/thirdparty/libopenui/src/keyboard_number.h index 4f8fca93c..67794a1f0 100644 --- a/radio/src/thirdparty/libopenui/src/keyboard_number.h +++ b/radio/src/thirdparty/libopenui/src/keyboard_number.h @@ -38,11 +38,13 @@ class NumberKeyboard : public Keyboard { { if (!_instance) _instance = new NumberKeyboard(); + else + lv_obj_clear_flag(_instance->keyboard, LV_OBJ_FLAG_HIDDEN); + + lv_keyboard_set_mode(keyboard, LV_KEYBOARD_MODE_NUMBER); _instance->setField(field); } - void paint(BitmapBuffer * dc) override; - protected: static NumberKeyboard * _instance; }; diff --git a/radio/src/thirdparty/libopenui/src/keyboard_text.cpp b/radio/src/thirdparty/libopenui/src/keyboard_text.cpp index 75a8b52bc..109d0c4a1 100644 --- a/radio/src/thirdparty/libopenui/src/keyboard_text.cpp +++ b/radio/src/thirdparty/libopenui/src/keyboard_text.cpp @@ -23,283 +23,16 @@ #include "font.h" constexpr coord_t KEYBOARD_HEIGHT = LCD_H * 2 / 5; - TextKeyboard * TextKeyboard::_instance = nullptr; -// const uint8_t LBM_KEY_UPPERCASE[] = { -// #include "mask_key_uppercase.lbm" -// }; - -// const uint8_t LBM_KEY_LOWERCASE[] = { -// #include "mask_key_lowercase.lbm" -// }; - -// const uint8_t LBM_KEY_BACKSPACE[] = { -// #include "mask_key_backspace.lbm" -// }; - -// const uint8_t LBM_KEY_LETTERS[] = { -// #include "mask_key_letters.lbm" -// }; - -// const uint8_t LBM_KEY_NUMBERS[] = { -// #include "mask_key_numbers.lbm" -// }; - -// const uint8_t LBM_KEY_SPACEBAR[] = { -// #include "mask_key_spacebar.lbm" -// }; - -// const uint8_t * const LBM_SPECIAL_KEYS[] = { -// LBM_KEY_BACKSPACE, -// LBM_KEY_UPPERCASE, -// LBM_KEY_LOWERCASE, -// LBM_KEY_LETTERS, -// LBM_KEY_NUMBERS, -// }; - -// const char * const KEYBOARD_LOWERCASE[] = { -// "qwertyuiop", -// " asdfghjkl", -// KEYBOARD_SET_UPPERCASE "zxcvbnm" KEYBOARD_BACKSPACE, -// KEYBOARD_SET_NUMBERS KEYBOARD_SPACE KEYBOARD_ENTER -// }; - -// const char * const KEYBOARD_UPPERCASE[] = { -// "QWERTYUIOP", -// " ASDFGHJKL", -// KEYBOARD_SET_LOWERCASE "ZXCVBNM" KEYBOARD_BACKSPACE, -// KEYBOARD_SET_NUMBERS KEYBOARD_SPACE KEYBOARD_ENTER -// }; - -// const char * const KEYBOARD_NUMBERS[] = { -// "1234567890", -// "_-", -// " " KEYBOARD_BACKSPACE, -// KEYBOARD_SET_LETTERS KEYBOARD_SPACE KEYBOARD_ENTER -// }; - -// #define NUMBER_OF_KEYBOARD_LAYOUTS 4 -// const char * const * const KEYBOARD_LAYOUTS[NUMBER_OF_KEYBOARD_LAYOUTS] = { -// KEYBOARD_UPPERCASE, -// KEYBOARD_LOWERCASE, -// KEYBOARD_LOWERCASE, -// KEYBOARD_NUMBERS, -// }; - -TextKeyboard::TextKeyboard(): +TextKeyboard::TextKeyboard() : Keyboard(KEYBOARD_HEIGHT) - // layout(KEYBOARD_LOWERCASE) { - if (keyboard == nullptr) { - keyboard = lv_keyboard_create(lv_scr_act()); - lv_obj_set_size(keyboard, LCD_W, LCD_H * 2 / 5); - lv_obj_clear_flag(keyboard, LV_OBJ_FLAG_HIDDEN); - } } TextKeyboard::~TextKeyboard() { _instance = nullptr; - -} - -int TextKeyboard::getCharWidth(const char c) -{ - // if (int8_t(c) < 0) return KEYBOARD_BITMAP_WIDTH; - - // switch (c) - // { - // case ' ': return 15; - // case KEYBOARD_SPACE[0]: return KEYBOARD_SPACE_WIDTH; - // case KEYBOARD_ENTER[0]: return KEYBOARD_ENTER_WIDTH; - // default: return KEYBOARD_CHAR_WIDTH; - // } -} - - -int TextKeyboard::calculateMaxWidth() -{ - // int maxWidth = 0; - // for (uint8_t i = 0; i < NUMBER_OF_KEYBOARD_LAYOUTS; i++) { - // int lineWidth = 0; - // const char * c = layout[i]; - // while (*c) { - // lineWidth += getCharWidth(*c); - // maxWidth = max(lineWidth, maxWidth); - // c++; - // } - // } - - // return maxWidth; -} - -void TextKeyboard::paint(BitmapBuffer * dc) -{ - // lcdSetColor(RGB(0xE0, 0xE0, 0xE0)); - // dc->clear(CUSTOM_COLOR); - - // // center the keyboard - // coord_t start_x = (dc->width() - calculateMaxWidth()) / 2; - - // for (uint8_t i = 0; i < NUMBER_OF_KEYBOARD_LAYOUTS; i++) { - // coord_t y = KEYBOARD_OFFSET_Y + i * KEYBOARD_ROW_HEIGHT; - // coord_t x = start_x; - // const char * c = layout[i]; - - // while (*c) { - // if (*c == KEYBOARD_SPACE[0]) { - // // spacebar - // dc->drawBitmapPattern(x, y, LBM_KEY_SPACEBAR, COLOR_THEME_SECONDARY1); - // } - // else if (*c == KEYBOARD_ENTER[0]) { - // // enter - // dc->drawSolidFilledRect(x, y - 2, KEYBOARD_ENTER_WIDTH, 25, COLOR_THEME_DISABLED); - // dc->drawText(x + KEYBOARD_ENTER_WIDTH / 2, y + 2, "ENTER", CENTERED); - // } - // else if (int8_t(*c) < 0) { - // const uint8_t *pBitmap = LBM_SPECIAL_KEYS[uint8_t(*c - 128)]; - // uint8_t bitmapWidth = *pBitmap, bitmapHeight = *(pBitmap + 2); - // if (touched && *c == touch_key) { - // dc->drawSolidFilledRect(x - 2, y + 3, bitmapWidth + 4, bitmapHeight + 4, COLOR_THEME_SECONDARY2); - // } - - // dc->drawBitmapPattern(x, y + 5, pBitmap, COLOR_THEME_SECONDARY1); - // } - // else { - // if (touched && *c == touch_key) { - // dc->drawSolidFilledRect(x - KEYBOARD_CHAR_WIDTH / 2, y - ((KEYBOARD_ROW_HEIGHT - 16) / 2), KEYBOARD_CHAR_WIDTH, KEYBOARD_ROW_HEIGHT, COLOR_THEME_FOCUS); - // } - // dc->drawSizedText(x, y, c, 1, CENTERED); - // } - // x += getCharWidth(*c); - // c++; - // } - // } -} - -bool TextKeyboard::onTouchStart(coord_t x, coord_t y) -{ - // // remove the centering. If x < 0 then this is an invalid touch event - // x -= (this->width() - calculateMaxWidth()) / 2; - // if (x < 0) { - // if (touched) { - // touched = false; - // invalidate(); - // } - // return true; - // } - - // touched = false; - - // uint8_t row = max(0, y - 5) / KEYBOARD_ROW_HEIGHT; - // const char * key = layout[row]; - - // while(*key) { - // if (*key == KEYBOARD_SPACE[0] && x <= KEYBOARD_SPACE_WIDTH) { - // touch_key = KEYBOARD_SPACE[0]; - // touched = true; - // break; - // } - // else if (*key == KEYBOARD_ENTER[0] && x <= KEYBOARD_ENTER_WIDTH) { - // touch_key = KEYBOARD_ENTER[0]; - // touched = true; - // break; - // } - // else if (int8_t(*key) < 0 && x <= KEYBOARD_BITMAP_WIDTH) { - // if (uint8_t(*key) == 128) { - // touch_key = KEYBOARD_BACKSPACE[0]; - // touched = true; - // break; - // } else { - // touched = false; - // break; - // } - // } - // else if (*key != ' ' && (x >= -(KEYBOARD_CHAR_WIDTH / 2) && x <= KEYBOARD_CHAR_WIDTH / 2)) { - // touch_key = *key; - // touched = true; - // break; - // } - - // x -= getCharWidth(*key); - // key++; - - // if (touched) { - // invalidate(); - // break; - // } - // } - // return true; -} - -bool TextKeyboard::onTouchEnd(coord_t x, coord_t y) -{ - // // remove the centering width, if x < 0 then this is an invalid touch on a centered keyboard. - // x -= (this->width() - calculateMaxWidth()) / 2; - // if (x < 0) { - // touched = false; - // return true; - // } - - // onKeyPress(); - - // if (touched) - // invalidate(); - // touched = false; - - // uint8_t row = max(0, y - 5) / KEYBOARD_ROW_HEIGHT; - - // const char * key = layout[row]; - // while (*key) { - // if (*key == KEYBOARD_SPACE[0]) { - // if (x <= KEYBOARD_SPACE_WIDTH) { - // pushEvent(EVT_VIRTUAL_KEY(' ')); - // return true; - // } - // } - // else if (*key == KEYBOARD_ENTER[0]) { - // if (x <= KEYBOARD_ENTER_WIDTH) { - // pushEvent(EVT_VIRTUAL_KEY(KEYBOARD_ENTER[0])); - // // enter - // hide(); - // return true; - // } - // } - // else if (int8_t(*key) < 0) { - // if (x <= KEYBOARD_BITMAP_WIDTH) { - // uint8_t specialKey = *key; - // if (specialKey == 128) { - // // backspace - // pushEvent(EVT_VIRTUAL_KEY(KEYBOARD_BACKSPACE[0])); - // } - // else { - // layout = KEYBOARD_LAYOUTS[specialKey - 129]; - // invalidate(); - // } - // break; - // } - // } - // else { - // if (*key != ' ' && (x >= -(KEYBOARD_CHAR_WIDTH / 2) && x <= KEYBOARD_CHAR_WIDTH / 2)) { - // pushEvent(EVT_VIRTUAL_KEY(*key)); - // return true; - // } - // } - // x -= getCharWidth(*key); - // key++; - // } - - // return true; -} - -bool TextKeyboard::onTouchSlide(coord_t x, coord_t y, coord_t startX, coord_t startY, coord_t slideX, coord_t slideY) -{ - // if (touched) - // invalidate(); - - // touched = false; - // return false; } #if defined(HARDWARE_KEYS) diff --git a/radio/src/thirdparty/libopenui/src/keyboard_text.h b/radio/src/thirdparty/libopenui/src/keyboard_text.h index 462016fc5..11547f50d 100644 --- a/radio/src/thirdparty/libopenui/src/keyboard_text.h +++ b/radio/src/thirdparty/libopenui/src/keyboard_text.h @@ -55,17 +55,11 @@ class TextKeyboard : public Keyboard { _instance = new TextKeyboard(); else lv_obj_clear_flag(_instance->keyboard, LV_OBJ_FLAG_HIDDEN); + + lv_keyboard_set_mode(keyboard, LV_KEYBOARD_MODE_TEXT_LOWER); _instance->setField(field); } - void paint(BitmapBuffer * dc) override; - -#if defined(HARDWARE_TOUCH) - bool onTouchEnd(coord_t x, coord_t y) override; - bool onTouchStart(coord_t x, coord_t y) override; - bool onTouchSlide(coord_t x, coord_t y, coord_t startX, coord_t startY, coord_t slideX, coord_t slideY) override; -#endif - protected: #if defined(HARDWARE_KEYS) void onEvent(event_t event) override; diff --git a/radio/src/thirdparty/libopenui/src/numberedit.cpp b/radio/src/thirdparty/libopenui/src/numberedit.cpp index 70e6d6889..6c2a29a63 100644 --- a/radio/src/thirdparty/libopenui/src/numberedit.cpp +++ b/radio/src/thirdparty/libopenui/src/numberedit.cpp @@ -23,46 +23,57 @@ #include "keyboard_number.h" #endif + +static LvglWidgetFactory numberEditFactory = { lv_textarea_create, nullptr }; +static lv_style_t style_main; +static lv_style_t style_edit; + NumberEdit::NumberEdit(Window * parent, const rect_t & rect, int vmin, int vmax, std::function getValue, std::function setValue, WindowFlags windowFlags, LcdFlags textFlags): - BaseNumberEdit(parent, rect, vmin, vmax, std::move(getValue), std::move(setValue), windowFlags, textFlags) + BaseNumberEdit(parent, rect, vmin, vmax, std::move(getValue), std::move(setValue), windowFlags, textFlags, &numberEditFactory) { -} + // properties + lv_obj_set_scrollbar_mode(lvobj, LV_SCROLLBAR_MODE_OFF); + lv_textarea_set_password_mode(lvobj, false); + lv_textarea_set_one_line(lvobj, true); + lv_textarea_set_accepted_chars(lvobj, "0123456789"); -void NumberEdit::paint(BitmapBuffer * dc) -{ - FormField::paint(dc); + auto value = _getValue(); + auto strValue = std::to_string(value); + lv_textarea_set_text(lvobj, strValue.c_str()); - auto value = getValue(); + // LV_PART_MAIN + lv_style_init(&style_main); + lv_style_set_border_width(&style_main, 1); + lv_style_set_border_color(&style_main, makeLvColor(COLOR_THEME_SECONDARY2)); + lv_style_set_bg_color(&style_main, makeLvColor(COLOR_THEME_PRIMARY2)); + lv_style_set_bg_opa(&style_main, LV_OPA_COVER); + //lv_style_set_radius(&style_main, 0); + lv_style_set_text_font(&style_main, &lv_font_montserrat_12); + lv_style_set_text_color(&style_main, makeLvColor(COLOR_THEME_SECONDARY1)); + lv_obj_add_style(lvobj, &style_main, LV_PART_MAIN); - LcdFlags textColor; - if (editMode) - textColor = COLOR_THEME_PRIMARY2; - else if (hasFocus()) - textColor = COLOR_THEME_PRIMARY2; - // else if (enabled && (value != 0 || zeroText.empty())) - // textColor = COLOR_THEME_SECONDARY1; - else - textColor = COLOR_THEME_SECONDARY1; + // LV_STATE_FOCUSED + lv_obj_set_style_bg_color(lvobj, makeLvColor(COLOR_THEME_FOCUS), + LV_PART_MAIN | LV_STATE_FOCUSED); - if (displayFunction) { - displayFunction(dc, textColor, value); - } else if (value == 0 && !zeroText.empty()) { - dc->drawText(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, zeroText.c_str(), - textColor | textFlags); - if (textFlags & RIGHT) - dc->drawText(rect.w - FIELD_PADDING_LEFT, FIELD_PADDING_TOP, - zeroText.c_str(), textColor | textFlags); - else - dc->drawText(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, zeroText.c_str(), - textColor | textFlags); - } else { - if (textFlags & RIGHT) - dc->drawNumber(rect.w - FIELD_PADDING_LEFT, FIELD_PADDING_TOP, value, - textColor | textFlags, 0, prefix.c_str(), suffix.c_str()); - else - dc->drawNumber(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, value, - textColor | textFlags, 0, prefix.c_str(), suffix.c_str()); - } + lv_obj_set_style_text_color(lvobj, makeLvColor(COLOR_THEME_PRIMARY2), + LV_PART_MAIN | LV_STATE_FOCUSED); + + // Hide cursor + lv_obj_set_style_opa(lvobj, 0, LV_PART_CURSOR); + + // Show Cursor in "Edit" mode + lv_style_init(&style_edit); + lv_style_set_opa(&style_edit, LV_OPA_COVER); + lv_style_set_bg_opa(&style_edit, LV_OPA_COVER); + lv_style_set_pad_left(&style_edit, (lv_coord_t)-(FIELD_PADDING_LEFT+2)); + lv_style_set_pad_top(&style_edit, (lv_coord_t)-(FIELD_PADDING_TOP+2)); + lv_obj_add_style(lvobj, &style_edit, LV_PART_CURSOR | LV_STATE_EDITED); + + // Text padding + auto label = lv_textarea_get_label(lvobj); + lv_obj_set_style_pad_left(label, FIELD_PADDING_LEFT, LV_PART_MAIN); + lv_obj_set_style_pad_top(label, FIELD_PADDING_TOP, LV_PART_MAIN); } void NumberEdit::onEvent(event_t event) diff --git a/radio/src/thirdparty/libopenui/src/numberedit.h b/radio/src/thirdparty/libopenui/src/numberedit.h index a44d35fbd..edcd5a5ca 100644 --- a/radio/src/thirdparty/libopenui/src/numberedit.h +++ b/radio/src/thirdparty/libopenui/src/numberedit.h @@ -34,8 +34,6 @@ class NumberEdit : public BaseNumberEdit } #endif - void paint(BitmapBuffer * dc) override; - void setAvailableHandler(std::function handler) { isValueAvailable = std::move(handler); diff --git a/radio/src/thirdparty/libopenui/src/textedit.cpp b/radio/src/thirdparty/libopenui/src/textedit.cpp index 09cd291ab..38a795193 100644 --- a/radio/src/thirdparty/libopenui/src/textedit.cpp +++ b/radio/src/thirdparty/libopenui/src/textedit.cpp @@ -42,31 +42,6 @@ #include "clipboard.h" #endif - -static lv_obj_t *virtual_kb = nullptr; - -static void ta_event_cb(lv_event_t *e) -{ - // lv_event_code_t code = lv_event_get_code(e); - // lv_obj_t *ta = lv_event_get_target(e); - // if (code == LV_EVENT_CLICKED) { - // if (virtual_kb == nullptr) { - // virtual_kb = lv_keyboard_create(lv_scr_act()); - // lv_obj_set_size(virtual_kb, LV_HOR_RES, LV_VER_RES / 2); - // } - - // if (virtual_kb != NULL) { - // lv_keyboard_set_textarea(virtual_kb, ta); - // lv_obj_add_state(ta, LV_STATE_EDITED); - // } - // } else if (code == LV_EVENT_DEFOCUSED || code == LV_EVENT_DELETE) { - // if (virtual_kb != nullptr) { - // lv_obj_del(virtual_kb); - // virtual_kb = nullptr; - // } - // } -} - static lv_style_t style_main; static lv_style_t style_edit; static LvglWidgetFactory textEditFactory = { lv_textarea_create, nullptr }; @@ -81,9 +56,6 @@ TextEdit::TextEdit(Window *parent, const rect_t &rect, char *value, { extra_chars = (_extra_chars) ? _extra_chars : extra_chars_default; - // callbacks - lv_obj_add_event_cb(lvobj, ta_event_cb, LV_EVENT_ALL, NULL); - // properties lv_obj_set_scrollbar_mode(lvobj, LV_SCROLLBAR_MODE_OFF); lv_textarea_set_password_mode(lvobj, false); @@ -127,45 +99,6 @@ TextEdit::TextEdit(Window *parent, const rect_t &rect, char *value, lv_obj_set_style_pad_top(label, FIELD_PADDING_TOP, LV_PART_MAIN); } -void TextEdit::paint(BitmapBuffer * dc) -{ -// FormField::paint(dc); - -// if (editMode) { -// dc->drawSizedText(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, value, length, -// COLOR_THEME_PRIMARY2); -// coord_t left = (cursorPos == 0 ? 0 : getTextWidth(value, cursorPos)); -// #if defined(SOFTWARE_KEYBOARD) -// dc->drawSolidFilledRect(left + 2, 2, 2, height() - 4, COLOR_THEME_PRIMARY2); -// #else -// char s[] = {value[cursorPos], '\0'}; -// dc->drawSolidFilledRect(FIELD_PADDING_LEFT + left - 1, -// FIELD_PADDING_TOP - 1, getTextWidth(s, 1) + 1, -// height() - 2, COLOR_THEME_PRIMARY2); -// dc->drawText(FIELD_PADDING_LEFT + left, FIELD_PADDING_TOP, s, -// COLOR_THEME_SECONDARY1); -// #endif -// } else { -// const char * displayedValue = value; -// LcdFlags textColor = COLOR_THEME_PRIMARY2; -// if (hasFocus()) { -// if (strlen(value) == 0) { -// displayedValue = "---"; -// } -// textColor = COLOR_THEME_PRIMARY2; -// } -// else { -// if (strlen(value) == 0) { -// displayedValue = "---"; -// textColor = COLOR_THEME_DISABLED; -// } -// else { -// textColor = COLOR_THEME_SECONDARY1; -// } -// } -// dc->drawSizedText(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, displayedValue, length, textColor); -// } -} void TextEdit::trim() { @@ -184,24 +117,9 @@ void TextEdit::onEvent(event_t event) #if defined(HARDWARE_TOUCH) if (IS_VIRTUAL_KEY_EVENT(event)) { uint8_t c = event & 0xFF; - if (c == (uint8_t)KEYBOARD_BACKSPACE[0]) { - if (cursorPos > 0) { - memmove(value + cursorPos - 1, value + cursorPos, length - cursorPos); - value[length - 1] = '\0'; - --cursorPos; - invalidate(); - changed = true; - } - } - else if (c == (uint8_t)KEYBOARD_ENTER[0]) { + if (c == (uint8_t)KEYBOARD_ENTER[0]) { changeEnd(); } - else if (cursorPos < length) { - memmove(value + cursorPos + 1, value + cursorPos, length - cursorPos - 1); - value[cursorPos++] = c; - invalidate(); - changed = true; - } } #endif diff --git a/radio/src/thirdparty/libopenui/src/textedit.h b/radio/src/thirdparty/libopenui/src/textedit.h index 779c811f1..bf7b65b19 100644 --- a/radio/src/thirdparty/libopenui/src/textedit.h +++ b/radio/src/thirdparty/libopenui/src/textedit.h @@ -46,8 +46,6 @@ class TextEdit : public FormField { return value; } - void paint(BitmapBuffer * dc) override; - void onEvent(event_t event) override; #if defined(HARDWARE_TOUCH) @@ -67,6 +65,7 @@ class TextEdit : public FormField { void changeEnd(bool forceChanged = false) override { + strncpy(value, lv_textarea_get_text(lvobj), length); cursorPos = 0; if (changed || forceChanged) { changed = false;