diff --git a/radio/src/thirdparty/libopenui/src/choice.cpp b/radio/src/thirdparty/libopenui/src/choice.cpp index d7fbf825e..ffc1e2871 100644 --- a/radio/src/thirdparty/libopenui/src/choice.cpp +++ b/radio/src/thirdparty/libopenui/src/choice.cpp @@ -21,6 +21,14 @@ #include "menu.h" #include "theme.h" +ChoiceBase::ChoiceBase(FormGroup * parent, const rect_t & rect, ChoiceType type, WindowFlags windowFlags): + FormField(parent, rect, windowFlags), + type(type) +{ + +} + + Choice::Choice(FormGroup * parent, const rect_t & rect, int vmin, int vmax, std::function getValue, std::function setValue, WindowFlags windowFlags) : ChoiceBase(parent, rect, CHOICE_TYPE_DROPOWN, windowFlags), diff --git a/radio/src/thirdparty/libopenui/src/choice.h b/radio/src/thirdparty/libopenui/src/choice.h index bea30052a..d6bfc2af3 100644 --- a/radio/src/thirdparty/libopenui/src/choice.h +++ b/radio/src/thirdparty/libopenui/src/choice.h @@ -32,11 +32,7 @@ enum ChoiceType { class ChoiceBase : public FormField { public: - ChoiceBase(FormGroup * parent, const rect_t & rect, ChoiceType type = CHOICE_TYPE_DROPOWN, WindowFlags windowFlags = 0): - FormField(parent, rect, windowFlags), - type(type) - { - } + ChoiceBase(FormGroup * parent, const rect_t & rect, ChoiceType type = CHOICE_TYPE_DROPOWN, WindowFlags windowFlags = 0); inline ChoiceType getType() const { diff --git a/radio/src/thirdparty/libopenui/src/form.cpp b/radio/src/thirdparty/libopenui/src/form.cpp index 995238d31..e04b9271a 100644 --- a/radio/src/thirdparty/libopenui/src/form.cpp +++ b/radio/src/thirdparty/libopenui/src/form.cpp @@ -64,11 +64,17 @@ void FormField::onEvent(event_t event) } } #endif - +extern lv_group_t* inputGroup; void FormField::setFocus(uint8_t flag, Window * from) { if (enabled) { Window::setFocus(flag, from); + if(lvobj != nullptr) + { + lv_group_focus_freeze(inputGroup, false); + lv_group_focus_obj(lvobj); + lv_group_focus_freeze(inputGroup, true); + } } else { if (flag == SET_FOCUS_BACKWARD) { diff --git a/radio/src/thirdparty/libopenui/src/form.h b/radio/src/thirdparty/libopenui/src/form.h index b0b4ba954..c645454f4 100644 --- a/radio/src/thirdparty/libopenui/src/form.h +++ b/radio/src/thirdparty/libopenui/src/form.h @@ -77,6 +77,14 @@ class FormField: public Window virtual void setEditMode(bool newEditMode) { editMode = newEditMode; + + if(lvobj != nullptr) + { + lv_group_t* grp = (lv_group_t*)lv_obj_get_group(lvobj); + if(grp != nullptr) + lv_group_set_editing(grp, editMode); + } + if (editMode && lvobj != nullptr) { lv_obj_add_state(lvobj, LV_STATE_EDITED | LV_STATE_FOCUSED); } else if (lvobj != nullptr) { diff --git a/radio/src/thirdparty/libopenui/src/numberedit.cpp b/radio/src/thirdparty/libopenui/src/numberedit.cpp index 0fdc360ff..9b967d4f4 100644 --- a/radio/src/thirdparty/libopenui/src/numberedit.cpp +++ b/radio/src/thirdparty/libopenui/src/numberedit.cpp @@ -28,6 +28,30 @@ static LvglWidgetFactory numberEditFactory = { lv_textarea_create, nullptr }; static lv_style_t style_main; static lv_style_t style_edit; +extern "C" void lvglEventCb(lv_event_t* event) +{ + if(!event) + return; + uint32_t key = lv_event_get_key(event); + NumberEdit* numEdit = (NumberEdit*)event->user_data; + if(!numEdit) + return; + + lv_group_t* grp = (lv_group_t*)lv_obj_get_group(numEdit->getLvObj()); + if(grp && lv_group_get_focused(grp) == numEdit->getLvObj()) + numEdit->setEditMode(lv_group_get_editing(grp)); + switch(key) + { + case LV_KEY_LEFT: +// numEdit->onEvent(EVT_ROTARY_LEFT); + break; + case LV_KEY_RIGHT: +// numEdit->onEvent(EVT_ROTARY_RIGHT); + break; + } + event->code = LV_EVENT_REFRESH; +} + 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, &numberEditFactory) { @@ -72,6 +96,8 @@ NumberEdit::NumberEdit(Window * parent, const rect_t & rect, int vmin, int vmax, 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); + + lv_obj_add_event_cb(lvobj, lvglEventCb, LV_EVENT_ALL, this); } void NumberEdit::onEvent(event_t event) diff --git a/radio/src/thirdparty/libopenui/src/window.cpp b/radio/src/thirdparty/libopenui/src/window.cpp index 7881d3112..282a7d97e 100644 --- a/radio/src/thirdparty/libopenui/src/window.cpp +++ b/radio/src/thirdparty/libopenui/src/window.cpp @@ -37,6 +37,7 @@ static void window_event_cb(lv_event_t * e) Window* window = (Window *)lv_obj_get_user_data(target); if (!window) return; + if(window->deleted()) return; if (code == LV_EVENT_GET_SELF_SIZE) { lv_point_t *p = (lv_point_t *)lv_event_get_param(e); @@ -232,11 +233,16 @@ void Window::clear() void Window::clearLvgl() { + if(lvobj == nullptr) + return; + for (auto window: children) { - if(lvobj != nullptr && window->lvobj != nullptr && window->lvobj->parent == lvobj) + if(window->lvobj != nullptr && window->lvobj->parent == lvobj) window->clearLvgl(); } +// lv_obj_set_user_data(lvobj, nullptr); + lvobj = nullptr; } @@ -509,6 +515,7 @@ coord_t Window::getSnapStep(coord_t relativeScrollPosition, coord_t pageSize) } #endif +void lvglPushEncoderEvent(event_t evt); void Window::checkEvents() { auto copy = children; @@ -520,6 +527,7 @@ void Window::checkEvents() if (this == Window::focusWindow) { event_t event = getWindowEvent(); + lvglPushEncoderEvent(event); if (event) { this->onEvent(event); }