diff --git a/radio/src/thirdparty/libopenui/src/bitmapbuffer.cpp b/radio/src/thirdparty/libopenui/src/bitmapbuffer.cpp index 7f3302dbb..634a2a7c6 100644 --- a/radio/src/thirdparty/libopenui/src/bitmapbuffer.cpp +++ b/radio/src/thirdparty/libopenui/src/bitmapbuffer.cpp @@ -17,7 +17,6 @@ * Lesser General Public License for more details. */ -#include #include "bitmapbuffer.h" #include "libopenui_depends.h" #include "libopenui_globals.h" @@ -190,13 +189,11 @@ void BitmapBuffer::drawFilledRect(coord_t x, coord_t y, coord_t w, coord_t h, ui if (x + w > xmax) w = xmax - x; - for (coord_t i=y; i= ymax || x >= xmax || width <= 0 || x + width < xmin || y + height < ymin) { + if (y >= ymax || x >= xmax || width <= 0 || x + width < xmin || y + height < ymin) return; - } pixel_t color = lcdColorTable[COLOR_IDX(flags)]; diff --git a/radio/src/thirdparty/libopenui/src/bitmapbuffer.h b/radio/src/thirdparty/libopenui/src/bitmapbuffer.h index 8945c6254..29e536945 100644 --- a/radio/src/thirdparty/libopenui/src/bitmapbuffer.h +++ b/radio/src/thirdparty/libopenui/src/bitmapbuffer.h @@ -390,12 +390,12 @@ class BitmapBuffer: public BitmapBufferBase template void drawBitmap(coord_t x, coord_t y, const T * bmp, coord_t srcx=0, coord_t srcy=0, coord_t w=0, coord_t h=0, float scale=0) { + if (!data || !bmp) + return; + APPLY_OFFSET(); - if (x >= xmax) return; - if (y >= ymax) return; - - if (!data || !bmp) + if (x >= xmax || y >= ymax) return; coord_t srcw = bmp->width(); @@ -411,14 +411,14 @@ class BitmapBuffer: public BitmapBufferBase h = srch - srcy; if (x < xmin) { - w += x-xmin; - srcx -= x-xmin; + w += x - xmin; + srcx -= x - xmin; x = xmin; } if (y < ymin) { - h += y-ymin; - srcy -= y-ymin; + h += y - ymin; + srcy -= y - ymin; y = ymin; } diff --git a/radio/src/thirdparty/libopenui/src/choice.cpp b/radio/src/thirdparty/libopenui/src/choice.cpp index 57c084d8e..5610157cc 100644 --- a/radio/src/thirdparty/libopenui/src/choice.cpp +++ b/radio/src/thirdparty/libopenui/src/choice.cpp @@ -54,7 +54,7 @@ void Choice::onEvent(event_t event) void Choice::openMenu() { - auto menu = new Menu(); + auto menu = new Menu(this); if (!menuTitle.empty()) menu->setTitle(menuTitle); diff --git a/radio/src/thirdparty/libopenui/src/dialog.cpp b/radio/src/thirdparty/libopenui/src/dialog.cpp index 70b8d3440..50a8b88a9 100644 --- a/radio/src/thirdparty/libopenui/src/dialog.cpp +++ b/radio/src/thirdparty/libopenui/src/dialog.cpp @@ -29,8 +29,8 @@ DialogWindowContent::DialogWindowContent(Dialog * parent, const rect_t & rect): } -Dialog::Dialog(std::string title, const rect_t & rect): - ModalWindow(), +Dialog::Dialog(Window * parent, std::string title, const rect_t & rect): + ModalWindow(parent), content(createDialogWindow(this, rect)) { bringToTop(); diff --git a/radio/src/thirdparty/libopenui/src/dialog.h b/radio/src/thirdparty/libopenui/src/dialog.h index f4bb790c0..85b2b7737 100644 --- a/radio/src/thirdparty/libopenui/src/dialog.h +++ b/radio/src/thirdparty/libopenui/src/dialog.h @@ -49,14 +49,7 @@ class DialogWindowContent: public ModalWindowContent { class Dialog: public ModalWindow { public: - Dialog(std::string title, const rect_t & rect); - -#if defined(DEBUG_WINDOWS) - std::string getName() override - { - return "Dialog"; - } -#endif + Dialog(Window * parent, std::string title, const rect_t & rect); protected: DialogWindowContent * content; diff --git a/radio/src/thirdparty/libopenui/src/filechoice.cpp b/radio/src/thirdparty/libopenui/src/filechoice.cpp index 250f8b3a9..861f56a3d 100644 --- a/radio/src/thirdparty/libopenui/src/filechoice.cpp +++ b/radio/src/thirdparty/libopenui/src/filechoice.cpp @@ -87,7 +87,7 @@ bool FileChoice::openMenu() files.push_front(""); - auto menu = new Menu(); + auto menu = new Menu(this); int count = 0; int current = -1; std::string value = getValue(); @@ -116,7 +116,7 @@ bool FileChoice::openMenu() } } - new MessageDialog(STR_SDCARD, STR_NO_FILES_ON_SD); + new MessageDialog(this, STR_SDCARD, STR_NO_FILES_ON_SD); return false; } diff --git a/radio/src/thirdparty/libopenui/src/libopenui_defines.h b/radio/src/thirdparty/libopenui/src/libopenui_defines.h index a66bdb431..5382a4080 100644 --- a/radio/src/thirdparty/libopenui/src/libopenui_defines.h +++ b/radio/src/thirdparty/libopenui/src/libopenui_defines.h @@ -38,9 +38,6 @@ #define PREC2 0x30 #define MODE(flags) ((((int8_t)(flags) & 0x30) - 0x10) >> 4) -/* rect, square flags */ -#define ROUND 0x04 - /* telemetry flags */ #define NO_UNIT 0x40 diff --git a/radio/src/thirdparty/libopenui/src/menu.cpp b/radio/src/thirdparty/libopenui/src/menu.cpp index dff52ef0c..a76991f28 100644 --- a/radio/src/thirdparty/libopenui/src/menu.cpp +++ b/radio/src/thirdparty/libopenui/src/menu.cpp @@ -108,8 +108,8 @@ void MenuWindowContent::paint(BitmapBuffer * dc) } } -Menu::Menu(): - ModalWindow(), +Menu::Menu(Window * parent): + ModalWindow(parent), content(createMenuWindow(this)) { } @@ -128,9 +128,9 @@ void Menu::updatePosition() content->body.setInnerHeight(content->body.lines.size() * MENUS_LINE_HEIGHT - 1); } -void Menu::setTitle(const std::string text) +void Menu::setTitle(std::string text) { - content->setTitle(text); + content->setTitle(std::move(text)); updatePosition(); } diff --git a/radio/src/thirdparty/libopenui/src/menu.h b/radio/src/thirdparty/libopenui/src/menu.h index 2775827ce..5e07fc809 100644 --- a/radio/src/thirdparty/libopenui/src/menu.h +++ b/radio/src/thirdparty/libopenui/src/menu.h @@ -136,20 +136,13 @@ class MenuWindowContent: public ModalWindowContent { class Menu: public ModalWindow { public: - Menu(); + explicit Menu(Window * parent); void setCancelHandler(std::function handler) { content->body.setCancelHandler(handler); } -#if defined(DEBUG_WINDOWS) - std::string getName() override - { - return "Menu"; - } -#endif - void setToolbar(Window * window) { toolbar = window; @@ -158,7 +151,7 @@ class Menu: public ModalWindow { content->setHeight(toolbar->height()); } - void setTitle(const std::string text); + void setTitle(std::string text); void addLine(const std::string & text, std::function onPress); diff --git a/radio/src/thirdparty/libopenui/src/menutoolbar.h b/radio/src/thirdparty/libopenui/src/menutoolbar.h index 725bad6f9..ef1559bc7 100644 --- a/radio/src/thirdparty/libopenui/src/menutoolbar.h +++ b/radio/src/thirdparty/libopenui/src/menutoolbar.h @@ -138,7 +138,7 @@ class MenuToolbar: public FormGroup { std::list::iterator current = children.end(); T * choice; Menu * menu; - coord_t y = 0; // TODO NV14 was 5; + coord_t y = 0; void addButton(char picto, int16_t filtermin, int16_t filtermax) { @@ -164,7 +164,7 @@ class MenuToolbar: public FormGroup { return 1; }); - y += 30; + y += MENUS_TOOLBAR_BUTTON_WIDTH; setInnerHeight(y); } diff --git a/radio/src/thirdparty/libopenui/src/modal_window.cpp b/radio/src/thirdparty/libopenui/src/modal_window.cpp index a77c36a92..f7c1de20a 100644 --- a/radio/src/thirdparty/libopenui/src/modal_window.cpp +++ b/radio/src/thirdparty/libopenui/src/modal_window.cpp @@ -19,11 +19,10 @@ #include "modal_window.h" -#include "mainwindow.h" #include "font.h" -ModalWindow::ModalWindow(): - Window(&mainWindow, {0, 0, LCD_W, LCD_H}) +ModalWindow::ModalWindow(Window * parent): + Window(parent->getFullScreenWindow(), {0, 0, LCD_W, LCD_H}) #if !defined(HARDWARE_TOUCH) , previousFocus(focusWindow) #endif @@ -40,14 +39,4 @@ void ModalWindowContent::paint(BitmapBuffer * dc) dc->drawSolidFilledRect(0, 0, width(), POPUP_HEADER_HEIGHT, FOCUS_BGCOLOR); dc->drawText(FIELD_PADDING_LEFT, (POPUP_HEADER_HEIGHT - getFontHeight(FONT(STD))) / 2, title.c_str(), FOCUS_COLOR); dc->drawSolidFilledRect(0, POPUP_HEADER_HEIGHT, width(), height() - POPUP_HEADER_HEIGHT, DEFAULT_BGCOLOR); - -/* - // the background - dc->clear(MENU_BGCOLOR); - - // the title - if (!title.empty()) { - dc->drawText(MENUS_WIDTH / 2, (POPUP_HEADER_HEIGHT - getFontHeight(MENU_HEADER_FONT)) / 2, title.c_str(), CENTERED | MENU_HEADER_FONT); - dc->drawSolidHorizontalLine(0, POPUP_HEADER_HEIGHT - 1, MENUS_WIDTH, MENU_LINE_COLOR); - }*/ } diff --git a/radio/src/thirdparty/libopenui/src/modal_window.h b/radio/src/thirdparty/libopenui/src/modal_window.h index 13322c1aa..0f33abf71 100644 --- a/radio/src/thirdparty/libopenui/src/modal_window.h +++ b/radio/src/thirdparty/libopenui/src/modal_window.h @@ -25,7 +25,7 @@ class ModalWindow: public Window { public: - ModalWindow(); + explicit ModalWindow(Window * parent); #if defined(DEBUG_WINDOWS) std::string getName() override diff --git a/radio/src/thirdparty/libopenui/src/table.h b/radio/src/thirdparty/libopenui/src/table.h index 8ba7452f8..bf3b3fb5b 100644 --- a/radio/src/thirdparty/libopenui/src/table.h +++ b/radio/src/thirdparty/libopenui/src/table.h @@ -121,7 +121,7 @@ class Table: public Window { body.invalidate(); } - void setHeader(const char * values[]) + void setHeader(const char * const values[]) { Line line; for (uint8_t i = 0; i < count; i++) { @@ -130,7 +130,7 @@ class Table: public Window { header.setLine(line); } - void addLine(const char * values[], std::function onPress = nullptr) + void addLine(const char * const values[], std::function onPress = nullptr) { Line line; for (uint8_t i = 0; i < count; i++) { diff --git a/radio/src/thirdparty/libopenui/src/textedit.cpp b/radio/src/thirdparty/libopenui/src/textedit.cpp index fd8886f44..45c109380 100644 --- a/radio/src/thirdparty/libopenui/src/textedit.cpp +++ b/radio/src/thirdparty/libopenui/src/textedit.cpp @@ -33,10 +33,10 @@ void TextEdit::paint(BitmapBuffer * dc) dc->drawSizedText(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, value, length, FOCUS_COLOR); coord_t left = (cursorPos == 0 ? 0 : getTextWidth(value, cursorPos)); #if defined(HARDWARE_TOUCH) - dc->drawSolidFilledRect(left + 2, FIELD_PADDING_TOP + 1, 2, 20, FOCUS_COLOR); + dc->drawSolidFilledRect(left + 2, 2, 2, height() - 4, FOCUS_COLOR); #else char s[] = { value[cursorPos], '\0' }; - dc->drawSolidFilledRect(FIELD_PADDING_LEFT + left - 1, FIELD_PADDING_TOP + 1, getTextWidth(s, 1) + 1, height() - 2, FOCUS_COLOR); + dc->drawSolidFilledRect(FIELD_PADDING_LEFT + left - 1, FIELD_PADDING_TOP - 1, getTextWidth(s, 1) + 1, height() - 2, FOCUS_COLOR); dc->drawText(FIELD_PADDING_LEFT + left, FIELD_PADDING_TOP, s, DEFAULT_COLOR); #endif } @@ -193,7 +193,7 @@ bool TextEdit::onTouchEnd(coord_t x, coord_t y) char c = value[cursorPos]; if (c == '\0') break; - uint8_t w = getCharWidth(c, fontspecsTable[0]); + uint8_t w = getCharWidth(c, fontspecsTable[0]) + 1; if (rest < w) break; rest -= w; diff --git a/radio/src/thirdparty/libopenui/src/window.cpp b/radio/src/thirdparty/libopenui/src/window.cpp index 5916b6f04..8ecb8e22c 100644 --- a/radio/src/thirdparty/libopenui/src/window.cpp +++ b/radio/src/thirdparty/libopenui/src/window.cpp @@ -187,26 +187,41 @@ void Window::scrollTo(Window * child) void Window::fullPaint(BitmapBuffer * dc) { - TRACE_WINDOWS("%s", getWindowDebugString().c_str()); + bool paintNeeded = true; + + auto firstChild = children.end(); + while (firstChild != children.begin()) { + auto child = *(--firstChild); + if ((child->windowFlags & OPAQUE) && isChildFullSize(child)) { + paintNeeded = false; + break; + } + } if (windowFlags & PAINT_CHILDREN_FIRST) { coord_t xmin, xmax, ymin, ymax; coord_t x = dc->getOffsetX(); coord_t y = dc->getOffsetY(); dc->getClippingRect(xmin, xmax, ymin, ymax); - paintChildren(dc); + paintChildren(dc, firstChild); dc->setOffset(x, y); dc->setClippingRect(xmin, xmax, ymin, ymax); } - paint(dc); + if (paintNeeded) { + TRACE_WINDOWS("%s", getWindowDebugString().c_str()); + paint(dc); + } + else { + TRACE_WINDOWS("%s (skipped)", getWindowDebugString().c_str()); + } if (!(windowFlags & NO_SCROLLBAR)) { drawVerticalScrollbar(dc); } if (!(windowFlags & PAINT_CHILDREN_FIRST)) { - paintChildren(dc); + paintChildren(dc, firstChild); } } @@ -229,22 +244,13 @@ bool Window::isChildVisible(Window * window) return false; } -void Window::paintChildren(BitmapBuffer * dc) +void Window::paintChildren(BitmapBuffer * dc, std::list::iterator it) { coord_t x = dc->getOffsetX(); coord_t y = dc->getOffsetY(); coord_t xmin, xmax, ymin, ymax; dc->getClippingRect(xmin, xmax, ymin, ymax); - auto it = children.end(); - - while(it != children.begin()) { - auto child = *(--it); - if ((child->windowFlags & OPAQUE) && isChildFullSize(child)) { - break; - } - } - for (; it != children.end(); it++) { auto child = *it; diff --git a/radio/src/thirdparty/libopenui/src/window.h b/radio/src/thirdparty/libopenui/src/window.h index 946b2e9e5..93a421259 100644 --- a/radio/src/thirdparty/libopenui/src/window.h +++ b/radio/src/thirdparty/libopenui/src/window.h @@ -97,6 +97,11 @@ class Window { return parent; } + Window * getFullScreenWindow() + { + return (width() == LCD_W && height() == LCD_H) ? this : parent->getFullScreenWindow(); + } + WindowFlags getWindowFlags() const { return windowFlags; @@ -287,37 +292,15 @@ class Window { return parent && parent->isChildVisible(this); } - virtual void paint(BitmapBuffer * dc) - { - } - void drawVerticalScrollbar(BitmapBuffer * dc); - void paintChildren(BitmapBuffer * dc); - - void fullPaint(BitmapBuffer * dc); - static bool pointInRect(coord_t x, coord_t y, rect_t & rect) { return (x >= rect.x && x < rect.x + rect.w && y >= rect.y && y < rect.y + rect.h); } - virtual void onFocusLost() - { - TRACE_WINDOWS("%s onFocusLost()", getWindowDebugString().c_str()); - invalidate(); - }; - virtual void onEvent(event_t event); -#if defined(HARDWARE_TOUCH) - virtual bool onTouchStart(coord_t x, coord_t y); - - virtual bool onTouchEnd(coord_t x, coord_t y); - - virtual bool onTouchSlide(coord_t x, coord_t y, coord_t startX, coord_t startY, coord_t slideX, coord_t slideY); -#endif - void adjustInnerHeight(); coord_t adjustHeight(); @@ -371,6 +354,28 @@ class Window { } virtual void invalidate(const rect_t & rect); + + void paintChildren(BitmapBuffer * dc, std::list::iterator it); + + void fullPaint(BitmapBuffer * dc); + + virtual void paint(BitmapBuffer * dc) + { + } + + virtual void onFocusLost() + { + TRACE_WINDOWS("%s onFocusLost()", getWindowDebugString().c_str()); + invalidate(); + } + +#if defined(HARDWARE_TOUCH) + virtual bool onTouchStart(coord_t x, coord_t y); + + virtual bool onTouchEnd(coord_t x, coord_t y); + + virtual bool onTouchSlide(coord_t x, coord_t y, coord_t startX, coord_t startY, coord_t slideX, coord_t slideY); +#endif }; #endif // _WINDOW_H_