diff --git a/radio/src/gui/colorlcd/widgets/modelbmp.cpp b/radio/src/gui/colorlcd/widgets/modelbmp.cpp index 43bd75ccc..b66313807 100644 --- a/radio/src/gui/colorlcd/widgets/modelbmp.cpp +++ b/radio/src/gui/colorlcd/widgets/modelbmp.cpp @@ -24,43 +24,15 @@ class ModelBitmapWidget: public Widget { public: ModelBitmapWidget(const WidgetFactory * factory, FormGroup * parent, const rect_t & rect, Widget::PersistentData * persistentData): - Widget(factory, parent, rect, persistentData), - buffer(nullptr), - deps_hash(0) + Widget(factory, parent, rect, persistentData) { - } - - ~ModelBitmapWidget() override - { - delete buffer; + loadBitmap(); } void paint(BitmapBuffer * dc) override { - delete buffer; - buffer = new BitmapBuffer(BMP_RGB565, rect.w, rect.h); - - if (buffer) { - buffer->drawBitmap(0, 0, lcd, rect.x, rect.y, rect.w, rect.h); - GET_FILENAME(filename, BITMAPS_PATH, g_model.header.bitmap, ""); - BitmapBuffer * bitmap = BitmapBuffer::loadBitmap(filename); - if (rect.h >= 96 && rect.w >= 120) { - buffer->drawFilledRect(0, 0, rect.w, rect.h, SOLID, MAINVIEW_PANES_COLOR | OPACITY(5)); - static BitmapBuffer * icon = BitmapBuffer::loadMask(OpenTxTheme::instance()->getFilePath("mask_menu_model.png")); - buffer->drawMask(6, 4, icon, MAINVIEW_GRAPHICS_COLOR); - buffer->drawSizedText(45, 10, g_model.header.name, LEN_MODEL_NAME, FONT(XS)); - buffer->drawSolidFilledRect(39, 27, rect.w - 48, 2, MAINVIEW_GRAPHICS_COLOR); - if (bitmap) { - buffer->drawScaledBitmap(bitmap, 0, 38, rect.w, rect.h - 38); - } - } - else { - if (bitmap) { - buffer->drawScaledBitmap(bitmap, 0, 0, rect.w, rect.h); - } - } - delete bitmap; - } + if (buffer) + dc->drawBitmap(0, 0, buffer.get()); } void checkEvents() override @@ -70,19 +42,51 @@ class ModelBitmapWidget: public Widget uint32_t new_hash = hash(g_model.header.bitmap, sizeof(g_model.header.bitmap)); new_hash ^= hash(g_model.header.name, sizeof(g_model.header.name)); new_hash ^= hash(g_eeGeneral.themeName, sizeof(g_eeGeneral.themeName)); + if (new_hash != deps_hash) { deps_hash = new_hash; - invalidate(); - } - - if (buffer) { - lcd->drawBitmap(rect.x, rect.y, buffer); + loadBitmap(); } } protected: - BitmapBuffer * buffer; - uint32_t deps_hash; + std::unique_ptr buffer; + uint32_t deps_hash = 0; + + void loadBitmap() + { + buffer.reset(new BitmapBuffer(BMP_RGB565, rect.w, rect.h)); + buffer->clear(MAINVIEW_PANES_COLOR); + + std::string filename = std::string(g_model.header.bitmap); + std::string fullpath = std::string(BITMAPS_PATH PATH_SEPARATOR) + filename; + + auto bitmap = std::unique_ptr(BitmapBuffer::loadBitmap(fullpath.c_str())); + if (!bitmap) { + TRACE("could not load bitmap '%s'", filename.c_str()); + return; + } + + // big space to draw + if (rect.h >= 96 && rect.w >= 120) { + + auto iconMask = theme->getIconMask(ICON_MODEL); + if (iconMask) { + buffer->drawMask(6, 4, iconMask, MAINVIEW_GRAPHICS_COLOR); + } + + buffer->drawSizedText(45, 10, g_model.header.name, LEN_MODEL_NAME, FONT(XS)); + buffer->drawSolidFilledRect(39, 27, rect.w - 48, 2, MAINVIEW_GRAPHICS_COLOR); + + if (bitmap) { + buffer->drawScaledBitmap(bitmap.get(), 0, 38, rect.w, rect.h - 38); + } + } + // smaller space to draw + else if (bitmap) { + buffer->drawScaledBitmap(bitmap.get(), 0, 0, rect.w, rect.h); + } + } }; BaseWidgetFactory modelBitmapWidget("ModelBmp", nullptr); diff --git a/radio/src/sdcard.h b/radio/src/sdcard.h index 906679285..e25759d0e 100644 --- a/radio/src/sdcard.h +++ b/radio/src/sdcard.h @@ -27,7 +27,8 @@ #include "opentx.h" -#define ROOT_PATH "/" +#define PATH_SEPARATOR "/" +#define ROOT_PATH PATH_SEPARATOR #define MODELS_PATH ROOT_PATH "MODELS24" // no trailing slash = important //TODO Temporary while working on both 2.3 and 2.4 #define RADIO_PATH ROOT_PATH "RADIO24" // no trailing slash = important #define LOGS_PATH ROOT_PATH "LOGS" @@ -37,27 +38,27 @@ #define SYSTEM_SUBDIR "SYSTEM" #define BITMAPS_PATH ROOT_PATH "IMAGES" #define FIRMWARES_PATH ROOT_PATH "FIRMWARE" -#define AUTOUPDATE_FILENAME FIRMWARES_PATH "/autoupdate.frsk" +#define AUTOUPDATE_FILENAME FIRMWARES_PATH PATH_SEPARATOR "autoupdate.frsk" #define EEPROMS_PATH ROOT_PATH "EEPROM" #define SCRIPTS_PATH ROOT_PATH "SCRIPTS" -#define WIZARD_PATH SCRIPTS_PATH "/WIZARD" +#define WIZARD_PATH SCRIPTS_PATH PATH_SEPARATOR "WIZARD" #define THEMES_PATH ROOT_PATH "THEMES" #define LAYOUTS_PATH ROOT_PATH "LAYOUTS" #define WIDGETS_PATH ROOT_PATH "WIDGETS" #define WIZARD_NAME "wizard.lua" -#define SCRIPTS_MIXES_PATH SCRIPTS_PATH "/MIXES" -#define SCRIPTS_FUNCS_PATH SCRIPTS_PATH "/FUNCTIONS" -#define SCRIPTS_TELEM_PATH SCRIPTS_PATH "/TELEMETRY" -#define SCRIPTS_TOOLS_PATH SCRIPTS_PATH "/TOOLS" +#define SCRIPTS_MIXES_PATH SCRIPTS_PATH PATH_SEPARATOR "MIXES" +#define SCRIPTS_FUNCS_PATH SCRIPTS_PATH PATH_SEPARATOR "FUNCTIONS" +#define SCRIPTS_TELEM_PATH SCRIPTS_PATH PATH_SEPARATOR "TELEMETRY" +#define SCRIPTS_TOOLS_PATH SCRIPTS_PATH PATH_SEPARATOR "TOOLS" #define LEN_FILE_PATH_MAX (sizeof(SCRIPTS_TELEM_PATH)+1) // longest + "/" #if defined(COLORLCD) -const char RADIO_MODELSLIST_PATH[] = RADIO_PATH "/models.txt"; -const char RADIO_SETTINGS_PATH[] = RADIO_PATH "/radio.bin"; +const char RADIO_MODELSLIST_PATH[] = RADIO_PATH PATH_SEPARATOR "models.txt"; +const char RADIO_SETTINGS_PATH[] = RADIO_PATH PATH_SEPARATOR "radio.bin"; #if defined(SDCARD_YAML) -const char RADIO_MODELSLIST_YAML_PATH[] = RADIO_PATH "/models.yml"; -const char RADIO_SETTINGS_YAML_PATH[] = RADIO_PATH "/radio.yml"; +const char RADIO_MODELSLIST_YAML_PATH[] = RADIO_PATH PATH_SEPARATOR "models.yml"; +const char RADIO_SETTINGS_YAML_PATH[] = RADIO_PATH PATH_SEPARATOR "radio.yml"; #endif #define SPLASH_FILE "splash.png" #endif