From fe7d425cede621d7b2234df40fdfa3cd3ff0de97 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Wed, 26 Jan 2022 13:39:31 +0100 Subject: [PATCH] LVGL drawing --- .../thirdparty/libopenui/src/mainwindow.cpp | 41 +------------- radio/src/thirdparty/libopenui/src/window.cpp | 55 ++++++++++++++----- radio/src/thirdparty/libopenui/src/window.h | 8 +-- 3 files changed, 49 insertions(+), 55 deletions(-) diff --git a/radio/src/thirdparty/libopenui/src/mainwindow.cpp b/radio/src/thirdparty/libopenui/src/mainwindow.cpp index aa9a28e37..51f4f913b 100644 --- a/radio/src/thirdparty/libopenui/src/mainwindow.cpp +++ b/radio/src/thirdparty/libopenui/src/mainwindow.cpp @@ -20,6 +20,8 @@ #include "mainwindow.h" #include "keyboard_base.h" +#include "lvgl/lvgl.h" + #if defined(HARDWARE_TOUCH) #include "touch.h" #endif @@ -28,12 +30,10 @@ TouchState touchState; #endif -static LvglWidgetFactory mainWindowFactory = { lv_obj_create, nullptr }; - MainWindow * MainWindow::_instance = nullptr; MainWindow::MainWindow() : - Window(nullptr, {0, 0, LCD_W, LCD_H}, 0, 0, &mainWindowFactory), + Window(nullptr, {0, 0, LCD_W, LCD_H}), invalidatedRect(rect) { Layer::push(this); @@ -93,37 +93,6 @@ void MainWindow::invalidate(const rect_t & rect) invalidatedRect = rect; } } -#include "lvgl/lvgl.h" -extern lv_obj_t * canvas; -extern BitmapBuffer canBuf; -bool MainWindow::refresh() -{ - if (invalidatedRect.w) { - canBuf.setOffset(0, 0); - canBuf.setClippingRect(0,LCD_W,0, LCD_H); - fullPaint(&canBuf); - lv_obj_invalidate(canvas); - } - return false; - - if (invalidatedRect.w) { - if (invalidatedRect.x > 0 || invalidatedRect.y > 0 || invalidatedRect.w < LCD_W || invalidatedRect.h < LCD_H) { - TRACE_WINDOWS("Refresh rect: left=%d top=%d width=%d height=%d", invalidatedRect.left(), invalidatedRect.top(), invalidatedRect.w, invalidatedRect.h); - lcdCopy(lcd->getData(), lcdFront->getData()); - } - else { - TRACE_WINDOWS("Refresh full screen"); - } - lcd->setOffset(0, 0); - lcd->setClippingRect(invalidatedRect.left(), invalidatedRect.right(), invalidatedRect.top(), invalidatedRect.bottom()); - fullPaint(lcd); - invalidatedRect.w = 0; - return true; - } - else { - return false; - } -} void MainWindow::run(bool trash) { @@ -138,10 +107,6 @@ void MainWindow::run(bool trash) emptyTrash(); } - if (refresh()) { - lcdRefresh(); - } - auto delta = ticksNow() - start; if (delta > 10 * SYSTEM_TICKS_1MS) { TRACE_WINDOWS("MainWindow::run took %dms", (ticksNow() - start) / SYSTEM_TICKS_1MS); diff --git a/radio/src/thirdparty/libopenui/src/window.cpp b/radio/src/thirdparty/libopenui/src/window.cpp index 282a7d97e..260a38448 100644 --- a/radio/src/thirdparty/libopenui/src/window.cpp +++ b/radio/src/thirdparty/libopenui/src/window.cpp @@ -37,14 +37,39 @@ 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_DELETE || + window->deleted()) return; if (code == LV_EVENT_GET_SELF_SIZE) { + lv_point_t *p = (lv_point_t *)lv_event_get_param(e); if (p->x >= 0) { p->x = window->getInnerWidth(); } if (p->y >= 0) { p->y = window->getInnerHeight(); } + } else if (code == LV_EVENT_DRAW_MAIN) { + + lv_draw_ctx_t* draw_ctx = lv_event_get_draw_ctx(e); + + lv_area_t a, clipping, obj_coords; + lv_area_copy(&a, draw_ctx->buf_area); + lv_area_copy(&clipping, draw_ctx->clip_area); + lv_obj_get_coords(target, &obj_coords); + + auto w = a.x2 - a.x1 + 1; + auto h = a.y2 - a.y1 + 1; + TRACE_WINDOWS("DRAW_MAIN %s", window->getWindowDebugString().c_str()); + + BitmapBuffer buf = {BMP_RGB565, (uint16_t)w, (uint16_t)h, + (uint16_t *)draw_ctx->buf}; + + buf.setOffset(obj_coords.x1 - a.x1, obj_coords.y1 - a.y1); + buf.setClippingRect(clipping.x1 - a.x1, clipping.x2 + 1 - a.x1, + clipping.y1 - a.y1, clipping.y2 + 1 - a.y1); + + window->paint(&buf); + } else if (code == LV_EVENT_PRESSED || code == LV_EVENT_RELEASED) { TRACE_WINDOWS("PRESSED: %s", window->getWindowDebugString().c_str()); @@ -86,12 +111,16 @@ static void window_event_cb(lv_event_t * e) window->onTouchEnd(rel_pos.x, rel_pos.y); } } else if (code == LV_EVENT_SCROLL) { + lv_coord_t scroll_y = lv_obj_get_scroll_y(target); lv_coord_t scroll_x = lv_obj_get_scroll_x(target); + TRACE_WINDOWS("SCROLL[x=%d;y=%d] %s", scroll_x, scroll_y, window->getWindowDebugString().c_str()); + window->setScrollPositionY(scroll_y); window->setScrollPositionX(scroll_x); + } else if (code == LV_EVENT_SCROLL_BEGIN) { TRACE("SCROLL_BEGIN"); is_scrolling = true; @@ -138,6 +167,10 @@ Window::Window(Window *parent, const rect_t &rect, WindowFlags windowFlags, lv_obj_set_size(lvobj, rect.w, rect.h); lv_obj_set_user_data(lvobj, this); + if (windowFlags & OPAQUE) { + lv_obj_set_style_bg_opa(lvobj, LV_OPA_MAX, LV_PART_MAIN); + } + lv_obj_set_scrollbar_mode(lvobj, LV_SCROLLBAR_MODE_OFF); lv_obj_clear_flag(lvobj, LV_OBJ_FLAG_SCROLL_ELASTIC); lv_obj_add_event_cb(lvobj, window_event_cb, LV_EVENT_ALL, this); @@ -154,7 +187,7 @@ Window::Window(Window *parent, const rect_t &rect, WindowFlags windowFlags, lv_obj_clear_flag(lvobj, LV_OBJ_FLAG_CLICK_FOCUSABLE); } } -extern lv_obj_t * canvas; + Window::~Window() { TRACE_WINDOWS("Destroy %p %s", this, getWindowDebugString().c_str()); @@ -162,22 +195,19 @@ Window::~Window() focusWindow = nullptr; } - if(children.size() > 0) - deleteChildren(); - if (lvobj != nullptr && lvobj != canvas) - { + if (children.size() > 0) deleteChildren(); + + if (lvobj != nullptr) { lv_obj_del(lvobj); lvobj = nullptr; } - } -void Window::attach(Window * newParent) +void Window::attach(Window *newParent) { if (parent) detach(); parent = newParent; - if (newParent) - { + if (newParent) { newParent->addChild(this); } } @@ -187,6 +217,7 @@ void Window::detach() if (parent) { parent->removeChild(this); parent = nullptr; + // if (lvobj != nullptr) lv_obj_set_parent(lvobj, nullptr); } } @@ -613,9 +644,7 @@ void Window::moveWindowsTop(coord_t y, coord_t delta) void Window::invalidate(const rect_t & rect) { - if (isVisible()) { - parent->invalidate({this->rect.x + rect.x - parent->scrollPositionX, this->rect.y + rect.y - parent->scrollPositionY, rect.w, rect.h}); - } + if (lvobj) lv_obj_invalidate(lvobj); } void Window::drawVerticalScrollbar(BitmapBuffer * dc) diff --git a/radio/src/thirdparty/libopenui/src/window.h b/radio/src/thirdparty/libopenui/src/window.h index 5a3d9339e..78e5c148b 100644 --- a/radio/src/thirdparty/libopenui/src/window.h +++ b/radio/src/thirdparty/libopenui/src/window.h @@ -405,6 +405,10 @@ class Window return _deleted; } + virtual void paint(BitmapBuffer *) + { + } + #if defined(HARDWARE_TOUCH) virtual bool onTouchStart(coord_t x, coord_t y); virtual bool onTouchEnd(coord_t x, coord_t y); @@ -463,10 +467,6 @@ class Window void fullPaint(BitmapBuffer * dc); - virtual void paint(BitmapBuffer *) - { - } - virtual void onFocusLost() { TRACE_WINDOWS("%s onFocusLost()", getWindowDebugString().c_str());