From 505deb28fd85f3baf4259d302865b64be181d411 Mon Sep 17 00:00:00 2001
From: leptun <voinea.dragos.alexandru@gmail.com>
Date: Sat, 10 Aug 2019 08:42:33 +0300
Subject: [PATCH] Toggle menu item

---
 Firmware/menu.cpp | 30 ++++++++++++++++++++++++++++++
 Firmware/menu.h   |  3 +++
 2 files changed, 33 insertions(+)

diff --git a/Firmware/menu.cpp b/Firmware/menu.cpp
index 7839bbdc..08503111 100755
--- a/Firmware/menu.cpp
+++ b/Firmware/menu.cpp
@@ -184,6 +184,17 @@ static void menu_draw_item_puts_P(char type_char, const char* str)
     lcd_printf_P(PSTR("%c%-18.18S%c"), menu_selection_mark(), str, type_char);
 }
 
+static void menu_draw_toggle_puts_P(const char* str, const char* toggle)
+{
+	menu_draw_item_puts_P(LCD_STR_REFRESH[0], str);
+	lcd_set_cursor(LCD_WIDTH - 4 - strlen_P(toggle), menu_row);
+	lcd_putc('[');
+	lcd_puts_P(toggle);
+	lcd_putc(']');
+	
+	// lcd_printf_P(PSTR("[%s]"), toggle);
+}
+
 //! @brief Format sheet name
 //!
 //! @param[in] sheet_E Sheet in EEPROM
@@ -367,6 +378,25 @@ uint8_t menu_item_function_P(const char* str, char number, void (*func)(uint8_t)
     return 0;
 }
 
+uint8_t menu_item_toggle_P(const char* str, const char* toggle, menu_func_t func)
+{
+	if (menu_item == menu_line)
+	{
+		if (lcd_draw_update) menu_draw_toggle_puts_P(str, toggle);
+		if (menu_clicked && (lcd_encoder == menu_item))
+		{
+			menu_clicked = false;
+			lcd_consume_click();
+			lcd_update_enabled = 0;
+			if (func) func();
+			lcd_update_enabled = 1;
+			return menu_item_ret();
+		}
+	}
+	menu_item++;
+	return 0;
+}
+
 uint8_t menu_item_gcode_P(const char* str, const char* str_gcode)
 {
 	if (menu_item == menu_line)
diff --git a/Firmware/menu.h b/Firmware/menu.h
index d9bbf876..d7676661 100755
--- a/Firmware/menu.h
+++ b/Firmware/menu.h
@@ -118,6 +118,9 @@ extern uint8_t menu_item_function_P(const char* str, menu_func_t func);
 #define MENU_ITEM_FUNCTION_NR_P(str, number, func, fn_par) do { if (menu_item_function_P(str, number, func, fn_par)) return; } while (0)
 extern uint8_t menu_item_function_P(const char* str, char number, void (*func)(uint8_t), uint8_t fn_par);
 
+#define MENU_ITEM_TOGGLE_P(str, toggle, func) do { if (menu_item_toggle_P(str, toggle, func)) return; } while (0)
+extern uint8_t menu_item_toggle_P(const char* str, const char* toggle, menu_func_t func);
+
 #define MENU_ITEM_GCODE_P(str, str_gcode) do { if (menu_item_gcode_P(str, str_gcode)) return; } while (0)
 extern uint8_t menu_item_gcode_P(const char* str, const char* str_gcode);