From ede2dba2eaa78663451a338b25c25416d74d895f Mon Sep 17 00:00:00 2001 From: kevinkoenig Date: Thu, 16 Sep 2021 08:51:38 -0500 Subject: [PATCH] Fixes the defect that the software keyboard does not call onChangeEnd if the keyboard is hidden via touch and not via an esc. It changes TextEdit and FormField to move the onChange event to the base class instead of in TextEdit. Now the keyboard calls onChange when it is hidden. --- radio/src/thirdparty/libopenui/src/form.h | 13 +++++++++++++ .../src/thirdparty/libopenui/src/keyboard_base.cpp | 1 - radio/src/thirdparty/libopenui/src/keyboard_base.h | 1 + radio/src/thirdparty/libopenui/src/textedit.h | 8 +------- 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/radio/src/thirdparty/libopenui/src/form.h b/radio/src/thirdparty/libopenui/src/form.h index 5faceea0c..88c2ff56f 100644 --- a/radio/src/thirdparty/libopenui/src/form.h +++ b/radio/src/thirdparty/libopenui/src/form.h @@ -32,6 +32,18 @@ class FormField: public Window public: FormField(Window * parent, const rect_t & rect, WindowFlags windowFlags = 0, LcdFlags textFlags = 0); + virtual void changeEnd(bool forceChanged = false) + { + if (changeHandler) { + changeHandler(); + } + } + + void setChangeHandler(std::function handler) + { + changeHandler = std::move(handler); + } + inline void setNextField(FormField *field) { next = field; @@ -104,6 +116,7 @@ class FormField: public Window FormField * previous = nullptr; bool editMode = false; bool enabled = true; + std::function changeHandler = nullptr; }; class FormGroup: public FormField diff --git a/radio/src/thirdparty/libopenui/src/keyboard_base.cpp b/radio/src/thirdparty/libopenui/src/keyboard_base.cpp index 414c0bd42..50bb07051 100644 --- a/radio/src/thirdparty/libopenui/src/keyboard_base.cpp +++ b/radio/src/thirdparty/libopenui/src/keyboard_base.cpp @@ -37,7 +37,6 @@ coord_t calcScrollOffsetForField(FormField *newField, Window *topWindow) bool Keyboard::attachKeyboard() { - TRACE("ATTACH KEYBOARD"); if (activeKeyboard) { if (activeKeyboard == this) return false; activeKeyboard->clearField(); diff --git a/radio/src/thirdparty/libopenui/src/keyboard_base.h b/radio/src/thirdparty/libopenui/src/keyboard_base.h index 5374b9d5c..cf0e42df4 100644 --- a/radio/src/thirdparty/libopenui/src/keyboard_base.h +++ b/radio/src/thirdparty/libopenui/src/keyboard_base.h @@ -43,6 +43,7 @@ class Keyboard: public FormWindow } if (field) { field->setEditMode(false); + field->changeEnd(); field = nullptr; } } diff --git a/radio/src/thirdparty/libopenui/src/textedit.h b/radio/src/thirdparty/libopenui/src/textedit.h index 32d8dc256..975f40e1a 100644 --- a/radio/src/thirdparty/libopenui/src/textedit.h +++ b/radio/src/thirdparty/libopenui/src/textedit.h @@ -42,11 +42,6 @@ class TextEdit : public FormField { } #endif - void setChangeHandler(std::function handler) - { - changeHandler = std::move(handler); - } - uint8_t getMaxLength() const { return length; @@ -73,11 +68,10 @@ class TextEdit : public FormField { uint8_t length; const char * extra_chars; uint8_t cursorPos = 0; - std::function changeHandler = nullptr; void trim(); - void changeEnd(bool forceChanged = false) + void changeEnd(bool forceChanged = false) override { cursorPos = 0; if (changed || forceChanged) {