diff --git a/radio/src/thirdparty/libopenui/src/form.cpp b/radio/src/thirdparty/libopenui/src/form.cpp index 10fe016d2..e966bf506 100644 --- a/radio/src/thirdparty/libopenui/src/form.cpp +++ b/radio/src/thirdparty/libopenui/src/form.cpp @@ -117,8 +117,7 @@ void FormGroup::setFocus(uint8_t flag) break; case SET_FOCUS_BACKWARD: - // TODO this test should be recursive - if (focusWindow == first || focusWindow->getParent() == first) { + if (focusWindow->isChild(first)) { if (previous == this) last->setFocus(SET_FOCUS_BACKWARD); else if (previous) @@ -131,8 +130,7 @@ void FormGroup::setFocus(uint8_t flag) break; case SET_FOCUS_FORWARD: - // TODO this test should be recursive - if (focusWindow == last || focusWindow->getParent() == last || focusWindow->getParent()->getParent() == last) { + if (focusWindow->isChild(last)) { if (next == this) first->setFocus(SET_FOCUS_FORWARD); else if (next) diff --git a/radio/src/thirdparty/libopenui/src/window.cpp b/radio/src/thirdparty/libopenui/src/window.cpp index 52a0f948a..69d068cd6 100644 --- a/radio/src/thirdparty/libopenui/src/window.cpp +++ b/radio/src/thirdparty/libopenui/src/window.cpp @@ -422,6 +422,7 @@ void Window::adjustInnerHeight() for (auto child: children) { innerHeight = max(innerHeight, child->rect.y + child->rect.h); } + invalidate(); } coord_t Window::adjustHeight() diff --git a/radio/src/thirdparty/libopenui/src/window.h b/radio/src/thirdparty/libopenui/src/window.h index 49157509a..eb15e0806 100644 --- a/radio/src/thirdparty/libopenui/src/window.h +++ b/radio/src/thirdparty/libopenui/src/window.h @@ -99,6 +99,11 @@ class Window { return parent; } + bool isChild(Window * window) const + { + return window == this || (getParent() && getParent()->isChild(window)); + } + Window * getFullScreenWindow() { return (width() == LCD_W && height() == LCD_H) ? this : parent->getFullScreenWindow(); @@ -174,7 +179,9 @@ class Window { void setHeight(coord_t value) { rect.h = value; - if (innerHeight <= value) { + if (windowFlags & FORWARD_SCROLL) + innerHeight = value; + else if (innerHeight <= value) { setScrollPositionY(0); } invalidate(); @@ -268,7 +275,11 @@ class Window { void setInnerHeight(coord_t h) { innerHeight = h; - if (height() >= h) { + if (windowFlags & FORWARD_SCROLL) { + rect.h = innerHeight; + parent->adjustInnerHeight(); + } + else if (height() >= h) { setScrollPositionY(0); } else {