/** * Marlin 3D Printer Firmware * Copyright (c) 2022 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ /** * Menu functions for ProUI * Author: Miguel A. Risco-Castillo * Version: 1.5.1 * Date: 2022/05/23 * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #pragma once #include "dwinui.h" typedef struct { int32_t MaxValue = 0; // Auxiliar max integer/scaled float value int32_t MinValue = 0; // Auxiliar min integer/scaled float value int8_t dp = 0; // Auxiliar decimal places int32_t Value = 0; // Auxiliar integer / scaled float value int16_t *P_Int = nullptr; // Auxiliar pointer to 16 bit integer variable float *P_Float = nullptr; // Auxiliar pointer to float variable void (*Apply)() = nullptr; // Auxiliar apply function void (*LiveUpdate)() = nullptr; // Auxiliar live update function } MenuData_t; extern MenuData_t MenuData; extern void (*onCursorErase)(const int8_t line); extern void (*onCursorDraw)(const int8_t line); // Auxiliary Macros =========================================================== // Create and add a MenuItem object to the menu array #define BACK_ITEM(H) MenuItemsAdd(ICON_Back, GET_TEXT_F(MSG_BUTTON_BACK), onDrawMenuItem, H) #define MENU_ITEM(V...) MenuItemsAdd(V) #define EDIT_ITEM(V...) MenuItemsAdd(V) #define MENU_ITEM_F(I,L,V...) MenuItemsAdd(I, GET_TEXT_F(L), V) #define EDIT_ITEM_F(I,L,V...) MenuItemsAdd(I, GET_TEXT_F(L), V) // Menu Classes =============================================================== class MenuItemClass { protected: public: int8_t pos = 0; uint8_t icon = 0; char caption[32] = ""; uint8_t frameid = 0; rect_t frame = {0}; void (*onDraw)(MenuItemClass* menuitem, int8_t line) = nullptr; void (*onClick)() = nullptr; MenuItemClass() {}; MenuItemClass(uint8_t cicon, const char * const text=nullptr, void (*ondraw)(MenuItemClass* menuitem, int8_t line)=nullptr, void (*onclick)()=nullptr); // MenuItemClass(uint8_t cicon, FSTR_P text = nullptr, void (*ondraw)(MenuItemClass* menuitem, int8_t line)=nullptr, void (*onclick)()=nullptr) : MenuItemClass(cicon, FTOP(text), ondraw, onclick){} MenuItemClass(uint8_t cicon, uint8_t id, uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, void (*ondraw)(MenuItemClass* menuitem, int8_t line)=nullptr, void (*onclick)()=nullptr); void SetFrame(uint8_t id, uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2); virtual ~MenuItemClass(){}; virtual void draw(int8_t line); void redraw(); }; class MenuItemPtrClass: public MenuItemClass { public: void *value = nullptr; using MenuItemClass::MenuItemClass; MenuItemPtrClass(uint8_t cicon, const char * const text, void (*ondraw)(MenuItemClass* menuitem, int8_t line), void (*onclick)(), void* val); MenuItemPtrClass(uint8_t cicon, FSTR_P text, void (*ondraw)(MenuItemClass* menuitem, int8_t line), void (*onclick)(), void* val) : MenuItemPtrClass(cicon, FTOP(text), ondraw, onclick, val){} }; class MenuClass { public: int8_t topline = 0; int8_t selected = 0; TitleClass MenuTitle; MenuClass(); virtual ~MenuClass(){}; inline int8_t line() { return selected - topline; }; inline int8_t line(uint8_t pos) {return pos - topline; }; int8_t count(); virtual void draw(); virtual void onScroll(bool dir); void onClick(); MenuItemClass* SelectedItem(); static MenuItemClass** Items(); }; extern MenuClass *CurrentMenu; extern MenuClass *PreviousMenu; extern void (*onMenuDraw)(MenuClass* menu); // Menuitem Drawing functions ================================================= void Draw_Title(TitleClass* title); void Draw_Menu(MenuClass* menu); void Draw_Menu_Cursor(const int8_t line); void Erase_Menu_Cursor(const int8_t line); void Draw_Menu_Line(const uint8_t line, const uint8_t icon=0, const char * const label=nullptr, bool more=false); void Draw_Chkb_Line(const uint8_t line, const bool checked); void Draw_Menu_IntValue(uint16_t bcolor, const uint8_t line, uint8_t iNum, const int32_t value=0); void onDrawMenuItem(MenuItemClass* menuitem, int8_t line); void onDrawSubMenu(MenuItemClass* menuitem, int8_t line); void onDrawIntMenu(MenuItemClass* menuitem, int8_t line, int32_t value); void onDrawPIntMenu(MenuItemClass* menuitem, int8_t line); void onDrawPInt8Menu(MenuItemClass* menuitem, int8_t line); void onDrawPInt32Menu(MenuItemClass* menuitem, int8_t line); void onDrawFloatMenu(MenuItemClass* menuitem, int8_t line, uint8_t dp, const float value); void onDrawPFloatMenu(MenuItemClass* menuitem, int8_t line); void onDrawPFloat2Menu(MenuItemClass* menuitem, int8_t line); void onDrawPFloat3Menu(MenuItemClass* menuitem, int8_t line); void onDrawChkbMenu(MenuItemClass* menuitem, int8_t line, bool checked); void onDrawChkbMenu(MenuItemClass* menuitem, int8_t line); // On click functions ========================================================= void SetOnClick(uint8_t process, const int32_t lo, const int32_t hi, uint8_t dp, const int32_t val, void (*Apply)() = nullptr, void (*LiveUpdate)() = nullptr); void SetValueOnClick(uint8_t process, const int32_t lo, const int32_t hi, const int32_t val, void (*Apply)() = nullptr, void (*LiveUpdate)() = nullptr); void SetValueOnClick(uint8_t process, const float lo, const float hi, uint8_t dp, const float val, void (*Apply)() = nullptr, void (*LiveUpdate)() = nullptr); void SetIntOnClick(const int32_t lo, const int32_t hi, const int32_t val, void (*Apply)() = nullptr, void (*LiveUpdate)() = nullptr); void SetPIntOnClick(const int32_t lo, const int32_t hi, void (*Apply)() = nullptr, void (*LiveUpdate)() = nullptr); void SetFloatOnClick(const float lo, const float hi, uint8_t dp, const float val, void (*Apply)() = nullptr, void (*LiveUpdate)() = nullptr); void SetPFloatOnClick(const float lo, const float hi, uint8_t dp, void (*Apply)() = nullptr, void (*LiveUpdate)() = nullptr); // HMI user control functions ================================================= void HMI_Menu(); void HMI_SetInt(); void HMI_SetPInt(); void HMI_SetIntNoDraw(); void HMI_SetFloat(); void HMI_SetPFloat(); // Menu auxiliary functions =================================================== // Create a new menu bool SetMenu(MenuClass* &menu, FSTR_P title, int8_t totalitems); //Update the Menu and Draw if it is valid void UpdateMenu(MenuClass* &menu); //Redraw the current Menu if it is valid void ReDrawMenu(const bool force=false); // Clear MenuItems array and free MenuItems elements void MenuItemsClear(); // Prepare MenuItems array void MenuItemsPrepare(int8_t totalitems); // Add elements to the MenuItems array MenuItemClass* MenuItemsAdd(uint8_t cicon, const char * const text=nullptr, void (*ondraw)(MenuItemClass* menuitem, int8_t line)=nullptr, void (*onclick)()=nullptr); inline MenuItemClass* MenuItemsAdd(uint8_t cicon, FSTR_P text = nullptr, void (*ondraw)(MenuItemClass* menuitem, int8_t line)=nullptr, void (*onclick)()=nullptr) { return MenuItemsAdd(cicon, FTOP(text), ondraw, onclick); } MenuItemClass* MenuItemsAdd(uint8_t cicon, uint8_t id, uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, void (*ondraw)(MenuItemClass* menuitem, int8_t line)=nullptr, void (*onclick)()=nullptr); MenuItemClass* MenuItemsAdd(uint8_t cicon, const char * const text, void (*ondraw)(MenuItemClass* menuitem, int8_t line), void (*onclick)(), void* val); inline MenuItemClass* MenuItemsAdd(uint8_t cicon, FSTR_P text, void (*ondraw)(MenuItemClass* menuitem, int8_t line), void (*onclick)(), void* val) { return MenuItemsAdd(cicon, FTOP(text), ondraw, onclick, val); }