diff --git a/radio/sdcard/horus/THEMES/Default/aboutbg.bmp b/radio/sdcard/horus/THEMES/Default/aboutbg.bmp deleted file mode 100644 index 645425cf7..000000000 Binary files a/radio/sdcard/horus/THEMES/Default/aboutbg.bmp and /dev/null differ diff --git a/radio/src/bitmaps/horus/mask_current_bg.png b/radio/sdcard/horus/THEMES/Default/mask_currentmenu_bg.png similarity index 100% rename from radio/src/bitmaps/horus/mask_current_bg.png rename to radio/sdcard/horus/THEMES/Default/mask_currentmenu_bg.png diff --git a/radio/src/bitmaps/horus/mask_current_dot.png b/radio/sdcard/horus/THEMES/Default/mask_currentmenu_dot.png similarity index 100% rename from radio/src/bitmaps/horus/mask_current_dot.png rename to radio/sdcard/horus/THEMES/Default/mask_currentmenu_dot.png diff --git a/radio/sdcard/horus/THEMES/Default/mask_currentmenu_shadow.png b/radio/sdcard/horus/THEMES/Default/mask_currentmenu_shadow.png new file mode 100644 index 000000000..97bf6c577 Binary files /dev/null and b/radio/sdcard/horus/THEMES/Default/mask_currentmenu_shadow.png differ diff --git a/radio/src/bitmaps/horus/mask_library.png b/radio/sdcard/horus/THEMES/Default/mask_library.png similarity index 100% rename from radio/src/bitmaps/horus/mask_library.png rename to radio/sdcard/horus/THEMES/Default/mask_library.png diff --git a/radio/src/bitmaps/horus/mask_menu_model.png b/radio/sdcard/horus/THEMES/Default/mask_menu_model.png similarity index 100% rename from radio/src/bitmaps/horus/mask_menu_model.png rename to radio/sdcard/horus/THEMES/Default/mask_menu_model.png diff --git a/radio/src/bitmaps/horus/mask_menu_radio.png b/radio/sdcard/horus/THEMES/Default/mask_menu_radio.png similarity index 100% rename from radio/src/bitmaps/horus/mask_menu_radio.png rename to radio/sdcard/horus/THEMES/Default/mask_menu_radio.png diff --git a/radio/src/bitmaps/horus/mask_stats.png b/radio/sdcard/horus/THEMES/Default/mask_menu_stats.png similarity index 100% rename from radio/src/bitmaps/horus/mask_stats.png rename to radio/sdcard/horus/THEMES/Default/mask_menu_stats.png diff --git a/radio/src/bitmaps/horus/mask_mainviews.png b/radio/sdcard/horus/THEMES/Default/mask_menu_theme.png similarity index 100% rename from radio/src/bitmaps/horus/mask_mainviews.png rename to radio/sdcard/horus/THEMES/Default/mask_menu_theme.png diff --git a/radio/src/bitmaps/horus/mask_curves.png b/radio/sdcard/horus/THEMES/Default/mask_model_curves.png similarity index 100% rename from radio/src/bitmaps/horus/mask_curves.png rename to radio/sdcard/horus/THEMES/Default/mask_model_curves.png diff --git a/radio/src/bitmaps/horus/mask_flight_modes.png b/radio/sdcard/horus/THEMES/Default/mask_model_flight_modes.png similarity index 100% rename from radio/src/bitmaps/horus/mask_flight_modes.png rename to radio/sdcard/horus/THEMES/Default/mask_model_flight_modes.png diff --git a/radio/src/bitmaps/horus/mask_gvars.png b/radio/sdcard/horus/THEMES/Default/mask_model_gvars.png similarity index 100% rename from radio/src/bitmaps/horus/mask_gvars.png rename to radio/sdcard/horus/THEMES/Default/mask_model_gvars.png diff --git a/radio/src/bitmaps/horus/mask_heli.png b/radio/sdcard/horus/THEMES/Default/mask_model_heli.png similarity index 100% rename from radio/src/bitmaps/horus/mask_heli.png rename to radio/sdcard/horus/THEMES/Default/mask_model_heli.png diff --git a/radio/src/bitmaps/horus/mask_inputs.png b/radio/sdcard/horus/THEMES/Default/mask_model_inputs.png similarity index 100% rename from radio/src/bitmaps/horus/mask_inputs.png rename to radio/sdcard/horus/THEMES/Default/mask_model_inputs.png diff --git a/radio/src/bitmaps/horus/mask_logical_switches.png b/radio/sdcard/horus/THEMES/Default/mask_model_logical_switches.png similarity index 100% rename from radio/src/bitmaps/horus/mask_logical_switches.png rename to radio/sdcard/horus/THEMES/Default/mask_model_logical_switches.png diff --git a/radio/src/bitmaps/horus/mask_lua_scripts.png b/radio/sdcard/horus/THEMES/Default/mask_model_lua_scripts.png similarity index 100% rename from radio/src/bitmaps/horus/mask_lua_scripts.png rename to radio/sdcard/horus/THEMES/Default/mask_model_lua_scripts.png diff --git a/radio/src/bitmaps/horus/mask_mixer.png b/radio/sdcard/horus/THEMES/Default/mask_model_mixer.png similarity index 100% rename from radio/src/bitmaps/horus/mask_mixer.png rename to radio/sdcard/horus/THEMES/Default/mask_model_mixer.png diff --git a/radio/src/bitmaps/horus/mask_outputs.png b/radio/sdcard/horus/THEMES/Default/mask_model_outputs.png similarity index 100% rename from radio/src/bitmaps/horus/mask_outputs.png rename to radio/sdcard/horus/THEMES/Default/mask_model_outputs.png diff --git a/radio/src/bitmaps/horus/mask_model_setup.png b/radio/sdcard/horus/THEMES/Default/mask_model_setup.png similarity index 100% rename from radio/src/bitmaps/horus/mask_model_setup.png rename to radio/sdcard/horus/THEMES/Default/mask_model_setup.png diff --git a/radio/src/bitmaps/horus/mask_special_functions.png b/radio/sdcard/horus/THEMES/Default/mask_model_special_functions.png similarity index 100% rename from radio/src/bitmaps/horus/mask_special_functions.png rename to radio/sdcard/horus/THEMES/Default/mask_model_special_functions.png diff --git a/radio/src/bitmaps/horus/mask_telemetry.png b/radio/sdcard/horus/THEMES/Default/mask_model_telemetry.png similarity index 100% rename from radio/src/bitmaps/horus/mask_telemetry.png rename to radio/sdcard/horus/THEMES/Default/mask_model_telemetry.png diff --git a/radio/src/bitmaps/horus/mask_topmenu_opentx.png b/radio/sdcard/horus/THEMES/Default/mask_opentx.png similarity index 100% rename from radio/src/bitmaps/horus/mask_topmenu_opentx.png rename to radio/sdcard/horus/THEMES/Default/mask_opentx.png diff --git a/radio/src/bitmaps/horus/mask_calibration.png b/radio/sdcard/horus/THEMES/Default/mask_radio_calibration.png similarity index 100% rename from radio/src/bitmaps/horus/mask_calibration.png rename to radio/sdcard/horus/THEMES/Default/mask_radio_calibration.png diff --git a/radio/src/bitmaps/horus/mask_global_functions.png b/radio/sdcard/horus/THEMES/Default/mask_radio_global_functions.png similarity index 100% rename from radio/src/bitmaps/horus/mask_global_functions.png rename to radio/sdcard/horus/THEMES/Default/mask_radio_global_functions.png diff --git a/radio/src/bitmaps/horus/mask_hardware.png b/radio/sdcard/horus/THEMES/Default/mask_radio_hardware.png similarity index 100% rename from radio/src/bitmaps/horus/mask_hardware.png rename to radio/sdcard/horus/THEMES/Default/mask_radio_hardware.png diff --git a/radio/src/bitmaps/horus/mask_sd_browser.png b/radio/sdcard/horus/THEMES/Default/mask_radio_sd_browser.png similarity index 100% rename from radio/src/bitmaps/horus/mask_sd_browser.png rename to radio/sdcard/horus/THEMES/Default/mask_radio_sd_browser.png diff --git a/radio/src/bitmaps/horus/mask_radio_setup.png b/radio/sdcard/horus/THEMES/Default/mask_radio_setup.png similarity index 100% rename from radio/src/bitmaps/horus/mask_radio_setup.png rename to radio/sdcard/horus/THEMES/Default/mask_radio_setup.png diff --git a/radio/src/bitmaps/horus/mask_trainer.png b/radio/sdcard/horus/THEMES/Default/mask_radio_trainer.png similarity index 100% rename from radio/src/bitmaps/horus/mask_trainer.png rename to radio/sdcard/horus/THEMES/Default/mask_radio_trainer.png diff --git a/radio/src/bitmaps/horus/mask_version.png b/radio/sdcard/horus/THEMES/Default/mask_radio_version.png similarity index 100% rename from radio/src/bitmaps/horus/mask_version.png rename to radio/sdcard/horus/THEMES/Default/mask_radio_version.png diff --git a/radio/src/bitmaps/horus/mask_analogs.png b/radio/sdcard/horus/THEMES/Default/mask_stats_analogs.png similarity index 100% rename from radio/src/bitmaps/horus/mask_analogs.png rename to radio/sdcard/horus/THEMES/Default/mask_stats_analogs.png diff --git a/radio/src/bitmaps/horus/mask_stats_debug.png b/radio/sdcard/horus/THEMES/Default/mask_stats_debug.png similarity index 100% rename from radio/src/bitmaps/horus/mask_stats_debug.png rename to radio/sdcard/horus/THEMES/Default/mask_stats_debug.png diff --git a/radio/src/bitmaps/horus/mask_stats_lua.png b/radio/sdcard/horus/THEMES/Default/mask_stats_lua.png similarity index 100% rename from radio/src/bitmaps/horus/mask_stats_lua.png rename to radio/sdcard/horus/THEMES/Default/mask_stats_lua.png diff --git a/radio/src/bitmaps/horus/mask_stats_graph.png b/radio/sdcard/horus/THEMES/Default/mask_stats_throttle_graph.png similarity index 100% rename from radio/src/bitmaps/horus/mask_stats_graph.png rename to radio/sdcard/horus/THEMES/Default/mask_stats_throttle_graph.png diff --git a/radio/src/bitmaps/horus/mask_stats_time.png b/radio/sdcard/horus/THEMES/Default/mask_stats_timers.png similarity index 100% rename from radio/src/bitmaps/horus/mask_stats_time.png rename to radio/sdcard/horus/THEMES/Default/mask_stats_timers.png diff --git a/radio/src/bitmaps/horus/mask_stats_value.png b/radio/sdcard/horus/THEMES/Default/mask_stats_value.png similarity index 100% rename from radio/src/bitmaps/horus/mask_stats_value.png rename to radio/sdcard/horus/THEMES/Default/mask_stats_value.png diff --git a/radio/src/bitmaps/horus/mask_switches.png b/radio/sdcard/horus/THEMES/Default/mask_switches.png similarity index 100% rename from radio/src/bitmaps/horus/mask_switches.png rename to radio/sdcard/horus/THEMES/Default/mask_switches.png diff --git a/radio/src/bitmaps/horus/mask_mainviews_add.png b/radio/sdcard/horus/THEMES/Default/mask_theme_add_view.png similarity index 100% rename from radio/src/bitmaps/horus/mask_mainviews_add.png rename to radio/sdcard/horus/THEMES/Default/mask_theme_add_view.png diff --git a/radio/src/bitmaps/horus/mask_mainviews_topbar.png b/radio/sdcard/horus/THEMES/Default/mask_theme_setup.png similarity index 100% rename from radio/src/bitmaps/horus/mask_mainviews_topbar.png rename to radio/sdcard/horus/THEMES/Default/mask_theme_setup.png diff --git a/radio/src/bitmaps/horus/mask_mainviews_1.png b/radio/sdcard/horus/THEMES/Default/mask_theme_view1.png similarity index 100% rename from radio/src/bitmaps/horus/mask_mainviews_1.png rename to radio/sdcard/horus/THEMES/Default/mask_theme_view1.png diff --git a/radio/src/bitmaps/horus/mask_mainviews_2.png b/radio/sdcard/horus/THEMES/Default/mask_theme_view2.png similarity index 100% rename from radio/src/bitmaps/horus/mask_mainviews_2.png rename to radio/sdcard/horus/THEMES/Default/mask_theme_view2.png diff --git a/radio/src/bitmaps/horus/mask_mainviews_3.png b/radio/sdcard/horus/THEMES/Default/mask_theme_view3.png similarity index 100% rename from radio/src/bitmaps/horus/mask_mainviews_3.png rename to radio/sdcard/horus/THEMES/Default/mask_theme_view3.png diff --git a/radio/src/bitmaps/horus/mask_mainviews_4.png b/radio/sdcard/horus/THEMES/Default/mask_theme_view4.png similarity index 100% rename from radio/src/bitmaps/horus/mask_mainviews_4.png rename to radio/sdcard/horus/THEMES/Default/mask_theme_view4.png diff --git a/radio/src/bitmaps/horus/mask_mainviews_5.png b/radio/sdcard/horus/THEMES/Default/mask_theme_view5.png similarity index 100% rename from radio/src/bitmaps/horus/mask_mainviews_5.png rename to radio/sdcard/horus/THEMES/Default/mask_theme_view5.png diff --git a/radio/src/bitmaps/horus/mask_mainviews_6.png b/radio/sdcard/horus/THEMES/Default/mask_theme_view6.png similarity index 100% rename from radio/src/bitmaps/horus/mask_mainviews_6.png rename to radio/sdcard/horus/THEMES/Default/mask_theme_view6.png diff --git a/radio/src/bitmaps/horus/mask_mainviews_7.png b/radio/sdcard/horus/THEMES/Default/mask_theme_view7.png similarity index 100% rename from radio/src/bitmaps/horus/mask_mainviews_7.png rename to radio/sdcard/horus/THEMES/Default/mask_theme_view7.png diff --git a/radio/src/bitmaps/horus/mask_mainviews_8.png b/radio/sdcard/horus/THEMES/Default/mask_theme_view8.png similarity index 100% rename from radio/src/bitmaps/horus/mask_mainviews_8.png rename to radio/sdcard/horus/THEMES/Default/mask_theme_view8.png diff --git a/radio/src/bitmaps/horus/mainview_flat.png b/radio/src/bitmaps/horus/mainview_flat.png deleted file mode 100644 index 44f8ca652..000000000 Binary files a/radio/src/bitmaps/horus/mainview_flat.png and /dev/null differ diff --git a/radio/src/bitmaps/horus/mask_current_shadow.png b/radio/src/bitmaps/horus/mask_current_shadow.png deleted file mode 100644 index 4632c601f..000000000 Binary files a/radio/src/bitmaps/horus/mask_current_shadow.png and /dev/null differ diff --git a/radio/src/gui/horus/bitmapbuffer.cpp b/radio/src/gui/horus/bitmapbuffer.cpp index cc914ae48..86b05960c 100644 --- a/radio/src/gui/horus/bitmapbuffer.cpp +++ b/radio/src/gui/horus/bitmapbuffer.cpp @@ -222,6 +222,35 @@ void BitmapBuffer::drawPie(int x0, int y0, int radius, int startAngle, int endAn } } +void BitmapBuffer::drawMask(coord_t x, coord_t y, BitmapBuffer * mask, LcdFlags flags, coord_t offset, coord_t width) +{ + if (mask == NULL) { + return; + } + + coord_t w = mask->getWidth(); + coord_t height = mask->getHeight(); + + if (!width || width > w) { + width = w; + } + + if (x+width > this->width) { + width = this->width-x; + } + + display_t color = lcdColorTable[COLOR_IDX(flags)]; + + for (coord_t row=0; rowgetPixelPtr(offset, row); + for (coord_t col=0; colgetData(); + for (int i = bitmap->getWidth() * bitmap->getHeight(); i > 0; i--) { + *((uint8_t *)p) = OPACITY_MAX - ((*p) >> 12); + p++; + } + } + return bitmap; +} + FIL imgFile __DMA; BitmapBuffer * BitmapBuffer::load_bmp(const char * filename) diff --git a/radio/src/gui/horus/bitmapbuffer.h b/radio/src/gui/horus/bitmapbuffer.h index 2dc6a350e..2d56de2e8 100644 --- a/radio/src/gui/horus/bitmapbuffer.h +++ b/radio/src/gui/horus/bitmapbuffer.h @@ -174,6 +174,10 @@ class BitmapBuffer: public BitmapBufferBase static BitmapBuffer * load(const char * filename); + static BitmapBuffer * loadMask(const char * filename); + + void drawMask(coord_t x, coord_t y, BitmapBuffer * mask, LcdFlags flags, coord_t offset=0, coord_t width=0); + void drawBitmapPattern(coord_t x, coord_t y, const uint8_t * bmp, LcdFlags flags, coord_t offset=0, coord_t width=0); void drawCharWithoutCache(coord_t x, coord_t y, const uint8_t * font, const uint16_t * spec, int index, LcdFlags flags); diff --git a/radio/src/gui/horus/bitmaps.cpp b/radio/src/gui/horus/bitmaps.cpp index 8f117a52c..aaabdbba2 100644 --- a/radio/src/gui/horus/bitmaps.cpp +++ b/radio/src/gui/horus/bitmaps.cpp @@ -32,18 +32,6 @@ const uint8_t LBM_DOT[] = { #include "mask_dot.lbm" }; -const uint8_t LBM_CURRENT_BG[] = { -#include "mask_current_bg.lbm" -}; - -const uint8_t LBM_CURRENT_SHADOW[] = { -#include "mask_current_shadow.lbm" -}; - -const uint8_t LBM_CURRENT_DOT[] = { -#include "mask_current_dot.lbm" -}; - /* * Main view bitmaps */ @@ -104,208 +92,10 @@ const uint8_t LBM_RSCALE[] = { #include "mask_rscale.lbm" }; -/* - * Stats / Debug menu bitmaps - */ - -const uint8_t LBM_STATS_ICON[] = { -#include "mask_stats.lbm" -}; - -const uint8_t LBM_STATS_GRAPH_ICON[] = { -#include "mask_stats_graph.lbm" -}; - -const uint8_t LBM_STATS_TIME_ICON[] = { -#include "mask_stats_time.lbm" -}; - -const uint8_t LBM_STATS_DEBUG_ICON[] = { -#include "mask_stats_debug.lbm" -}; - -const uint8_t LBM_STATS_ANALOGS_ICON[] = { -#include "mask_analogs.lbm" -}; - -const uint8_t * const LBM_STATS_ICONS[] = { - LBM_STATS_ICON, - LBM_STATS_GRAPH_ICON, - LBM_STATS_TIME_ICON, - LBM_STATS_ANALOGS_ICON, -#if defined(DEBUG_TRACE_BUFFER) - LBM_STATS_DEBUG_ICON -#endif -}; - -/* - * Radio menu bitmaps - */ - -const uint8_t LBM_RADIO_ICON[] = { -#include "mask_menu_radio.lbm" -}; - -const uint8_t LBM_RADIO_SETUP_ICON[] = { -#include "mask_radio_setup.lbm" -}; - -const uint8_t LBM_SD_BROWSER_ICON[] = { -#include "mask_sd_browser.lbm" -}; - -const uint8_t LBM_GLOBAL_FUNCTIONS_ICON[] = { -#include "mask_global_functions.lbm" -}; - -const uint8_t LBM_TRAINER_ICON[] = { -#include "mask_trainer.lbm" -}; - -const uint8_t LBM_CALIBRATION_ICON[] = { -#include "mask_calibration.lbm" -}; - -const uint8_t LBM_VERSION_ICON[] = { -#include "mask_version.lbm" -}; - -const uint8_t * const LBM_RADIO_ICONS[] = { - LBM_RADIO_ICON, - LBM_RADIO_SETUP_ICON, - LBM_SD_BROWSER_ICON, - LBM_GLOBAL_FUNCTIONS_ICON, - LBM_TRAINER_ICON, - LBM_CALIBRATION_ICON, - LBM_VERSION_ICON -}; - -/* - * Model menu bitmaps - */ - -const uint8_t LBM_MODEL_ICON[] = { -#include "mask_menu_model.lbm" -}; - -const uint8_t LBM_MODEL_SETUP_ICON[] = { -#include "mask_model_setup.lbm" -}; - -const uint8_t LBM_HELI_ICON[] = { -#include "mask_heli.lbm" -}; - -const uint8_t LBM_FLIGHT_MODES_ICON[] = { -#include "mask_flight_modes.lbm" -}; - -const uint8_t LBM_INPUTS_ICON[] = { -#include "mask_inputs.lbm" -}; - -const uint8_t LBM_MIXER_ICON[] = { -#include "mask_mixer.lbm" -}; - -const uint8_t LBM_OUTPUTS_ICON[] = { -#include "mask_outputs.lbm" -}; - -const uint8_t LBM_CURVES_ICON[] = { -#include "mask_curves.lbm" -}; - -const uint8_t LBM_GVARS_ICON[] = { -#include "mask_gvars.lbm" -}; - -const uint8_t LBM_LOGICAL_SWITCHES_ICON[] = { -#include "mask_logical_switches.lbm" -}; - -const uint8_t LBM_SPECIAL_FUNCTIONS_ICON[] = { -#include "mask_special_functions.lbm" -}; - -const uint8_t LBM_LUA_SCRIPTS_ICON[] = { -#include "mask_lua_scripts.lbm" -}; - -const uint8_t LBM_TELEMETRY_ICON[] = { -#include "mask_telemetry.lbm" -}; - -const uint8_t * const LBM_MODEL_ICONS[] = { - LBM_MODEL_ICON, - LBM_MODEL_SETUP_ICON, - CASE_HELI(LBM_HELI_ICON) - CASE_FLIGHT_MODES(LBM_FLIGHT_MODES_ICON) - LBM_INPUTS_ICON, - LBM_MIXER_ICON, - LBM_OUTPUTS_ICON, - CASE_CURVES(LBM_CURVES_ICON) - CASE_GVARS(LBM_GVARS_ICON) - LBM_LOGICAL_SWITCHES_ICON, - LBM_SPECIAL_FUNCTIONS_ICON, -#if defined(LUA_MODEL_SCRIPTS) - LBM_LUA_SCRIPTS_ICON, -#endif - LBM_TELEMETRY_ICON -}; - -/* - * UI (theme / layout / widgets bitmaps - */ - -const uint8_t LBM_MAINVIEWS_ICON[] = { -#include "mask_mainviews.lbm" -}; - -const uint8_t LBM_MAINVIEWS_TOPBAR_ICON[] = { -#include "mask_mainviews_topbar.lbm" -}; - -const uint8_t LBM_MAINVIEWS_1_ICON[] = { -#include "mask_mainviews_1.lbm" -}; - -const uint8_t LBM_MAINVIEWS_2_ICON[] = { -#include "mask_mainviews_2.lbm" -}; - -const uint8_t LBM_MAINVIEWS_3_ICON[] = { -#include "mask_mainviews_3.lbm" -}; - -const uint8_t LBM_MAINVIEWS_4_ICON[] = { -#include "mask_mainviews_4.lbm" -}; - -const uint8_t LBM_MAINVIEWS_5_ICON[] = { -#include "mask_mainviews_5.lbm" -}; - -const uint8_t LBM_MAINVIEWS_ADD_ICON[] = { -#include "mask_mainviews_add.lbm" -}; - -const uint8_t * const LBM_MAINVIEWS_ICONS[] = { - LBM_MAINVIEWS_1_ICON, - LBM_MAINVIEWS_2_ICON, - LBM_MAINVIEWS_3_ICON, - LBM_MAINVIEWS_4_ICON, - LBM_MAINVIEWS_5_ICON -}; - /* * Model selection screen bitmaps */ -const uint8_t LBM_LIBRARY_ICON[] = { -#include "mask_library.lbm" -}; - const uint8_t LBM_LIBRARY_SLOT[] = { #include "mask_library_slot.lbm" }; diff --git a/radio/src/gui/horus/bitmaps.h b/radio/src/gui/horus/bitmaps.h index 27fee169b..2b735c9f8 100644 --- a/radio/src/gui/horus/bitmaps.h +++ b/radio/src/gui/horus/bitmaps.h @@ -24,9 +24,6 @@ // Header bitmaps extern const uint8_t LBM_TOPMENU_POLYGON[]; extern const uint8_t LBM_DOT[]; -extern const uint8_t LBM_CURRENT_BG[]; -extern const uint8_t LBM_CURRENT_SHADOW[]; -extern const uint8_t LBM_CURRENT_DOT[]; // Main view icons extern const uint8_t LBM_TOPMENU_USB[]; @@ -40,34 +37,11 @@ extern const uint8_t LBM_TOPMENU_TXBATT[]; extern const uint8_t LBM_HTRIM_FRAME[]; extern const uint8_t LBM_VTRIM_FRAME[]; extern const uint8_t LBM_TRIM_SHADOW[]; -extern const uint8_t LBM_RADIO_ICON[]; -extern const uint8_t LBM_MODEL_ICON[]; extern const uint8_t LBM_TIMER_BACKGROUND[]; extern const uint8_t LBM_TIMER[]; extern const uint8_t LBM_RSCALE[]; -// Menu icons -extern const uint8_t * const LBM_RADIO_ICONS[]; -extern const uint8_t * const LBM_MODEL_ICONS[]; -extern const uint8_t * const LBM_STATS_ICONS[]; -extern const uint8_t LBM_RADIO_ICON[]; -extern const uint8_t LBM_SD_BROWSER_ICON[]; -extern const uint8_t LBM_CALIBRATION_ICON[]; -extern const uint8_t LBM_INPUTS_ICON[]; -extern const uint8_t LBM_MIXER_ICON[]; -extern const uint8_t LBM_CURVES_ICON[]; -extern const uint8_t LBM_LUA_SCRIPTS_ICON[]; -extern const uint8_t LBM_TELEMETRY_ICON[]; -extern const uint8_t LBM_STATS_ANALOGS_ICON[]; - -// UI (theme / layout / widgets bitmaps -extern const uint8_t LBM_MAINVIEWS_ICON[]; -extern const uint8_t LBM_MAINVIEWS_TOPBAR_ICON[]; -extern const uint8_t LBM_MAINVIEWS_ADD_ICON[]; -extern const uint8_t * const LBM_MAINVIEWS_ICONS[]; - // Model selection icons -extern const uint8_t LBM_LIBRARY_ICON[]; extern const uint8_t LBM_LIBRARY_SLOT[]; extern const uint8_t LBM_ACTIVE_MODEL[]; extern const uint8_t LBM_LIBRARY_CURSOR[]; diff --git a/radio/src/gui/horus/gui.h b/radio/src/gui/horus/gui.h index e4e0ef75b..a741afd6d 100644 --- a/radio/src/gui/horus/gui.h +++ b/radio/src/gui/horus/gui.h @@ -59,7 +59,12 @@ #define MENU_TITLE_NEXT_POS (lcdNextPos + 10) #define MENU_INIT_VPOS -1 +#if defined(HELI) && defined(GVARS) && defined(LUA_MODEL_SCRIPTS) #define MENU_ICONS_SPACING 31 +#else +#define MENU_ICONS_SPACING 33 +#endif + #define SUBMENU_LINE_WIDTH 230 #define LOAD_MODEL_BITMAP() diff --git a/radio/src/gui/horus/menu_general.cpp b/radio/src/gui/horus/menu_general.cpp index 547d68f24..dd2196596 100644 --- a/radio/src/gui/horus/menu_general.cpp +++ b/radio/src/gui/horus/menu_general.cpp @@ -18,10 +18,10 @@ * GNU General Public License for more details. */ -#include "../../opentx.h" +#include "opentx.h" bool menuGeneralCustomFunctions(evt_t event) { - MENU(STR_MENUGLOBALFUNCS, LBM_RADIO_ICONS, menuTabGeneral, e_GeneralCustomFunctions, NUM_CFN, { NAVIGATION_LINE_BY_LINE|4/*repeated*/ }); + MENU(STR_MENUGLOBALFUNCS, RADIO_ICONS, menuTabGeneral, e_GeneralCustomFunctions, NUM_CFN, { NAVIGATION_LINE_BY_LINE|4/*repeated*/ }); return menuCustomFunctions(event, g_eeGeneral.customFn, globalFunctionsContext); } diff --git a/radio/src/gui/horus/menu_general_calib.cpp b/radio/src/gui/horus/menu_general_calib.cpp index c4ad225c7..83d05fc2b 100644 --- a/radio/src/gui/horus/menu_general_calib.cpp +++ b/radio/src/gui/horus/menu_general_calib.cpp @@ -65,7 +65,7 @@ void drawPots() bool menuCommonCalib(evt_t event) { - drawScreenTemplate(NULL, LBM_CALIBRATION_ICON, OPTION_MENU_NO_FOOTER); + drawMenuTemplate(NULL, ICON_RADIO_CALIBRATION, NULL, OPTION_MENU_NO_FOOTER); for (uint8_t i=0; isrcRaw >= MIXSRC_FIRST_TELEM ? (uint8_t)1 : (uint8_t)0), 0, 0, CASE_CURVES(CURVE_ROWS) CASE_FLIGHT_MODES((MAX_FLIGHT_MODES-1) | NAVIGATION_LINE_BY_LINE) 0 /*, ...*/}); + SUBMENU_WITH_OPTIONS(STR_MENUINPUTS, ICON_MODEL_INPUTS, EXPO_FIELD_MAX, OPTION_MENU_NO_FOOTER|OPTION_MENU_NO_SCROLLBAR, { 0, 0, (ed->srcRaw >= MIXSRC_FIRST_TELEM ? (uint8_t)1 : (uint8_t)0), 0, 0, CASE_CURVES(CURVE_ROWS) CASE_FLIGHT_MODES((MAX_FLIGHT_MODES-1) | NAVIGATION_LINE_BY_LINE) 0 /*, ...*/}); lcdDrawSizedText(50, 3+FH, g_model.inputNames[ed->chn], LEN_INPUT_NAME, ZCHAR|MENU_TITLE_COLOR); lcdDrawSolidFilledRect(0, MENU_FOOTER_TOP, 230, MENU_FOOTER_HEIGHT, HEADER_BGCOLOR); @@ -370,7 +370,7 @@ bool menuModelExposAll(evt_t event) uint8_t chn = expoAddress(s_currIdx)->chn + 1; int linesCount = getExposLinesCount(); - SIMPLE_MENU(STR_MENUINPUTS, LBM_MODEL_ICONS, menuTabModel, e_InputsAll, linesCount); + SIMPLE_MENU(STR_MENUINPUTS, MODEL_ICONS, menuTabModel, e_InputsAll, linesCount); switch (event) { case EVT_ENTRY: diff --git a/radio/src/gui/horus/menu_model_limits.cpp b/radio/src/gui/horus/menu_model_limits.cpp index 7331a7750..e09333f58 100644 --- a/radio/src/gui/horus/menu_model_limits.cpp +++ b/radio/src/gui/horus/menu_model_limits.cpp @@ -93,7 +93,7 @@ void onLimitsMenu(const char *result) bool menuModelLimits(evt_t event) { - MENU(STR_MENULIMITS, LBM_MODEL_ICONS, menuTabModel, e_Limits, NUM_CHNOUT+1, + MENU(STR_MENULIMITS, MODEL_ICONS, menuTabModel, e_Limits, NUM_CHNOUT+1, { NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, diff --git a/radio/src/gui/horus/menu_model_logical_switches.cpp b/radio/src/gui/horus/menu_model_logical_switches.cpp index ddd59acd4..f7b159d97 100644 --- a/radio/src/gui/horus/menu_model_logical_switches.cpp +++ b/radio/src/gui/horus/menu_model_logical_switches.cpp @@ -77,7 +77,7 @@ bool menuModelLogicalSwitches(evt_t event) { INCDEC_DECLARE_VARS(EE_MODEL); - MENU(STR_MENULOGICALSWITCHES, LBM_MODEL_ICONS, menuTabModel, e_LogicalSwitches, NUM_LOGICAL_SWITCH, { NAVIGATION_LINE_BY_LINE|LS_FIELD_LAST/*repeated...*/} ); + MENU(STR_MENULOGICALSWITCHES, MODEL_ICONS, menuTabModel, e_LogicalSwitches, NUM_LOGICAL_SWITCH, { NAVIGATION_LINE_BY_LINE|LS_FIELD_LAST/*repeated...*/} ); int k = 0; int sub = menuVerticalPosition; diff --git a/radio/src/gui/horus/menu_model_mixes.cpp b/radio/src/gui/horus/menu_model_mixes.cpp index d3801282f..012fb8025 100644 --- a/radio/src/gui/horus/menu_model_mixes.cpp +++ b/radio/src/gui/horus/menu_model_mixes.cpp @@ -174,7 +174,7 @@ bool menuModelMixOne(evt_t event) { MixData * md2 = mixAddress(s_currIdx) ; - SUBMENU_WITH_OPTIONS(STR_MIXER, LBM_MIXER_ICON, MIX_FIELD_COUNT, OPTION_MENU_NO_SCROLLBAR, { 0, 0, 0, 0, 0, CASE_CURVES(1) CASE_FLIGHT_MODES((MAX_FLIGHT_MODES-1) | NAVIGATION_LINE_BY_LINE) 0 /*, ...*/ }); + SUBMENU_WITH_OPTIONS(STR_MIXER, ICON_MODEL_MIXER, MIX_FIELD_COUNT, OPTION_MENU_NO_SCROLLBAR, { 0, 0, 0, 0, 0, CASE_CURVES(1) CASE_FLIGHT_MODES((MAX_FLIGHT_MODES-1) | NAVIGATION_LINE_BY_LINE) 0 /*, ...*/ }); putsChn(50, 3+FH, md2->destCh+1, MENU_TITLE_COLOR); // The separation line between 2 columns @@ -341,7 +341,7 @@ bool menuModelMixAll(evt_t event) uint8_t chn = mixAddress(s_currIdx)->destCh + 1; int linesCount = getMixesLinesCount(); - SIMPLE_MENU(STR_MIXER, LBM_MODEL_ICONS, menuTabModel, e_MixAll, linesCount); + SIMPLE_MENU(STR_MIXER, MODEL_ICONS, menuTabModel, e_MixAll, linesCount); switch (event) { case EVT_ENTRY: diff --git a/radio/src/gui/horus/menu_model_select.cpp b/radio/src/gui/horus/menu_model_select.cpp index 72625694a..53bc00f55 100644 --- a/radio/src/gui/horus/menu_model_select.cpp +++ b/radio/src/gui/horus/menu_model_select.cpp @@ -218,7 +218,7 @@ bool menuModelSelect(evt_t event) } // Header - theme->drawTopbarBackground(LBM_LIBRARY_ICON); + theme->drawTopbarBackground(ICON_LIBRARY); // Body lcdDrawSolidFilledRect(0, MENU_HEADER_HEIGHT, CATEGORIES_WIDTH, LCD_H-MENU_HEADER_HEIGHT-MENU_FOOTER_HEIGHT, TITLE_BGCOLOR); diff --git a/radio/src/gui/horus/menu_model_setup.cpp b/radio/src/gui/horus/menu_model_setup.cpp index 1948b6962..c05ed3f08 100644 --- a/radio/src/gui/horus/menu_model_setup.cpp +++ b/radio/src/gui/horus/menu_model_setup.cpp @@ -186,7 +186,7 @@ bool menuModelSetup(evt_t event) g_model.moduleData[INTERNAL_MODULE].ppm.pulsePol = XJT_EXTERNAL_ANTENNA; } - MENU(STR_MENUSETUP, LBM_MODEL_ICONS, menuTabModel, e_ModelSetup, ITEM_MODEL_SETUP_MAX, + MENU(STR_MENUSETUP, MODEL_ICONS, menuTabModel, e_ModelSetup, ITEM_MODEL_SETUP_MAX, { 0, 0, TIMERS_ROWS, 0, 1, 0, 0, LABEL(Throttle), 0, 0, 0, LABEL(PreflightCheck), 0, 0, SW_WARN_ITEMS(), POT_WARN_ITEMS(), NAVIGATION_LINE_BY_LINE|(NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS-1), 0, @@ -753,7 +753,7 @@ bool menuModelFailsafe(evt_t event) } } - SIMPLE_SUBMENU_WITH_OPTIONS("FAILSAFE", LBM_STATS_ANALOGS_ICON, NUM_CHANNELS(g_moduleIdx), OPTION_MENU_NO_SCROLLBAR); + SIMPLE_SUBMENU_WITH_OPTIONS("FAILSAFE", ICON_STATS_ANALOGS, NUM_CHANNELS(g_moduleIdx), OPTION_MENU_NO_SCROLLBAR); drawStringWithIndex(50, 3+FH, "Module", g_moduleIdx+1, MENU_TITLE_COLOR); #define COL_W (LCD_W/2) diff --git a/radio/src/gui/horus/menu_model_telemetry.cpp b/radio/src/gui/horus/menu_model_telemetry.cpp index 6b4ddcec3..3f7cb3b08 100644 --- a/radio/src/gui/horus/menu_model_telemetry.cpp +++ b/radio/src/gui/horus/menu_model_telemetry.cpp @@ -127,7 +127,7 @@ bool menuModelSensor(evt_t event) { TelemetrySensor * sensor = &g_model.telemetrySensors[s_currIdx]; - SUBMENU("SENSOR", LBM_TELEMETRY_ICON, SENSOR_FIELD_MAX, { 0, 0, sensor->type == TELEM_TYPE_CALCULATED ? (uint8_t)0 : (uint8_t)1, SENSOR_UNIT_ROWS, SENSOR_PREC_ROWS, SENSOR_PARAM1_ROWS, SENSOR_PARAM2_ROWS, SENSOR_PARAM3_ROWS, SENSOR_PARAM4_ROWS, 0, 0, 0, 0, 0 }); + SUBMENU("SENSOR", ICON_MODEL_TELEMETRY, SENSOR_FIELD_MAX, { 0, 0, sensor->type == TELEM_TYPE_CALCULATED ? (uint8_t)0 : (uint8_t)1, SENSOR_UNIT_ROWS, SENSOR_PREC_ROWS, SENSOR_PARAM1_ROWS, SENSOR_PARAM2_ROWS, SENSOR_PARAM3_ROWS, SENSOR_PARAM4_ROWS, 0, 0, 0, 0, 0 }); lcdDrawNumber(lcdNextPos, 3, s_currIdx+1, MENU_TITLE_COLOR|LEFT); putsTelemetryChannelValue(50, 3+FH, s_currIdx, getValue(MIXSRC_FIRST_TELEM+3*s_currIdx), MENU_TITLE_COLOR|LEFT); @@ -407,7 +407,7 @@ bool menuModelTelemetry(evt_t event) } } - MENU(STR_MENUTELEMETRY, LBM_MODEL_ICONS, menuTabModel, e_Telemetry, ITEM_TELEMETRY_MAX, { TELEMETRY_TYPE_ROWS RSSI_ROWS SENSORS_ROWS VARIO_ROWS }); + MENU(STR_MENUTELEMETRY, MODEL_ICONS, menuTabModel, e_Telemetry, ITEM_TELEMETRY_MAX, { TELEMETRY_TYPE_ROWS RSSI_ROWS SENSORS_ROWS VARIO_ROWS }); for (int i=0; igetWidth(), mask->getHeight()); + menuIconNormal[index]->clear(HEADER_BGCOLOR); + menuIconNormal[index]->drawMask(0, 0, mask, HEADER_CURRENT_BGCOLOR); + menuIconSelected[index] = new BitmapBuffer(BMP_RGB565, mask->getWidth(), mask->getHeight()); + menuIconSelected[index]->clear(HEADER_BGCOLOR); + menuIconSelected[index]->drawMask(0, 0, mask, MENU_TITLE_COLOR); + } + } + + void loadMenusIcons() const + { + loadMenuIcon(ICON_OPENTX, "mask_opentx.png"); + loadMenuIcon(ICON_RADIO, "mask_menu_radio.png"); + loadMenuIcon(ICON_RADIO_SETUP, "mask_radio_setup.png"); + loadMenuIcon(ICON_RADIO_SD_BROWSER, "mask_radio_sd_browser.png"); + loadMenuIcon(ICON_RADIO_GLOBAL_FUNCTIONS, "mask_radio_global_functions.png"); + loadMenuIcon(ICON_RADIO_TRAINER, "mask_radio_trainer.png"); + loadMenuIcon(ICON_RADIO_HARDWARE, "mask_radio_hardware.png"); + loadMenuIcon(ICON_RADIO_VERSION, "mask_radio_version.png"); + loadMenuIcon(ICON_MODEL, "mask_menu_model.png"); + loadMenuIcon(ICON_MODEL_SETUP, "mask_model_setup.png"); + loadMenuIcon(ICON_MODEL_HELI, "mask_model_heli.png"); + loadMenuIcon(ICON_MODEL_FLIGHT_MODES, "mask_model_flight_modes.png"); + loadMenuIcon(ICON_MODEL_INPUTS, "mask_model_inputs.png"); + loadMenuIcon(ICON_MODEL_MIXER, "mask_model_mixer.png"); + loadMenuIcon(ICON_MODEL_OUTPUTS, "mask_model_outputs.png"); + loadMenuIcon(ICON_MODEL_CURVES, "mask_model_curves.png"); + loadMenuIcon(ICON_MODEL_GVARS, "mask_model_gvars.png"); + loadMenuIcon(ICON_MODEL_LOGICAL_SWITCHES, "mask_model_logical_switches.png"); + loadMenuIcon(ICON_MODEL_SPECIAL_FUNCTIONS, "mask_model_special_functions.png"); + loadMenuIcon(ICON_MODEL_LUA_SCRIPTS, "mask_model_lua_scripts.png"); + loadMenuIcon(ICON_MODEL_TELEMETRY, "mask_model_telemetry.png"); + loadMenuIcon(ICON_STATS, "mask_menu_stats.png"); + loadMenuIcon(ICON_STATS_THROTTLE_GRAPH, "mask_stats_throttle_graph.png"); + loadMenuIcon(ICON_STATS_TIMERS, "mask_stats_timers.png"); + loadMenuIcon(ICON_STATS_ANALOGS, "mask_stats_analogs.png"); + loadMenuIcon(ICON_STATS_DEBUG, "mask_stats_debug.png"); + loadMenuIcon(ICON_THEME, "mask_menu_theme.png"); + loadMenuIcon(ICON_THEME_SETUP, "mask_theme_setup.png"); + loadMenuIcon(ICON_THEME_VIEW1, "mask_theme_view1.png"); + loadMenuIcon(ICON_THEME_VIEW2, "mask_theme_view2.png"); + loadMenuIcon(ICON_THEME_VIEW3, "mask_theme_view3.png"); + loadMenuIcon(ICON_THEME_VIEW4, "mask_theme_view4.png"); + loadMenuIcon(ICON_THEME_VIEW5, "mask_theme_view5.png"); + loadMenuIcon(ICON_THEME_ADD_VIEW, "mask_theme_add_view.png"); + } + + virtual void load() const + { + loadColors(); + loadMenusIcons(); + } + + void drawTopbarBackground(uint8_t icon) const { lcdDrawSolidFilledRect(0, 0, LCD_W, MENU_HEADER_HEIGHT, HEADER_BGCOLOR); lcdDrawSolidFilledRect(0, 0, 41, MENU_HEADER_HEIGHT, HEADER_ICON_BGCOLOR); - if (icon) { - lcdDrawBitmapPattern(5, 7, icon, MENU_TITLE_COLOR); - } - else { + if (icon == ICON_OPENTX) { static BitmapBuffer * thumb = BitmapBuffer::load(getFilePath("topmenu_opentx.bmp")); lcd->drawBitmap(5, 7, thumb); } + else { + lcd->drawBitmap(5, 7, menuIconSelected[icon]); + } drawTopbarDatetime(); } + + virtual void drawMenuIcon(uint8_t index, uint8_t position, bool selected) const + { + lcd->drawBitmap(50+position*MENU_ICONS_SPACING, 7, selected ? menuIconSelected[index] : menuIconNormal[index]); + } + + protected: + static BitmapBuffer * menuIconNormal[MENUS_ICONS_COUNT]; + static BitmapBuffer * menuIconSelected[MENUS_ICONS_COUNT]; }; +BitmapBuffer * DarkblueTheme::menuIconNormal[MENUS_ICONS_COUNT] = { NULL }; +BitmapBuffer * DarkblueTheme::menuIconSelected[MENUS_ICONS_COUNT] = { NULL }; + const DarkblueTheme darkblueTheme; diff --git a/radio/src/gui/horus/themes/default.cpp b/radio/src/gui/horus/themes/default.cpp index ddba7a309..b97679d03 100644 --- a/radio/src/gui/horus/themes/default.cpp +++ b/radio/src/gui/horus/themes/default.cpp @@ -20,10 +20,6 @@ #include "opentx.h" -const uint8_t LBM_TOPMENU_MASK_OPENTX[] = { -#include "mask_topmenu_opentx.lbm" -}; - const ZoneOption OPTIONS_THEME_DEFAULT[] = { { "Background color", ZoneOption::Color, OPTION_DEFAULT_VALUE_UNSIGNED(WHITE) }, { "Main color", ZoneOption::Color, OPTION_DEFAULT_VALUE_UNSIGNED(RED) }, @@ -68,12 +64,79 @@ class DefaultTheme: public Theme lcdColorTable[OVERLAY_COLOR_INDEX] = BLACK; } + void loadMenuIcon(uint8_t index, const char * filename) const + { + BitmapBuffer * mask = BitmapBuffer::loadMask(getThemePath(filename)); + if (mask) { + menuIconNormal[index] = new BitmapBuffer(BMP_RGB565, mask->getWidth(), mask->getHeight()); + menuIconNormal[index]->clear(HEADER_BGCOLOR); + menuIconNormal[index]->drawMask(0, 0, mask, MENU_TITLE_COLOR); + menuIconSelected[index] = new BitmapBuffer(BMP_RGB565, mask->getWidth(), mask->getHeight()); + menuIconSelected[index]->clear(HEADER_CURRENT_BGCOLOR); + menuIconSelected[index]->drawMask(0, 0, mask, MENU_TITLE_COLOR); + } + } + + void loadMenusIcons() const + { + loadMenuIcon(ICON_OPENTX, "mask_opentx.png"); + loadMenuIcon(ICON_RADIO, "mask_menu_radio.png"); + loadMenuIcon(ICON_RADIO_SETUP, "mask_radio_setup.png"); + loadMenuIcon(ICON_RADIO_SD_BROWSER, "mask_radio_sd_browser.png"); + loadMenuIcon(ICON_RADIO_GLOBAL_FUNCTIONS, "mask_radio_global_functions.png"); + loadMenuIcon(ICON_RADIO_TRAINER, "mask_radio_trainer.png"); + loadMenuIcon(ICON_RADIO_HARDWARE, "mask_radio_hardware.png"); + loadMenuIcon(ICON_RADIO_VERSION, "mask_radio_version.png"); + loadMenuIcon(ICON_MODEL, "mask_menu_model.png"); + loadMenuIcon(ICON_MODEL_SETUP, "mask_model_setup.png"); + loadMenuIcon(ICON_MODEL_HELI, "mask_model_heli.png"); + loadMenuIcon(ICON_MODEL_FLIGHT_MODES, "mask_model_flight_modes.png"); + loadMenuIcon(ICON_MODEL_INPUTS, "mask_model_inputs.png"); + loadMenuIcon(ICON_MODEL_MIXER, "mask_model_mixer.png"); + loadMenuIcon(ICON_MODEL_OUTPUTS, "mask_model_outputs.png"); + loadMenuIcon(ICON_MODEL_CURVES, "mask_model_curves.png"); + loadMenuIcon(ICON_MODEL_GVARS, "mask_model_gvars.png"); + loadMenuIcon(ICON_MODEL_LOGICAL_SWITCHES, "mask_model_logical_switches.png"); + loadMenuIcon(ICON_MODEL_SPECIAL_FUNCTIONS, "mask_model_special_functions.png"); + loadMenuIcon(ICON_MODEL_LUA_SCRIPTS, "mask_model_lua_scripts.png"); + loadMenuIcon(ICON_MODEL_TELEMETRY, "mask_model_telemetry.png"); + loadMenuIcon(ICON_STATS, "mask_menu_stats.png"); + loadMenuIcon(ICON_STATS_THROTTLE_GRAPH, "mask_stats_throttle_graph.png"); + loadMenuIcon(ICON_STATS_TIMERS, "mask_stats_timers.png"); + loadMenuIcon(ICON_STATS_ANALOGS, "mask_stats_analogs.png"); + loadMenuIcon(ICON_STATS_DEBUG, "mask_stats_debug.png"); + loadMenuIcon(ICON_THEME, "mask_menu_theme.png"); + loadMenuIcon(ICON_THEME_SETUP, "mask_theme_setup.png"); + loadMenuIcon(ICON_THEME_VIEW1, "mask_theme_view1.png"); + loadMenuIcon(ICON_THEME_VIEW2, "mask_theme_view2.png"); + loadMenuIcon(ICON_THEME_VIEW3, "mask_theme_view3.png"); + loadMenuIcon(ICON_THEME_VIEW4, "mask_theme_view4.png"); + loadMenuIcon(ICON_THEME_VIEW5, "mask_theme_view5.png"); + loadMenuIcon(ICON_THEME_ADD_VIEW, "mask_theme_add_view.png"); + + BitmapBuffer * background = BitmapBuffer::loadMask(getThemePath("mask_currentmenu_bg.png")); + BitmapBuffer * shadow = BitmapBuffer::loadMask(getThemePath("mask_currentmenu_shadow.png")); + BitmapBuffer * dot = BitmapBuffer::loadMask(getThemePath("mask_currentmenu_dot.png")); + + if (!currentMenuBackground) currentMenuBackground = new BitmapBuffer(BMP_RGB565, 36, 53); + currentMenuBackground->drawSolidFilledRect(0, 0, currentMenuBackground->getWidth(), MENU_HEADER_HEIGHT, HEADER_BGCOLOR); + currentMenuBackground->drawSolidFilledRect(0, MENU_HEADER_HEIGHT, currentMenuBackground->getWidth(), MENU_TITLE_TOP - MENU_HEADER_HEIGHT, TEXT_BGCOLOR); + currentMenuBackground->drawSolidFilledRect(0, MENU_TITLE_TOP, currentMenuBackground->getWidth(), currentMenuBackground->getHeight() - MENU_TITLE_TOP, TITLE_BGCOLOR); + currentMenuBackground->drawMask(0, 0, background, HEADER_CURRENT_BGCOLOR); + currentMenuBackground->drawMask(0, 0, shadow, TRIM_SHADOW_COLOR); + currentMenuBackground->drawMask(10, 39, dot, MENU_TITLE_COLOR); + + delete background; + delete shadow; + delete dot; + } + virtual void load() const { loadColors(); + loadMenusIcons(); Theme::load(); if (!backgroundBitmap) backgroundBitmap = BitmapBuffer::load(getThemePath("mainbg.bmp")); - if (!aboutBackgroundBitmap) aboutBackgroundBitmap = BitmapBuffer::load(getThemePath("aboutbg.bmp")); update(); } @@ -103,33 +166,41 @@ class DefaultTheme: public Theme } } - virtual void drawAboutBackground() const - { - lcd->drawBitmap(0, 0, aboutBackgroundBitmap); - } - - virtual void drawTopbarBackground(const uint8_t * icon) const + virtual void drawTopbarBackground(uint8_t icon) const { lcdDrawSolidFilledRect(0, 0, LCD_W, MENU_HEADER_HEIGHT, HEADER_BGCOLOR); lcdDrawBitmapPattern(0, 0, LBM_TOPMENU_POLYGON, TITLE_BGCOLOR); - if (icon) { - lcdDrawBitmapPattern(5, 7, icon, MENU_TITLE_COLOR); - } - else { - lcdDrawBitmapPattern(4, 10, LBM_TOPMENU_MASK_OPENTX, MENU_TITLE_COLOR); - } + if (icon == ICON_OPENTX) + lcd->drawBitmap(4, 10, menuIconSelected[ICON_OPENTX]); + else + lcd->drawBitmap(5, 7, menuIconSelected[icon]); drawTopbarDatetime(); } + virtual void drawMenuIcon(uint8_t index, uint8_t position, bool selected) const + { + if (selected) { + lcd->drawBitmap(58+position*MENU_ICONS_SPACING-10, 0, currentMenuBackground); + lcd->drawBitmap(50+position*MENU_ICONS_SPACING, 7, menuIconSelected[index], MENU_TITLE_COLOR); + } + else { + lcd->drawBitmap(50+position*MENU_ICONS_SPACING, 7, menuIconNormal[index], MENU_TITLE_COLOR); + } + } + protected: static const BitmapBuffer * backgroundBitmap; - static const BitmapBuffer * aboutBackgroundBitmap; + static BitmapBuffer * menuIconNormal[MENUS_ICONS_COUNT]; + static BitmapBuffer * menuIconSelected[MENUS_ICONS_COUNT]; + static BitmapBuffer * currentMenuBackground; }; const BitmapBuffer * DefaultTheme::backgroundBitmap = NULL; -const BitmapBuffer * DefaultTheme::aboutBackgroundBitmap = NULL; +BitmapBuffer * DefaultTheme::menuIconNormal[MENUS_ICONS_COUNT] = { NULL }; +BitmapBuffer * DefaultTheme::menuIconSelected[MENUS_ICONS_COUNT] = { NULL }; +BitmapBuffer * DefaultTheme::currentMenuBackground = NULL; DefaultTheme defaultTheme; Theme * theme = &defaultTheme; diff --git a/radio/src/gui/horus/topbar.cpp b/radio/src/gui/horus/topbar.cpp index 3d9139817..0ca46730f 100644 --- a/radio/src/gui/horus/topbar.cpp +++ b/radio/src/gui/horus/topbar.cpp @@ -53,7 +53,7 @@ void drawTopbarDatetime() void drawTopBar() { - theme->drawTopbarBackground(NULL); + theme->drawTopbarBackground(0); // USB icon if (usbPlugged()) { diff --git a/radio/src/gui/horus/view_about.cpp b/radio/src/gui/horus/view_about.cpp index 620ae172f..66af00898 100644 --- a/radio/src/gui/horus/view_about.cpp +++ b/radio/src/gui/horus/view_about.cpp @@ -62,8 +62,8 @@ bool menuAboutView(evt_t event) break; } - theme->drawAboutBackground(); - theme->drawTopbarBackground(NULL); + theme->drawBackground(); + theme->drawTopbarBackground(0); uint8_t screenDuration = 150; diff --git a/radio/src/gui/horus/view_statistics.cpp b/radio/src/gui/horus/view_statistics.cpp index 73db48324..636fa3c8c 100644 --- a/radio/src/gui/horus/view_statistics.cpp +++ b/radio/src/gui/horus/view_statistics.cpp @@ -39,7 +39,7 @@ bool menuStatsGraph(evt_t event) break; } - MENU("Statistics", LBM_STATS_ICONS, menuTabStats, e_StatsGraph, 0, { 0 }); + MENU("Statistics", STATS_ICONS, menuTabStats, e_StatsGraph, 0, { 0 }); lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP, "Session"); putsTimer(MENU_STATS_COLUMN1, MENU_CONTENT_TOP, sessionTimer, TIMEHOUR); @@ -111,7 +111,7 @@ bool menuStatsDebug(evt_t event) break; } - MENU("Debug", LBM_STATS_ICONS, menuTabStats, e_StatsDebug, 0, { 0 }); + MENU("Debug", STATS_ICONS, menuTabStats, e_StatsDebug, 0, { 0 }); lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP, "Free Mem"); lcdDrawNumber(MENU_STATS_COLUMN1, MENU_CONTENT_TOP, availableMemory(), LEFT, 0, NULL, "b"); @@ -142,7 +142,7 @@ bool menuStatsDebug(evt_t event) bool menuStatsAnalogs(evt_t event) { - MENU("Analogs", LBM_STATS_ICONS, menuTabStats, e_StatsAnalogs, 0, { 0 }); + MENU("Analogs", STATS_ICONS, menuTabStats, e_StatsAnalogs, 0, { 0 }); for (int i=0; idrawTopbarBackground(icon); + theme->drawTopbarBackground(icons ? icons[0] : icon); // Menu title bar if (options & OPTION_MENU_TITLE_BAR) { @@ -144,6 +144,14 @@ void drawScreenTemplate(const char * title, const uint8_t * icon, uint32_t optio if (title) { lcdDrawText(MENUS_MARGIN_LEFT, MENU_TITLE_TOP+2, title, MENU_TITLE_COLOR); } + if (icons) { + for (int i=0; idrawMenuIcon(icons[i+1], i, false); + } + } + theme->drawMenuIcon(icons[menuPageIndex+1], menuPageIndex, true); + } } else { linesDisplayed = NUM_BODY_LINES + 1; @@ -171,19 +179,6 @@ void drawScreenTemplate(const char * title, const uint8_t * icon, uint32_t optio } } -void drawMenuTemplate(const char * title, const uint8_t * const * icons, uint32_t options) -{ - drawScreenTemplate(title, icons[0], OPTION_MENU_TITLE_BAR); - - lcdDrawBitmapPattern(58+menuPageIndex*MENU_ICONS_SPACING-10, 0, LBM_CURRENT_BG, HEADER_CURRENT_BGCOLOR); - lcdDrawBitmapPattern(58+menuPageIndex*MENU_ICONS_SPACING-10, 0, LBM_CURRENT_SHADOW, TRIM_SHADOW_COLOR); - lcdDrawBitmapPattern(58+menuPageIndex*MENU_ICONS_SPACING, MENU_TITLE_TOP-9, LBM_CURRENT_DOT, MENU_TITLE_COLOR); - - for (int i=0; idrawBitmap(0, 0, lcd, zone.x, zone.y, zone.w, zone.h); GET_FILENAME(filename, BITMAPS_PATH, g_model.header.bitmap, BITMAPS_EXT); BitmapBuffer * bitmap = BitmapBuffer::load(filename); if (zone.h >= 96 && zone.w >= 120) { buffer->drawFilledRect(0, 0, zone.w, zone.h, SOLID, MAINVIEW_PANES_COLOR | OPACITY(5)); - buffer->drawBitmapPattern(6, 4, LBM_MODEL_ICON, MAINVIEW_GRAPHICS_COLOR); + static BitmapBuffer * icon = BitmapBuffer::loadMask(getThemePath("mask_menu_model.png")); + buffer->drawMask(6, 4, icon, MAINVIEW_GRAPHICS_COLOR); buffer->drawSizedText(45, 10, g_model.header.name, LEN_MODEL_NAME, ZCHAR | SMLSIZE); buffer->drawSolidFilledRect(39, 27, zone.w - 48, 2, MAINVIEW_GRAPHICS_COLOR); if (bitmap) {