LCD menu optimalization

This commit is contained in:
Robert Pelnar 2018-06-23 14:33:54 +02:00
parent 4d42617b21
commit f7262637f8
2 changed files with 103 additions and 37 deletions

View file

@ -247,7 +247,6 @@ static void lcd_delta_calibrate_menu();
static void lcd_quick_feedback();//Cause an LCD refresh, and give the user visual or audible feedback that something has happened
/* Different types of actions that can be used in menu items. */
static void menu_action_setlang(unsigned char lang);
static void menu_action_sdfile(const char* filename, char* longFilename);
static void menu_action_sddirectory(const char* filename, char* longFilename);
static void menu_action_setting_edit_bool(const char* pstr, bool* ptr);
@ -317,7 +316,7 @@ bool wasClicked = false;
_menuItemNr++;\
} while(0)
#define MENU_ITEM_DUMMY() do { _menuItemNr++; } while(0)
//#define MENU_ITEM_DUMMY() do { _menuItemNr++; } while(0)
#define MENU_ITEM_EDIT(type, label, args...) MENU_ITEM(setting_edit_ ## type, label, (label) , ## args )
#define MENU_ITEM_EDIT_CALLBACK(type, label, args...) MENU_ITEM(setting_edit_callback_ ## type, label, (label) , ## args )
@ -354,7 +353,7 @@ uint8_t lcdDrawUpdate = 2; /* Set to none-zero when the LCD nee
/**
* @brief Go to menu
*
* In MENU_ITEM_SUBMENU_P(,... ) use MENU_ITEM(back,...) or
* In MENU_ITEM_SUBMENU_P(str, func) use MENU_ITEM_BACK_P(str) or
* menu_back() and menu_submenu() instead, otherwise menuStack will be broken.
*
* It is acceptable to call lcd_goto_menu(menu) directly from MENU_ITEM(function,...), if destination menu
@ -393,8 +392,9 @@ static void lcd_goto_menu(menuFunc_t menu, const uint32_t encoder = 0, const boo
asm("sei");
}
/* Main status screen. It's up to the implementation specific part to show what is needed. As this is very display dependent */
////////////////////////////////////////////////////////////////////////////////
// New Menu implementation
#include <stdarg.h>
@ -450,10 +450,10 @@ void menu_back(void)
void menu_submenu(menuFunc_t submenu)
{
menuStack.push(currentMenu, encoderPosition);
menuStack.push(currentMenu, encoderPosition);
lcd_goto_menu(submenu);
}
/*
int menu_item_printf_P(char type_char, const char* format, ...)
{
va_list args;
@ -471,13 +471,51 @@ int menu_item_printf_P(char type_char, const char* format, ...)
va_end(args);
return ret;
}
*/
int menu_draw_item_puts_P(char type_char, const char* str)
{
lcd.setCursor(0, _drawLineNr);
// if ((encoderPosition / ENCODER_STEPS_PER_MENU_ITEM) == _menuItemNr)
// lcd.print('>');
// else
// lcd.print(' ');
int cnt = lcd_printf_P(_N("%c%-18S%c"), ((encoderPosition / ENCODER_STEPS_PER_MENU_ITEM) == _menuItemNr)?'>':' ', str, type_char);
// for (cnt++ < 18; i++)
// lcd.print(' ');
// lcd.print(type_char);
return cnt;
}
#define MENU_ITEM_DUMMY() menu_item_dummy()
inline void menu_item_dummy(void)
{
_menuItemNr++;
}
#define MENU_ITEM_TEXT_P(str) if (menu_item_text_P(str)) return
uint8_t menu_item_text_P(const char* str)
{
if (_menuItemNr == _lineNr)
{
if (lcdDrawUpdate) menu_draw_item_puts_P(' ', str);
if (wasClicked && (encoderPosition / ENCODER_STEPS_PER_MENU_ITEM) == _menuItemNr)
{
lcd_implementation_quick_feedback();
lcdDrawUpdate = 2;
button_pressed = false;
return 1;
}
}
_menuItemNr++;
return 0;
}
#define MENU_ITEM_SUBMENU_P(str, submenu) if (menu_item_submenu_P(str, submenu)) return
uint8_t menu_item_submenu_P(const char* str, menuFunc_t submenu)
{
if (_menuItemNr == _lineNr)
{
if (lcdDrawUpdate) menu_item_printf_P(LCD_STR_ARROW_RIGHT[0], str);
if (lcdDrawUpdate) menu_draw_item_puts_P(LCD_STR_ARROW_RIGHT[0], str);
if (wasClicked && (encoderPosition / ENCODER_STEPS_PER_MENU_ITEM) == _menuItemNr)
{
lcd_implementation_quick_feedback();
@ -497,7 +535,7 @@ uint8_t menu_item_back_P(const char* str)
{
if (_menuItemNr == _lineNr)
{
if (lcdDrawUpdate) menu_item_printf_P(LCD_STR_UPLEVEL[0], str);
if (lcdDrawUpdate) menu_draw_item_puts_P(LCD_STR_UPLEVEL[0], str);
if (wasClicked && (encoderPosition / ENCODER_STEPS_PER_MENU_ITEM) == _menuItemNr)
{
MenuStack::Record record = menuStack.pop();
@ -518,7 +556,7 @@ uint8_t menu_item_function_P(const char* str, menuFunc_t func)
{
if (_menuItemNr == _lineNr)
{
if (lcdDrawUpdate) menu_item_printf_P(' ', str);
if (lcdDrawUpdate) menu_draw_item_puts_P(' ', str);
if (wasClicked && (encoderPosition / ENCODER_STEPS_PER_MENU_ITEM) == _menuItemNr)
{
if (func) func();
@ -537,7 +575,7 @@ uint8_t menu_item_gcode_P(const char* str, const char* str_gcode)
{
if (_menuItemNr == _lineNr)
{
if (lcdDrawUpdate) menu_item_printf_P(' ', str);
if (lcdDrawUpdate) menu_draw_item_puts_P(' ', str);
if (wasClicked && (encoderPosition / ENCODER_STEPS_PER_MENU_ITEM) == _menuItemNr)
{
if (str_gcode) enquecommand_P(str_gcode);
@ -551,6 +589,23 @@ uint8_t menu_item_gcode_P(const char* str, const char* str_gcode)
return 0;
}
//#define MENU_ITEM_SDDIR_P(str, str_fn, str_desc) if (menu_item_sddir_P(str, str_fn, str_desc)) return
#define MENU_ITEM_SDDIR_P(str, str_fn, str_desc) MENU_ITEM(sddirectory, str, str_fn, str_desc)
uint8_t menu_item_sddir_P(const char* str, const char* str_fn, char* str_desc)
{
}
//#define MENU_ITEM_SDFILE_P(str, str_fn, str_desc) if (menu_item_sdfile_P(str, str_fn, str_desc)) return
#define MENU_ITEM_SDFILE_P(str, str_fn, str_desc) MENU_ITEM(sdfile, str, str_fn, str_desc)
uint8_t menu_item_sdfile_P(const char* str, const char* str_fn, char* str_desc)
{
}
/* Main status screen. It's up to the implementation specific part to show what is needed. As this is very display dependent */
static void lcd_status_screen()
{
if (firstrun == 1)
@ -3804,21 +3859,50 @@ void lcd_set_progress() {
#endif
#if (LANG_MODE != 0)
void menu_setlang(unsigned char lang)
{
if (!lang_select(lang))
{
if (lcd_show_fullscreen_message_yes_no_and_wait_P(_i("Copy selected language from XFLASH?"), false, true))
lang_boot_update_start(lang);
lcd_update_enable(true);
lcd_implementation_clear();
lcd_goto_menu(lcd_language_menu);
lcd_timeoutToStatus = -1; //infinite timeout
lcdDrawUpdate = 2;
}
}
static void lcd_language_menu()
{
MENU_BEGIN();
if (lang_is_selected()) MENU_ITEM_BACK_P(_T(MSG_SETTINGS)); //
MENU_ITEM(setlang, lang_get_name_by_code(lang_get_code(0)), 0); //primary language
if (menu_item_text_P(lang_get_name_by_code(lang_get_code(0)))) //primary language
{
menu_setlang(0);
return;
}
uint8_t cnt = lang_get_count();
#ifdef W25X20CL
if (cnt == 2) //display secondary language in case of clear xflash
MENU_ITEM(setlang, lang_get_name_by_code(lang_get_code(1)), 1);
{
if (menu_item_text_P(lang_get_name_by_code(lang_get_code(1))))
{
menu_setlang(1);
return;
}
}
else
for (int i = 2; i < cnt; i++) //skip seconday language - solved in lang_select (MK3)
#else //W25X20CL
for (int i = 1; i < cnt; i++) //all seconday languages (MK2/25)
#endif //W25X20CL
MENU_ITEM(setlang, lang_get_name_by_code(lang_get_code(i)), i);
if (menu_item_text_P(lang_get_name_by_code(lang_get_code(i))))
{
menu_setlang(i);
return;
}
MENU_END();
}
#endif //(LANG_MODE != 0)
@ -5600,10 +5684,10 @@ static void lcd_main_menu()
#endif
if (card.filenameIsDir)
{
MENU_ITEM(sddirectory, _T(MSG_CARD_MENU), card.filename, card.longFilename);
MENU_ITEM_SDDIR_P(_T(MSG_CARD_MENU), card.filename, card.longFilename);
} else {
MENU_ITEM(sdfile, _T(MSG_CARD_MENU), card.filename, card.longFilename);
MENU_ITEM_SDFILE_P(_T(MSG_CARD_MENU), card.filename, card.longFilename);
@ -5719,8 +5803,6 @@ static void lcd_main_menu()
MENU_ITEM_SUBMENU_P(_i("W25x20CL init"), lcd_test_menu);////MSG_SUPPORT c=0 r=0
// menu_item_printf_P('#', _N("Test %d %d %d"), 0, 1, 2);
MENU_END();
}
@ -6055,9 +6137,9 @@ void lcd_sdcard_menu()
#endif
if (card.filenameIsDir)
MENU_ITEM(sddirectory, _T(MSG_CARD_MENU), card.filename, card.longFilename);
MENU_ITEM_SDDIR_P(_T(MSG_CARD_MENU), card.filename, card.longFilename);
else
MENU_ITEM(sdfile, _T(MSG_CARD_MENU), card.filename, card.longFilename);
MENU_ITEM_SDFILE_P(_T(MSG_CARD_MENU), card.filename, card.longFilename);
} else {
MENU_ITEM_DUMMY();
}
@ -6117,11 +6199,11 @@ void lcd_sdcard_menu()
#endif
if (card.filenameIsDir)
{
MENU_ITEM(sddirectory, _T(MSG_CARD_MENU), card.filename, card.longFilename);
MENU_ITEM_SDDIR_P(_T(MSG_CARD_MENU), card.filename, card.longFilename);
}
else {
MENU_ITEM(sdfile, _T(MSG_CARD_MENU), card.filename, description[i]);
MENU_ITEM_SDFILE_P(_T(MSG_CARD_MENU), card.filename, description[i]);
}
}
else {
@ -7202,20 +7284,6 @@ static void lcd_quick_feedback()
/** Menu action functions **/
static void menu_action_setlang(unsigned char lang)
{
if (!lang_select(lang))
{
if (lcd_show_fullscreen_message_yes_no_and_wait_P(_i("Copy selected language from XFLASH?"), false, true))
lang_boot_update_start(lang);
lcd_update_enable(true);
lcd_implementation_clear();
lcd_goto_menu(lcd_language_menu);
lcd_timeoutToStatus = -1; //infinite timeout
lcdDrawUpdate = 2;
}
}
static bool check_file(const char* filename) {
if (farm_mode) return true;
bool result = false;

View file

@ -1353,8 +1353,6 @@ static void lcd_implementation_drawmenu_sddirectory(uint8_t row, const char* pst
lcd.print(' ');
}
#define lcd_implementation_drawmenu_setlang_selected(row, pstr, data) lcd_implementation_drawmenu_generic(row, pstr, '>', ' ')
#define lcd_implementation_drawmenu_setlang(row, pstr, data) lcd_implementation_drawmenu_generic(row, pstr, ' ', ' ')
static void lcd_implementation_quick_feedback()
{