feat(color): delay image load on manage models page (#5146)

This commit is contained in:
philmoz
2024-06-13 10:31:39 +10:00
committed by GitHub
parent b644aadbaa
commit 7aeb8a4898
4 changed files with 64 additions and 27 deletions
+59 -24
View File
@@ -36,7 +36,6 @@ inline tmr10ms_t getTicks() { return g_tmr10ms; }
struct ModelButtonLayout {
uint16_t width;
uint16_t height;
uint16_t padding;
bool hasImage;
uint16_t font;
uint16_t columns;
@@ -49,10 +48,10 @@ static LAYOUT_VAL(L1_H, 61, 61)
static LAYOUT_VAL(L3_W, 336, 300)
ModelButtonLayout modelLayouts[] = {
{L0_W, L0_H, PAD_SMALL, true, FONT(STD), 2},
{L1_W, L1_H, PAD_SMALL, true, FONT(XS), 3},
{L0_W, EdgeTxStyles::UI_ELEMENT_HEIGHT, PAD_SMALL, false, FONT(STD), 2},
{L3_W, EdgeTxStyles::UI_ELEMENT_HEIGHT, PAD_SMALL, false, FONT(STD), 1},
{L0_W, L0_H, true, FONT(STD), 2},
{L1_W, L1_H, true, FONT(XS), 3},
{L0_W, EdgeTxStyles::UI_ELEMENT_HEIGHT, false, FONT(STD), 2},
{L3_W, EdgeTxStyles::UI_ELEMENT_HEIGHT, false, FONT(STD), 1},
};
class ModelButton : public Button
@@ -81,42 +80,29 @@ class ModelButton : public Button
? COLOR_THEME_ACTIVE_INDEX
: COLOR_THEME_PRIMARY2_INDEX;
coord_t w = width() - 8;
coord_t h = height() - 8;
coord_t w = width() - PAD_SMALL * 2;
LcdFlags font = modelLayouts[layout].font;
if ((getTextWidth(modelCell->modelName, 0, font) > w))
font = (font == FONT(STD)) ? FONT(XS) : FONT(XXS);
if (modelLayouts[layout].hasImage) {
GET_FILENAME(filename, BITMAPS_PATH, modelCell->modelBitmap, "");
auto bitmap = new StaticBitmap(this, {2, 2, w, h}, COLOR(bg_col_idx), filename);
bitmap->show(bitmap->hasImage());
if (modelCell->modelBitmap[0] == 0)
showNoImgMsg();
if (!bitmap->hasImage()) {
std::string errorMsg = "(";
errorMsg += STR_NO_PICTURE;
errorMsg += ")";
new StaticText(this, {2, h / 2, w, 17}, errorMsg,
CENTERED | COLOR_THEME_SECONDARY1 | FONT(XS));
}
coord_t fh = (font == FONT(STD)) ? 17 : (font == FONT(XS)) ? 14 : 11;
coord_t fh = getFontHeight(font) - ((font == FONT(STD)) ? 4 : (font == FONT(XS)) ? 3 : 1);
coord_t fo = (font == FONT(STD)) ? -3 : (font == FONT(XS)) ? -3 : -1;
auto name = new StaticText(this, {2, 2, w, fh}, modelCell->modelName,
auto name = new StaticText(this, {PAD_TINY, PAD_TINY, w, fh}, modelCell->modelName,
CENTERED | COLOR_THEME_SECONDARY1 | font);
lv_label_set_long_mode(name->getLvObj(), LV_LABEL_LONG_DOT);
name->setWidth(w);
name->setHeight(fh);
etx_bg_color(name->getLvObj(), (LcdColorIndex)bg_col_idx);
etx_obj_add_style(name->getLvObj(), styles->bg_opacity_75, LV_PART_MAIN);
name->padTop(fo);
} else {
auto name = new StaticText(this, {2, 4, w, 24}, modelCell->modelName,
auto name = new StaticText(this, {PAD_TINY, PAD_SMALL, w, EdgeTxStyles::PAGE_LINE_HEIGHT}, modelCell->modelName,
COLOR_THEME_SECONDARY1 | font);
lv_label_set_long_mode(name->getLvObj(), LV_LABEL_LONG_DOT);
name->setWidth(w);
}
lv_obj_update_layout(lvobj);
@@ -145,12 +131,52 @@ class ModelButton : public Button
}
}
bool loadImage()
{
if (loaded && !imgLoaded) {
imgLoaded = true;
coord_t w = width() - PAD_SMALL * 2;
coord_t h = height() - PAD_SMALL * 2;
if (modelLayouts[layout].hasImage) {
if (modelCell->modelBitmap[0]) {
GET_FILENAME(filename, BITMAPS_PATH, modelCell->modelBitmap, "");
auto bitmap = new StaticImage(this, {PAD_TINY, PAD_TINY, w, h}, filename, true);
lv_obj_move_background(bitmap->getLvObj());
bitmap->show(bitmap->hasImage());
if (bitmap->hasImage()) {
return true;
}
}
showNoImgMsg();
}
return false;
}
return false;
}
protected:
bool loaded = false;
bool imgLoaded = false;
uint8_t layout;
ModelCell *modelCell;
std::function<void()> m_setSelected = nullptr;
void showNoImgMsg()
{
coord_t w = width() - PAD_SMALL * 2;
coord_t h = height() - PAD_SMALL * 2;
std::string errorMsg = "(";
errorMsg += STR_NO_PICTURE;
errorMsg += ")";
LcdFlags font = (modelLayouts[layout].font == FONT(STD)) ? FONT(XS) : FONT(XXS);
new StaticText(this, {PAD_TINY, h / 2, w, getFontHeight(font)}, errorMsg,
CENTERED | COLOR_THEME_SECONDARY1 | font);
}
void onClicked() override
{
setFocused();
@@ -264,6 +290,15 @@ class ModelsPageBody : public Window
ModelCell *focusedModel = nullptr;
std::function<void()> refreshLabels = nullptr;
void checkEvents() override
{
for (auto c : children) {
if (((ModelButton*)c)->loadImage()) {
return;
}
}
}
void openMenu()
{
Menu *menu = new Menu(this);
@@ -16,6 +16,8 @@
* GNU General Public License for more details.
*/
#pragma GCC optimize("O3")
#include "bitmapbuffer.h"
#include "libopenui_file.h"
#include "opentx_helpers.h"
+2 -2
View File
@@ -183,8 +183,8 @@ void StaticIcon::center(coord_t w, coord_t h)
// Display image from file system using LVGL with LVGL scaling
// - LVGL scaling is slow so don't use this if there are many images
StaticImage::StaticImage(Window* parent, const rect_t& rect,
const char* filename) :
Window(parent, rect)
const char* filename, bool dontEnlarge) :
Window(parent, rect), dontEnlarge(dontEnlarge)
{
setWindowFlag(NO_FOCUS);
+1 -1
View File
@@ -142,7 +142,7 @@ class StaticImage : public Window
{
public:
StaticImage(Window *parent, const rect_t &rect,
const char *filename = nullptr);
const char *filename = nullptr, bool dontEnlarge = false);
#if defined(DEBUG_WINDOWS)
std::string getName() const override { return "StaticImage"; }