Menu black overlay fix (need to give the pointer of the current window)

This commit is contained in:
Bertrand Songis
2019-12-13 20:53:53 +01:00
parent 7eb6d028e3
commit b41263a0fc
16 changed files with 86 additions and 108 deletions
+9 -14
View File
@@ -17,7 +17,6 @@
* Lesser General Public License for more details. * Lesser General Public License for more details.
*/ */
#include <math.h>
#include "bitmapbuffer.h" #include "bitmapbuffer.h"
#include "libopenui_depends.h" #include "libopenui_depends.h"
#include "libopenui_globals.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) if (x + w > xmax)
w = xmax - x; w = xmax - x;
for (coord_t i=y; i<y+h; i++) { for (coord_t i = y; i < y + h; i++) {
if ((att & ROUND) && (i==y || i==y+h-1)) drawHorizontalLine(x, i, w, pat, att);
drawHorizontalLine(x+1, i, w-2, pat, att);
else
drawHorizontalLine(x, i, w, pat, att);
} }
} }
// //
//void BitmapBuffer::invertRect(coord_t x, coord_t y, coord_t w, coord_t h, LcdFlags att) //void BitmapBuffer::invertRect(coord_t x, coord_t y, coord_t w, coord_t h, LcdFlags att)
//{ //{
@@ -309,9 +306,8 @@ void BitmapBuffer::drawFilledRect(coord_t x, coord_t y, coord_t w, coord_t h, ui
void BitmapBuffer::drawMask(coord_t x, coord_t y, const BitmapBuffer * mask, LcdFlags flags, coord_t offset, coord_t width) void BitmapBuffer::drawMask(coord_t x, coord_t y, const BitmapBuffer * mask, LcdFlags flags, coord_t offset, coord_t width)
{ {
if (mask == nullptr) { if (!mask)
return; return;
}
APPLY_OFFSET(); APPLY_OFFSET();
@@ -326,15 +322,14 @@ void BitmapBuffer::drawMask(coord_t x, coord_t y, const BitmapBuffer * mask, Lcd
width = xmax - x; width = xmax - x;
} }
if (x < 0) { if (x < xmin) {
width += x; width += x - xmin;
offset -= x; offset -= x + xmin;
x = 0; x = xmin;
} }
if (y >= 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; return;
}
pixel_t color = lcdColorTable[COLOR_IDX(flags)]; pixel_t color = lcdColorTable[COLOR_IDX(flags)];
+8 -8
View File
@@ -390,12 +390,12 @@ class BitmapBuffer: public BitmapBufferBase<uint16_t>
template<class T> template<class T>
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) 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(); APPLY_OFFSET();
if (x >= xmax) return; if (x >= xmax || y >= ymax)
if (y >= ymax) return;
if (!data || !bmp)
return; return;
coord_t srcw = bmp->width(); coord_t srcw = bmp->width();
@@ -411,14 +411,14 @@ class BitmapBuffer: public BitmapBufferBase<uint16_t>
h = srch - srcy; h = srch - srcy;
if (x < xmin) { if (x < xmin) {
w += x-xmin; w += x - xmin;
srcx -= x-xmin; srcx -= x - xmin;
x = xmin; x = xmin;
} }
if (y < ymin) { if (y < ymin) {
h += y-ymin; h += y - ymin;
srcy -= y-ymin; srcy -= y - ymin;
y = ymin; y = ymin;
} }
+1 -1
View File
@@ -54,7 +54,7 @@ void Choice::onEvent(event_t event)
void Choice::openMenu() void Choice::openMenu()
{ {
auto menu = new Menu(); auto menu = new Menu(this);
if (!menuTitle.empty()) if (!menuTitle.empty())
menu->setTitle(menuTitle); menu->setTitle(menuTitle);
+2 -2
View File
@@ -29,8 +29,8 @@ DialogWindowContent::DialogWindowContent(Dialog * parent, const rect_t & rect):
} }
Dialog::Dialog(std::string title, const rect_t & rect): Dialog::Dialog(Window * parent, std::string title, const rect_t & rect):
ModalWindow(), ModalWindow(parent),
content(createDialogWindow(this, rect)) content(createDialogWindow(this, rect))
{ {
bringToTop(); bringToTop();
+1 -8
View File
@@ -49,14 +49,7 @@ class DialogWindowContent: public ModalWindowContent {
class Dialog: public ModalWindow { class Dialog: public ModalWindow {
public: public:
Dialog(std::string title, const rect_t & rect); Dialog(Window * parent, std::string title, const rect_t & rect);
#if defined(DEBUG_WINDOWS)
std::string getName() override
{
return "Dialog";
}
#endif
protected: protected:
DialogWindowContent * content; DialogWindowContent * content;
+2 -2
View File
@@ -87,7 +87,7 @@ bool FileChoice::openMenu()
files.push_front(""); files.push_front("");
auto menu = new Menu(); auto menu = new Menu(this);
int count = 0; int count = 0;
int current = -1; int current = -1;
std::string value = getValue(); 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; return false;
} }
@@ -38,9 +38,6 @@
#define PREC2 0x30 #define PREC2 0x30
#define MODE(flags) ((((int8_t)(flags) & 0x30) - 0x10) >> 4) #define MODE(flags) ((((int8_t)(flags) & 0x30) - 0x10) >> 4)
/* rect, square flags */
#define ROUND 0x04
/* telemetry flags */ /* telemetry flags */
#define NO_UNIT 0x40 #define NO_UNIT 0x40
+4 -4
View File
@@ -108,8 +108,8 @@ void MenuWindowContent::paint(BitmapBuffer * dc)
} }
} }
Menu::Menu(): Menu::Menu(Window * parent):
ModalWindow(), ModalWindow(parent),
content(createMenuWindow(this)) content(createMenuWindow(this))
{ {
} }
@@ -128,9 +128,9 @@ void Menu::updatePosition()
content->body.setInnerHeight(content->body.lines.size() * MENUS_LINE_HEIGHT - 1); 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(); updatePosition();
} }
+2 -9
View File
@@ -136,20 +136,13 @@ class MenuWindowContent: public ModalWindowContent {
class Menu: public ModalWindow { class Menu: public ModalWindow {
public: public:
Menu(); explicit Menu(Window * parent);
void setCancelHandler(std::function<void()> handler) void setCancelHandler(std::function<void()> handler)
{ {
content->body.setCancelHandler(handler); content->body.setCancelHandler(handler);
} }
#if defined(DEBUG_WINDOWS)
std::string getName() override
{
return "Menu";
}
#endif
void setToolbar(Window * window) void setToolbar(Window * window)
{ {
toolbar = window; toolbar = window;
@@ -158,7 +151,7 @@ class Menu: public ModalWindow {
content->setHeight(toolbar->height()); content->setHeight(toolbar->height());
} }
void setTitle(const std::string text); void setTitle(std::string text);
void addLine(const std::string & text, std::function<void()> onPress); void addLine(const std::string & text, std::function<void()> onPress);
+2 -2
View File
@@ -138,7 +138,7 @@ class MenuToolbar: public FormGroup {
std::list<Window *>::iterator current = children.end(); std::list<Window *>::iterator current = children.end();
T * choice; T * choice;
Menu * menu; Menu * menu;
coord_t y = 0; // TODO NV14 was 5; coord_t y = 0;
void addButton(char picto, int16_t filtermin, int16_t filtermax) void addButton(char picto, int16_t filtermin, int16_t filtermax)
{ {
@@ -164,7 +164,7 @@ class MenuToolbar: public FormGroup {
return 1; return 1;
}); });
y += 30; y += MENUS_TOOLBAR_BUTTON_WIDTH;
setInnerHeight(y); setInnerHeight(y);
} }
+2 -13
View File
@@ -19,11 +19,10 @@
#include "modal_window.h" #include "modal_window.h"
#include "mainwindow.h"
#include "font.h" #include "font.h"
ModalWindow::ModalWindow(): ModalWindow::ModalWindow(Window * parent):
Window(&mainWindow, {0, 0, LCD_W, LCD_H}) Window(parent->getFullScreenWindow(), {0, 0, LCD_W, LCD_H})
#if !defined(HARDWARE_TOUCH) #if !defined(HARDWARE_TOUCH)
, previousFocus(focusWindow) , previousFocus(focusWindow)
#endif #endif
@@ -40,14 +39,4 @@ void ModalWindowContent::paint(BitmapBuffer * dc)
dc->drawSolidFilledRect(0, 0, width(), POPUP_HEADER_HEIGHT, FOCUS_BGCOLOR); 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->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); 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);
}*/
} }
+1 -1
View File
@@ -25,7 +25,7 @@
class ModalWindow: public Window class ModalWindow: public Window
{ {
public: public:
ModalWindow(); explicit ModalWindow(Window * parent);
#if defined(DEBUG_WINDOWS) #if defined(DEBUG_WINDOWS)
std::string getName() override std::string getName() override
+2 -2
View File
@@ -121,7 +121,7 @@ class Table: public Window {
body.invalidate(); body.invalidate();
} }
void setHeader(const char * values[]) void setHeader(const char * const values[])
{ {
Line line; Line line;
for (uint8_t i = 0; i < count; i++) { for (uint8_t i = 0; i < count; i++) {
@@ -130,7 +130,7 @@ class Table: public Window {
header.setLine(line); header.setLine(line);
} }
void addLine(const char * values[], std::function<void()> onPress = nullptr) void addLine(const char * const values[], std::function<void()> onPress = nullptr)
{ {
Line line; Line line;
for (uint8_t i = 0; i < count; i++) { for (uint8_t i = 0; i < count; i++) {
+3 -3
View File
@@ -33,10 +33,10 @@ void TextEdit::paint(BitmapBuffer * dc)
dc->drawSizedText(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, value, length, FOCUS_COLOR); dc->drawSizedText(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, value, length, FOCUS_COLOR);
coord_t left = (cursorPos == 0 ? 0 : getTextWidth(value, cursorPos)); coord_t left = (cursorPos == 0 ? 0 : getTextWidth(value, cursorPos));
#if defined(HARDWARE_TOUCH) #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 #else
char s[] = { value[cursorPos], '\0' }; 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); dc->drawText(FIELD_PADDING_LEFT + left, FIELD_PADDING_TOP, s, DEFAULT_COLOR);
#endif #endif
} }
@@ -193,7 +193,7 @@ bool TextEdit::onTouchEnd(coord_t x, coord_t y)
char c = value[cursorPos]; char c = value[cursorPos];
if (c == '\0') if (c == '\0')
break; break;
uint8_t w = getCharWidth(c, fontspecsTable[0]); uint8_t w = getCharWidth(c, fontspecsTable[0]) + 1;
if (rest < w) if (rest < w)
break; break;
rest -= w; rest -= w;
+20 -14
View File
@@ -187,26 +187,41 @@ void Window::scrollTo(Window * child)
void Window::fullPaint(BitmapBuffer * dc) 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) { if (windowFlags & PAINT_CHILDREN_FIRST) {
coord_t xmin, xmax, ymin, ymax; coord_t xmin, xmax, ymin, ymax;
coord_t x = dc->getOffsetX(); coord_t x = dc->getOffsetX();
coord_t y = dc->getOffsetY(); coord_t y = dc->getOffsetY();
dc->getClippingRect(xmin, xmax, ymin, ymax); dc->getClippingRect(xmin, xmax, ymin, ymax);
paintChildren(dc); paintChildren(dc, firstChild);
dc->setOffset(x, y); dc->setOffset(x, y);
dc->setClippingRect(xmin, xmax, ymin, ymax); 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)) { if (!(windowFlags & NO_SCROLLBAR)) {
drawVerticalScrollbar(dc); drawVerticalScrollbar(dc);
} }
if (!(windowFlags & PAINT_CHILDREN_FIRST)) { if (!(windowFlags & PAINT_CHILDREN_FIRST)) {
paintChildren(dc); paintChildren(dc, firstChild);
} }
} }
@@ -229,22 +244,13 @@ bool Window::isChildVisible(Window * window)
return false; return false;
} }
void Window::paintChildren(BitmapBuffer * dc) void Window::paintChildren(BitmapBuffer * dc, std::list<Window *>::iterator it)
{ {
coord_t x = dc->getOffsetX(); coord_t x = dc->getOffsetX();
coord_t y = dc->getOffsetY(); coord_t y = dc->getOffsetY();
coord_t xmin, xmax, ymin, ymax; coord_t xmin, xmax, ymin, ymax;
dc->getClippingRect(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++) { for (; it != children.end(); it++) {
auto child = *it; auto child = *it;
+27 -22
View File
@@ -97,6 +97,11 @@ class Window {
return parent; return parent;
} }
Window * getFullScreenWindow()
{
return (width() == LCD_W && height() == LCD_H) ? this : parent->getFullScreenWindow();
}
WindowFlags getWindowFlags() const WindowFlags getWindowFlags() const
{ {
return windowFlags; return windowFlags;
@@ -287,37 +292,15 @@ class Window {
return parent && parent->isChildVisible(this); return parent && parent->isChildVisible(this);
} }
virtual void paint(BitmapBuffer * dc)
{
}
void drawVerticalScrollbar(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) 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); 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); 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(); void adjustInnerHeight();
coord_t adjustHeight(); coord_t adjustHeight();
@@ -371,6 +354,28 @@ class Window {
} }
virtual void invalidate(const rect_t & rect); virtual void invalidate(const rect_t & rect);
void paintChildren(BitmapBuffer * dc, std::list<Window *>::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_ #endif // _WINDOW_H_