LVGL drawing
This commit is contained in:
committed by
Raphael Coeffic
parent
ac5a7bef0d
commit
fe7d425ced
+3
-38
@@ -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);
|
||||
|
||||
+42
-13
@@ -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)
|
||||
|
||||
+4
-4
@@ -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());
|
||||
|
||||
Reference in New Issue
Block a user