textedit: simplified implementation

This commit is contained in:
Raphael Coeffic
2022-08-18 12:12:02 +10:00
committed by Peter Feerick
parent 7ab53f757f
commit 84f402569f
3 changed files with 29 additions and 239 deletions
-1
View File
@@ -27,7 +27,6 @@ static void keyboard_event_cb(lv_event_t * e)
{
auto code = lv_event_get_code(e);
if (code == LV_EVENT_READY) {
pushEvent(EVT_VIRTUAL_KEY('\n'));
Keyboard::hide();
} else if (code == LV_EVENT_CANCEL) {
Keyboard::hide();
+12 -131
View File
@@ -41,15 +41,12 @@
#endif
TextEdit::TextEdit(Window *parent, const rect_t &rect, char *value,
uint8_t length, LcdFlags windowFlags,
const char *_extra_chars) :
uint8_t length, LcdFlags windowFlags) :
FormField(parent, rect, windowFlags, 0,
field_edit_create),
value(value),
length(length)
{
extra_chars = (_extra_chars) ? _extra_chars : extra_chars_default;
// properties
lv_obj_set_scrollbar_mode(lvobj, LV_SCROLLBAR_MODE_OFF);
lv_textarea_set_password_mode(lvobj, false);
@@ -72,13 +69,6 @@ void TextEdit::update()
lv_textarea_set_text(lvobj, txt.c_str());
}
void TextEdit::setCursorPos(int cursorPos)
{
this->cursorPos = cursorPos;
if (lvobj != nullptr)
lv_textarea_set_cursor_pos(lvobj, cursorPos);
}
void TextEdit::trim()
{
for (int i = length - 1; i >= 0; i--) {
@@ -89,134 +79,25 @@ void TextEdit::trim()
}
}
void TextEdit::onEvent(event_t event)
void TextEdit::changeEnd(bool forceChanged)
{
TRACE_WINDOWS("%s received event 0x%X", getWindowDebugString().c_str(), event);
if (lvobj == nullptr) return;
if (IS_VIRTUAL_KEY_EVENT(event)) {
uint8_t c = event & 0xFF;
if (c == LV_KEY_ENTER) {
changeEnd();
}
bool changed = false;
auto text = lv_textarea_get_text(lvobj);
if (strncmp(value, text, length) != 0) {
changed = true;
}
// #if defined(HARDWARE_KEYS)
// if (editMode) {
// int c = value[cursorPos];
// int v = c;
// switch (event) {
// case EVT_ROTARY_RIGHT:
// for (int i = 0; i < ROTARY_ENCODER_SPEED(); i++) {
// v = getNextChar(v);
// }
// break;
// case EVT_ROTARY_LEFT:
// for (int i = 0; i < ROTARY_ENCODER_SPEED(); i++) {
// v = getPreviousChar(v);
// }
// break;
// case EVT_KEY_BREAK(KEY_LEFT):
// if (cursorPos > 0) {
// setCursorPos(cursorPos - 1);
// }
// break;
// case EVT_KEY_BREAK(KEY_RIGHT):
// if (cursorPos < length - 1 && value[cursorPos + 1] != '\0') {
// setCursorPos(cursorPos + 1);
// }
// break;
// case EVT_KEY_BREAK(KEY_ENTER):
// if (cursorPos < length - 1) {
// if (value[cursorPos] == '\0') {
// value[cursorPos] = ' ';
// changed = true;
// }
// cursorPos++;
// if (value[cursorPos] == '\0') {
// value[cursorPos] = ' ';
// changed = true;
// }
// update();
// setCursorPos(cursorPos);
// }
// else {
// changeEnd();
// FormField::onEvent(event);
// }
// break;
// case EVT_KEY_LONG(KEY_ENTER):
// {
// killEvents(event);
// auto menu = new Menu(this);
// menu->setTitle(STR_EDIT);
// #if defined(CLIPBOARD)
// menu->addLine(STR_COPY, [=] {
// clipboard.write((uint8_t *)value, length, Clipboard::CONTENT_TEXT);
// });
// if (clipboard.contentType == Clipboard::CONTENT_TEXT) {
// menu->addLine(STR_PASTE, [=] {
// clipboard.read((uint8_t *)value, length);
// changeEnd(true);
// });
// }
// #endif
// menu->addLine(STR_CLEAR, [=] {
// memset(value, 0, length);
// changeEnd(true);
// });
// break;
// }
// case EVT_KEY_BREAK(KEY_UP):
// v = toggleCase(v);
// break;
// case EVT_KEY_LONG(KEY_LEFT):
// case EVT_KEY_LONG(KEY_RIGHT):
// v = toggleCase(v);
// if (event == EVT_KEY_LONG(KEY_LEFT)) {
// killEvents(KEY_LEFT);
// }
// break;
// case EVT_KEY_BREAK(KEY_PGDN):
// if (cursorPos < length) {
// memmove(&value[cursorPos], &value[cursorPos + 1], length - cursorPos - 1);
// value[length - 1] = '\0';
// changed = true;
// if (cursorPos > 0 && value[cursorPos] == '\0') {
// cursorPos = cursorPos - 1;
// }
// update();
// setCursorPos(cursorPos);
// }
// break;
// }
// if (c != v) {
// // TRACE("value[%d] = %d", cursorPos, v);
// value[cursorPos] = v;
// update();
// setCursorPos(cursorPos);
// changed = true;
// }
// }
// else {
// FormField::onEvent(event);
// setCursorPos(0);
// }
// #endif
if (changed || forceChanged) {
strncpy(value, text, length);
trim();
FormField::changeEnd();
}
}
void TextEdit::onClicked()
{
cursorPos = lv_textarea_get_cursor_pos(lvobj);
TextKeyboard::show(this);
}
+17 -107
View File
@@ -21,121 +21,31 @@
#include "form.h"
const char extra_chars_default[] = ":;<=>";
class TextEdit : public FormField
{
class TextEdit : public FormField {
friend class TextKeyboard;
public:
TextEdit(Window* parent, const rect_t& rect, char* value, uint8_t length,
LcdFlags windowFlags = 0, const char* _extra_chars = nullptr);
public:
TextEdit(Window* parent, const rect_t& rect, char* value, uint8_t length,
LcdFlags windowFlags = 0);
#if defined(DEBUG_WINDOWS)
std::string getName() const override
{
return "TextEdit";
}
std::string getName() const override { return "TextEdit"; }
#endif
uint8_t getMaxLength() const
{
return length;
}
uint8_t getMaxLength() const { return length; }
char* getData() const { return value; }
char * getData() const
{
return value;
}
void update();
void update();
protected:
static void event_cb(lv_event_t* e);
void onEvent(event_t event) override;
void onClicked() override;
char* value;
uint8_t length;
void onFocusLost() override;
void trim();
virtual void paint(BitmapBuffer* dc) override {};
void setCursorPos(int cursorPos);
protected:
char * value;
bool changed = false;
uint8_t length;
const char * extra_chars;
uint8_t cursorPos = 0;
void trim();
void changeEnd(bool forceChanged = false) override
{
if (lvobj != nullptr)
strncpy(value, lv_textarea_get_text(lvobj), length);
setCursorPos(0);
if (changed || forceChanged) {
changed = false;
trim();
if (changeHandler) {
changeHandler();
}
}
}
uint8_t getNextChar(uint8_t c)
{
if (c == ' ' || c == '\0')
return 'A';
else if (c >= 'A' && c < 'Z')
return c + 1;
else if (c == 'Z')
return 'a';
else if (c >= 'a' && c < 'z')
return c + 1;
else if (c == 'z')
return '0';
else if (c >= '0' && c < '9')
return c + 1;
else if (c == '9')
return extra_chars[0];
else {
for (uint8_t n = 0; n < strlen(extra_chars) - 1; n++)
if (c == extra_chars[n]) return extra_chars[n + 1];
return ' ';
}
}
uint8_t getPreviousChar(uint8_t c)
{
if (c == ' ' || c == '\0')
return extra_chars[strlen(extra_chars) - 1];
else if (c == 'A')
return ' ';
else if (c > 'A' && c <= 'Z')
return c - 1;
else if (c == 'a')
return 'Z';
else if (c > 'a' && c <= 'z')
return c - 1;
else if (c == '0')
return 'z';
else if (c > '0' && c <= '9')
return c - 1;
else {
for (uint8_t n = 1; n < strlen(extra_chars); n++)
if (c == extra_chars[n]) return extra_chars[n - 1];
return '9';
}
}
static uint8_t toggleCase(uint8_t c)
{
if (c >= 'A' && c <= 'Z')
return c + 32; // tolower
else if (c >= 'a' && c <= 'z')
return c - 32; // toupper
else
return c;
}
void changeEnd(bool forceChanged = false) override;
void onClicked() override;
void onFocusLost() override;
};