LCD menu optimalization
This commit is contained in:
parent
4d42617b21
commit
f7262637f8
2 changed files with 103 additions and 37 deletions
|
@ -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;
|
||||
|
|
|
@ -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()
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue