New Table widget

This commit is contained in:
Bertrand Songis
2019-11-28 17:03:56 +01:00
parent 876e2ea47a
commit 6d2cbf71b6
7 changed files with 233 additions and 18 deletions
+1
View File
@@ -29,6 +29,7 @@ set(LIBOPENUI_SRC
textedit.cpp
coloredit.cpp
progress.cpp
table.cpp
dialog.cpp
message_dialog.cpp
)
+4 -1
View File
@@ -83,7 +83,7 @@
#endif
#define OPACITY_MAX 0x0F
#define OPACITY(x) ((x)<<24)
#define OPACITY(value) ((value) << 24)
#define RGB(r, g, b) (uint16_t)((((r) & 0xF8) << 8) + (((g) & 0xFC) << 3) + (((b) & 0xF8) >> 3))
#define ARGB(a, r, g, b) (uint16_t)((((a) & 0xF0) << 8) + (((r) & 0xF0) << 4) + (((g) & 0xF0) << 0) + (((b) & 0xF0) >> 4))
@@ -101,9 +101,12 @@
#define SCROLLBAR_COLOR COLOR(SCROLLBAR_COLOR_INDEX)
#define MENU_COLOR COLOR(MENU_COLOR_INDEX)
#define MENU_BGCOLOR COLOR(MENU_BGCOLOR_INDEX)
#define MENU_TITLE_BGCOLOR COLOR(MENU_TITLE_BGCOLOR_INDEX)
#define MENU_LINE_COLOR COLOR(MENU_LINE_COLOR_INDEX)
#define MENU_HIGHLIGHT_COLOR COLOR(MENU_HIGHLIGHT_COLOR_INDEX)
#define MENU_HIGHLIGHT_BGCOLOR COLOR(MENU_HIGHLIGHT_BGCOLOR_INDEX)
#define TABLE_BGCOLOR COLOR(TABLE_BGCOLOR_INDEX)
#define TABLE_HEADER_BGCOLOR COLOR(TABLE_HEADER_BGCOLOR_INDEX)
#define CUSTOM_COLOR COLOR(CUSTOM_COLOR_INDEX)
#endif
-1
View File
@@ -107,4 +107,3 @@ FRESULT sdReadDir(DIR * dir, FILINFO * fno, bool & firstTime)
firstTime = false;
return res;
}
+15 -2
View File
@@ -67,6 +67,11 @@ class Subtitle: public StaticText {
class StaticBitmap: public Window {
public:
StaticBitmap(Window * parent, const rect_t & rect):
Window(parent, rect)
{
}
StaticBitmap(Window * parent, const rect_t & rect, const char * filename):
Window(parent, rect),
bitmap(BitmapBuffer::loadBitmap(filename))
@@ -79,6 +84,12 @@ class StaticBitmap: public Window {
{
}
void setBitmap(const char * filename)
{
bitmap = BitmapBuffer::loadBitmap(filename);
invalidate();
}
#if defined(DEBUG_WINDOWS)
std::string getName() override
{
@@ -88,11 +99,13 @@ class StaticBitmap: public Window {
void paint(BitmapBuffer * dc) override
{
dc->drawBitmap(0, 0, bitmap);
if (bitmap) {
dc->drawBitmap((width() - bitmap->width()) / 2, (height() - bitmap->height()) / 2, bitmap);
}
}
protected:
const BitmapBuffer * bitmap;
const BitmapBuffer * bitmap = nullptr;
};
#endif
+50
View File
@@ -0,0 +1,50 @@
/*
* Copyright (C) OpenTX
*
* Source:
* https://github.com/opentx/libopenui
*
* This file is a part of libopenui library.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*/
#include "table.h"
#include "font.h"
void Table::Header::paint(BitmapBuffer * dc)
{
coord_t x = 10;
if (!header.values.empty()) {
dc->clear(TABLE_HEADER_BGCOLOR);
for (auto &value: header.values) {
dc->drawText(x, (TABLE_LINE_HEIGHT - getFontHeight(TABLE_HEADER_FONT)) / 2, value.c_str(), TABLE_HEADER_FONT);
x += 200;
}
}
}
void Table::Body::paint(BitmapBuffer * dc)
{
coord_t y = 0;
coord_t x;
int index = 0;
for (auto &line: lines) {
dc->drawSolidFilledRect(0, y, width(), TABLE_LINE_HEIGHT - 2, index == selection ? FOCUS_BGCOLOR : TABLE_BGCOLOR);
x = 10;
for (auto &value: line.values) {
dc->drawText(x, y + (TABLE_LINE_HEIGHT - getFontHeight(TABLE_BODY_FONT)) / 2 + 3, value.c_str(), TABLE_BODY_FONT | (index == selection ? FOCUS_COLOR : DEFAULT_COLOR));
x += 200;
}
y += TABLE_LINE_HEIGHT;
index += 1;
}
}
+157
View File
@@ -0,0 +1,157 @@
/*
* Copyright (C) OpenTX
*
* Source:
* https://github.com/opentx/libopenui
*
* This file is a part of libopenui library.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*/
#ifndef _TABLE_H_
#define _TABLE_H_
#include "window.h"
#include <vector>
constexpr coord_t TABLE_LINE_HEIGHT = 50;
constexpr coord_t TABLE_HEADER_HEIGHT = 48;
class Table: public Window {
class Line {
public:
std::list<std::string> values;
std::function<void()> onPress;
};
class Header: public Window {
public:
Header(Window * parent, const rect_t & rect):
Window(parent, rect, OPAQUE)
{
}
void setLine(const Line & line)
{
header = line;
}
void paint(BitmapBuffer * dc) override;
protected:
Line header;
};
class Body: public Window {
friend class Table;
public:
Body(Window * parent, const rect_t & rect):
Window(parent, rect, OPAQUE)
{
}
void addLine(const Line & line)
{
lines.push_back(line);
setInnerHeight(lines.size() * TABLE_LINE_HEIGHT - 2);
}
void clear()
{
lines.clear();
}
void paint(BitmapBuffer * dc) override;
#if defined(HARDWARE_TOUCH)
bool onTouchEnd(coord_t x, coord_t y)
{
unsigned index = y / TABLE_LINE_HEIGHT;
auto onPress = lines[index].onPress;
if (onPress)
onPress();
return true;
}
#endif
protected:
std::vector<Line> lines;
int selection = -1;
};
public:
Table(Window * parent, const rect_t & rect, uint8_t columnsCount):
Window(parent, rect),
header(this, {0, 0, width(), TABLE_HEADER_HEIGHT}),
body(this, {0, TABLE_HEADER_HEIGHT, width(), height() - TABLE_HEADER_HEIGHT})
{
setColumnsCount(columnsCount);
}
~Table() override
{
header.detach();
body.detach();
}
void setColumnsCount(uint8_t value)
{
count = value;
}
int getSelection() const
{
return body.selection;
}
void setSelection(int index, bool scroll = false)
{
body.selection = index;
if (scroll) {
body.setScrollPositionY(index * TABLE_LINE_HEIGHT);
}
body.invalidate();
}
void setHeader(const char * values[])
{
Line line;
for (uint8_t i = 0; i < count; i++) {
line.values.push_back(values[i]);
}
header.setLine(line);
}
void addLine(const char * values[], std::function<void()> onPress = nullptr)
{
Line line;
for (uint8_t i = 0; i < count; i++) {
line.values.push_back(values[i]);
}
line.onPress = onPress;
body.addLine(line);
}
void clear()
{
body.clear();
}
protected:
uint8_t count = 1;
Header header;
Body body;
};
#endif // _TABLE_H_
+6 -14
View File
@@ -405,20 +405,12 @@ void Window::invalidate(const rect_t & rect)
void Window::drawVerticalScrollbar(BitmapBuffer * dc)
{
if (innerHeight > rect.h) {
coord_t x = rect.w - 3;
coord_t y = scrollPositionY + 3;
coord_t h = rect.h - 6;
// lcd->drawSolidFilledRect(x, y, 1, h, LINE_COLOR);
coord_t yofs = (h*scrollPositionY + innerHeight/2) / innerHeight;
coord_t yhgt = (h*rect.h + innerHeight/2) / innerHeight;
if (yhgt + yofs > h)
yhgt = h - yofs;
if (yhgt < 15) {
coord_t yofs = divRoundClosest(rect.h * scrollPositionY, innerHeight);
coord_t yhgt = divRoundClosest(rect.h * rect.h, innerHeight);
if (yhgt < 15)
yhgt = 15;
if (y + yofs + yhgt > innerHeight) {
yofs = innerHeight - y - yhgt;
}
}
dc->drawSolidFilledRect(x-1, y + yofs, 3, yhgt, SCROLLBAR_COLOR);
if (yhgt + yofs > rect.h)
yhgt = rect.h - yofs;
dc->drawSolidFilledRect(rect.w - SCROLLBAR_WIDTH, scrollPositionY + yofs, SCROLLBAR_WIDTH, yhgt, SCROLLBAR_COLOR);
}
}