diff --git a/radio/src/thirdparty/libopenui/src/button.cpp b/radio/src/thirdparty/libopenui/src/button.cpp index 48c44dd9a..ffb46b445 100644 --- a/radio/src/thirdparty/libopenui/src/button.cpp +++ b/radio/src/thirdparty/libopenui/src/button.cpp @@ -48,9 +48,9 @@ void Button::onEvent(event_t event) #if defined(HARDWARE_TOUCH) bool Button::onTouchEnd(coord_t x, coord_t y) { - if (enabled()) { + if (enabled) { if (!(windowFlags & NO_FOCUS)) { - setFocus(); + setFocus(SET_FOCUS_DEFAULT); } onPress(); } @@ -69,7 +69,7 @@ void TextButton::paint(BitmapBuffer * dc) { FormField::paint(dc); - LcdFlags textColor = DEFAULT_COLOR; + auto textColor = DEFAULT_COLOR; if (checked()) { if (hasFocus()) { diff --git a/radio/src/thirdparty/libopenui/src/button.h b/radio/src/thirdparty/libopenui/src/button.h index 41a6b463f..252b24eaf 100644 --- a/radio/src/thirdparty/libopenui/src/button.h +++ b/radio/src/thirdparty/libopenui/src/button.h @@ -22,10 +22,9 @@ #include "form.h" -constexpr WindowFlags BUTTON_BACKGROUND = FORM_FLAGS_LAST << 1; -constexpr WindowFlags BUTTON_CHECKED = FORM_FLAGS_LAST << 2; -constexpr WindowFlags BUTTON_CHECKED_ON_FOCUS = FORM_FLAGS_LAST << 3; -constexpr WindowFlags BUTTON_DISABLED = FORM_FLAGS_LAST << 4; +constexpr WindowFlags BUTTON_BACKGROUND = FORM_FLAGS_LAST << 1u; +constexpr WindowFlags BUTTON_CHECKED = FORM_FLAGS_LAST << 2u; +constexpr WindowFlags BUTTON_CHECKED_ON_FOCUS = FORM_FLAGS_LAST << 3u; class Button: public FormField { public: @@ -42,19 +41,6 @@ class Button: public FormField { } #endif - void enable(bool enabled = true) - { - if (!enabled != bool(windowFlags & BUTTON_DISABLED)) { - windowFlags ^= BUTTON_DISABLED; - invalidate(); - } - } - - void disable() - { - enable(false); - } - void check(bool checked = true) { if (checked != bool(windowFlags & BUTTON_CHECKED)) { @@ -63,12 +49,7 @@ class Button: public FormField { } } - bool enabled() - { - return !(windowFlags & BUTTON_DISABLED); - } - - bool checked() + bool checked() const { if (windowFlags & BUTTON_CHECKED_ON_FOCUS) return hasFocus(); @@ -106,7 +87,7 @@ class Button: public FormField { class TextButton: public Button { public: TextButton(FormGroup * parent, const rect_t & rect, std::string text, std::function pressHandler = nullptr, WindowFlags windowFlags = BUTTON_BACKGROUND): - Button(parent, rect, pressHandler, windowFlags | OPAQUE), + Button(parent, rect, std::move(pressHandler), windowFlags | OPAQUE), text(std::move(text)) { } @@ -135,7 +116,7 @@ class TextButton: public Button { class IconButton: public Button { public: IconButton(FormGroup * parent, const rect_t & rect, uint8_t icon, std::function pressHandler, WindowFlags flags = 0): - Button(parent, rect, pressHandler, flags), + Button(parent, rect, std::move(pressHandler), flags), icon(icon) { } diff --git a/radio/src/thirdparty/libopenui/src/checkbox.cpp b/radio/src/thirdparty/libopenui/src/checkbox.cpp index 9bdcf08c5..18f0cb458 100644 --- a/radio/src/thirdparty/libopenui/src/checkbox.cpp +++ b/radio/src/thirdparty/libopenui/src/checkbox.cpp @@ -46,7 +46,7 @@ bool CheckBox::onTouchEnd(coord_t x, coord_t y) { onKeyPress(); _setValue(!getValue()); - setFocus(); + setFocus(SET_FOCUS_DEFAULT); invalidate(); return true; } diff --git a/radio/src/thirdparty/libopenui/src/choice.cpp b/radio/src/thirdparty/libopenui/src/choice.cpp index 6db9afe3f..fe546fc30 100644 --- a/radio/src/thirdparty/libopenui/src/choice.cpp +++ b/radio/src/thirdparty/libopenui/src/choice.cpp @@ -150,7 +150,7 @@ void Choice::openMenu() menu->setCloseHandler([=]() { editMode = false; - setFocus(); + setFocus(SET_FOCUS_DEFAULT); }); setEditMode(true); diff --git a/radio/src/thirdparty/libopenui/src/dialog.cpp b/radio/src/thirdparty/libopenui/src/dialog.cpp index 50a8b88a9..cd991edce 100644 --- a/radio/src/thirdparty/libopenui/src/dialog.cpp +++ b/radio/src/thirdparty/libopenui/src/dialog.cpp @@ -25,7 +25,7 @@ DialogWindowContent::DialogWindowContent(Dialog * parent, const rect_t & rect): ModalWindowContent(parent, rect), form(this, {0, POPUP_HEADER_HEIGHT, rect.w, coord_t(rect.h - POPUP_HEADER_HEIGHT)}, FORM_NO_BORDER) { - form.setFocus(); + form.setFocus(SET_FOCUS_DEFAULT); } @@ -34,5 +34,5 @@ Dialog::Dialog(Window * parent, std::string title, const rect_t & rect): content(createDialogWindow(this, rect)) { bringToTop(); - content->setTitle(title); + content->setTitle(std::move(title)); } diff --git a/radio/src/thirdparty/libopenui/src/expansion_panel.cpp b/radio/src/thirdparty/libopenui/src/expansion_panel.cpp index 11601f1a6..6f2a84689 100644 --- a/radio/src/thirdparty/libopenui/src/expansion_panel.cpp +++ b/radio/src/thirdparty/libopenui/src/expansion_panel.cpp @@ -43,7 +43,7 @@ void ExpansionPanelHeader::onEvent(event_t event) bool ExpansionPanelHeader::onTouchEnd(coord_t, coord_t) { static_cast(parent)->toggle(); - setFocus(); + setFocus(SET_FOCUS_DEFAULT); return true; } #endif diff --git a/radio/src/thirdparty/libopenui/src/filechoice.cpp b/radio/src/thirdparty/libopenui/src/filechoice.cpp index 721bac985..7a2319596 100644 --- a/radio/src/thirdparty/libopenui/src/filechoice.cpp +++ b/radio/src/thirdparty/libopenui/src/filechoice.cpp @@ -75,7 +75,7 @@ bool FileChoice::openMenu() files.emplace_back(fno.fname, fnLen); } - if (files.size() > 0) { + if (!files.empty()) { // sort files files.sort(compare_nocase); @@ -102,8 +102,8 @@ bool FileChoice::openMenu() } menu->setCloseHandler([=]() { - editMode = false; - setFocus(); + editMode = false; + setFocus(SET_FOCUS_DEFAULT); }); return true; @@ -136,7 +136,7 @@ void FileChoice::onEvent(event_t event) bool FileChoice::onTouchEnd(coord_t, coord_t) { openMenu(); - setFocus(); + setFocus(SET_FOCUS_DEFAULT); setEditMode(true); return true; } diff --git a/radio/src/thirdparty/libopenui/src/form.cpp b/radio/src/thirdparty/libopenui/src/form.cpp index e966bf506..33346d33c 100644 --- a/radio/src/thirdparty/libopenui/src/form.cpp +++ b/radio/src/thirdparty/libopenui/src/form.cpp @@ -25,7 +25,7 @@ FormField::FormField(Window * parent, const rect_t & rect, WindowFlags windowFla Window(parent, rect, windowFlags, textFlags) { if (!(windowFlags & NO_FOCUS)) { - FormGroup * form = dynamic_cast(parent); + auto * form = dynamic_cast(parent); if (form) { form->addField(this, windowFlags & PUSH_FRONT); } @@ -61,6 +61,23 @@ void FormField::onEvent(event_t event) } #endif +void FormField::setFocus(uint8_t flag) +{ + if (!enabled) { + if (flag == SET_FOCUS_BACKWARD) { + if (previous) + previous->setFocus(flag); + } + else { + if (next) + next->setFocus(flag); + } + } + else { + Window::setFocus(flag); + } +} + void FormField::paint(BitmapBuffer * dc) { if (editMode) { @@ -101,7 +118,7 @@ void FormGroup::addField(FormField * field, bool front) link(last, first); } if (!focusWindow && !(field->getWindowFlags() & FORM_FORWARD_FOCUS)) { - field->setFocus(); + field->setFocus(SET_FOCUS_DEFAULT); } } @@ -131,21 +148,23 @@ void FormGroup::setFocus(uint8_t flag) case SET_FOCUS_FORWARD: if (focusWindow->isChild(last)) { - if (next == this) + if (next == this) { first->setFocus(SET_FOCUS_FORWARD); + } else if (next) next->setFocus(SET_FOCUS_FORWARD); } else { - if (first) + if (first) { first->setFocus(SET_FOCUS_FORWARD); + } } break; default: if (focusWindow == previous) { if (first) - first->setFocus(); + first->setFocus(SET_FOCUS_DEFAULT); } else { if (next) @@ -155,7 +174,7 @@ void FormGroup::setFocus(uint8_t flag) } } else { - FormField::setFocus(); + FormField::setFocus(SET_FOCUS_DEFAULT); } } @@ -209,6 +228,6 @@ void FormWindow::onEvent(event_t event) return; } - Window::onEvent(event); + FormGroup::onEvent(event); } #endif diff --git a/radio/src/thirdparty/libopenui/src/form.h b/radio/src/thirdparty/libopenui/src/form.h index 8dea0331a..d326d846e 100644 --- a/radio/src/thirdparty/libopenui/src/form.h +++ b/radio/src/thirdparty/libopenui/src/form.h @@ -62,6 +62,24 @@ class FormField: public Window { editMode = newEditMode; } + void enable(bool enabled) + { + this->enabled = enabled; + invalidate(); + } + + bool isEnabled() const + { + return enabled; + } + + void disable() + { + enable(false); + } + + void setFocus(uint8_t flag) override; + void onFocusLost() override { editMode = false; @@ -84,6 +102,7 @@ class FormField: public Window { FormField * next = nullptr; FormField * previous = nullptr; bool editMode = false; + bool enabled = true; }; class FormGroup: public FormField { @@ -107,7 +126,7 @@ class FormGroup: public FormField { last = nullptr; } - void setFocus(uint8_t flag = SET_FOCUS_DEFAULT) override; + void setFocus(uint8_t flag) override; void addField(FormField * field, bool front = false); diff --git a/radio/src/thirdparty/libopenui/src/menu.cpp b/radio/src/thirdparty/libopenui/src/menu.cpp index e5af31b24..b292e7b10 100644 --- a/radio/src/thirdparty/libopenui/src/menu.cpp +++ b/radio/src/thirdparty/libopenui/src/menu.cpp @@ -36,10 +36,10 @@ void MenuBody::onEvent(event_t event) TRACE_WINDOWS("%s received event 0x%X", getWindowDebugString().c_str(), event); if (event == EVT_ROTARY_RIGHT) { - select((selectedIndex + 1) % lines.size()); + select(int((selectedIndex + 1) % lines.size())); } else if (event == EVT_ROTARY_LEFT) { - select(selectedIndex == 0 ? lines.size() - 1 : selectedIndex - 1); + select(int(selectedIndex == 0 ? lines.size() - 1 : selectedIndex - 1)); } else if (event == EVT_KEY_BREAK(KEY_ENTER)) { if (selectedIndex < 0) { @@ -99,7 +99,7 @@ MenuWindowContent::MenuWindowContent(Menu * parent): ModalWindowContent(parent, {(LCD_W - MENUS_WIDTH) / 2, (LCD_H - MENUS_WIDTH) / 2, MENUS_WIDTH, 0}), body(this, {0, 0, width(), height()}) { - body.setFocus(); + body.setFocus(SET_FOCUS_DEFAULT); } void MenuWindowContent::paint(BitmapBuffer * dc) @@ -148,7 +148,7 @@ void Menu::addLine(const std::string & text, std::function onPress) void Menu::addCustomLine(std::function drawLine, std::function onPress) { - content->body.addCustomLine(drawLine, std::move(onPress)); + content->body.addCustomLine(std::move(drawLine), std::move(onPress)); updatePosition(); } diff --git a/radio/src/thirdparty/libopenui/src/menutoolbar.h b/radio/src/thirdparty/libopenui/src/menutoolbar.h index ef1559bc7..bb0de621e 100644 --- a/radio/src/thirdparty/libopenui/src/menutoolbar.h +++ b/radio/src/thirdparty/libopenui/src/menutoolbar.h @@ -47,7 +47,7 @@ class MenuToolbarButton: public Button { clearFocus(); } else { - setFocus(); + setFocus(SET_FOCUS_DEFAULT); } onPress(); return true; diff --git a/radio/src/thirdparty/libopenui/src/modal_window.h b/radio/src/thirdparty/libopenui/src/modal_window.h index f82658ac4..65275f670 100644 --- a/radio/src/thirdparty/libopenui/src/modal_window.h +++ b/radio/src/thirdparty/libopenui/src/modal_window.h @@ -37,7 +37,7 @@ class ModalWindow: public Window void deleteLater() { if (previousFocus) { - previousFocus->setFocus(); + previousFocus->setFocus(SET_FOCUS_DEFAULT); } Window::deleteLater(); } diff --git a/radio/src/thirdparty/libopenui/src/numberedit.cpp b/radio/src/thirdparty/libopenui/src/numberedit.cpp index 4d1f2d8b2..ecd91e3e8 100644 --- a/radio/src/thirdparty/libopenui/src/numberedit.cpp +++ b/radio/src/thirdparty/libopenui/src/numberedit.cpp @@ -127,7 +127,7 @@ bool NumberEdit::onTouchEnd(coord_t, coord_t) } if (!hasFocus()) { - setFocus(); + setFocus(SET_FOCUS_DEFAULT); } NumberKeyboard::show(this); diff --git a/radio/src/thirdparty/libopenui/src/numberedit.h b/radio/src/thirdparty/libopenui/src/numberedit.h index e978f75f4..03e34850b 100644 --- a/radio/src/thirdparty/libopenui/src/numberedit.h +++ b/radio/src/thirdparty/libopenui/src/numberedit.h @@ -37,11 +37,6 @@ class NumberEdit : public BaseNumberEdit { void paint(BitmapBuffer * dc) override; - void enable(bool enabled) - { - this->enabled = enabled; - } - void setAvailableHandler(std::function handler) { isValueAvailable = std::move(handler); @@ -80,7 +75,6 @@ class NumberEdit : public BaseNumberEdit { std::string prefix; std::string suffix; std::string zeroText; - bool enabled = true; std::function isValueAvailable; }; diff --git a/radio/src/thirdparty/libopenui/src/slider.cpp b/radio/src/thirdparty/libopenui/src/slider.cpp index 3284e884a..ecc08243d 100644 --- a/radio/src/thirdparty/libopenui/src/slider.cpp +++ b/radio/src/thirdparty/libopenui/src/slider.cpp @@ -57,7 +57,7 @@ bool Slider::onTouchStart(coord_t x, coord_t y) { if (!hasFocus()) { onKeyPress(); - setFocus(); + setFocus(SET_FOCUS_DEFAULT); } sliding = (value(x) == getValue()); return true; diff --git a/radio/src/thirdparty/libopenui/src/textedit.cpp b/radio/src/thirdparty/libopenui/src/textedit.cpp index 58cddb992..a3f8a1ecd 100644 --- a/radio/src/thirdparty/libopenui/src/textedit.cpp +++ b/radio/src/thirdparty/libopenui/src/textedit.cpp @@ -182,7 +182,7 @@ void TextEdit::onEvent(event_t event) bool TextEdit::onTouchEnd(coord_t x, coord_t y) { if (!hasFocus()) { - setFocus(); + setFocus(SET_FOCUS_DEFAULT); } #if defined(SOFTWARE_KEYBOARD) diff --git a/radio/src/thirdparty/libopenui/src/window.h b/radio/src/thirdparty/libopenui/src/window.h index 9661fb634..f9cce8e8e 100644 --- a/radio/src/thirdparty/libopenui/src/window.h +++ b/radio/src/thirdparty/libopenui/src/window.h @@ -158,11 +158,11 @@ class Window { static void clearFocus(); - virtual void setFocus(uint8_t flag = SET_FOCUS_DEFAULT); + virtual void setFocus(uint8_t flag); - void setRect(rect_t rect) + void setRect(rect_t value) { - this->rect = rect; + rect = value; invalidate(); }