textedit: simplified implementation
This commit is contained in:
committed by
Peter Feerick
parent
7ab53f757f
commit
84f402569f
@@ -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
@@ -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
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user