This commit is contained in:
		@@ -87,7 +87,7 @@ void AdvancedSettingsMenu::onRedraw(draw_mode_t what) {
 | 
			
		||||
      .tag(13) .button(BTN_POS(1,7), BTN_SIZE(2,1), GET_TEXT_F(MSG_INTERFACE))
 | 
			
		||||
      .tag(14) .button(BTN_POS(1,8), BTN_SIZE(2,1), GET_TEXT_F(MSG_RESTORE_DEFAULTS))
 | 
			
		||||
      .colors(action_btn)
 | 
			
		||||
      .tag(1). button( BTN_POS(1,9), BTN_SIZE(2,1), GET_TEXT_F(MSG_BACK));
 | 
			
		||||
      .tag(1). button( BTN_POS(1,9), BTN_SIZE(2,1), GET_TEXT_F(MSG_BUTTON_DONE));
 | 
			
		||||
    #undef GRID_COLS
 | 
			
		||||
    #undef GRID_ROWS
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
@@ -36,7 +36,7 @@ bool BioConfirmHomeE::onTouchEnd(uint8_t tag) {
 | 
			
		||||
  switch (tag) {
 | 
			
		||||
    case 1:
 | 
			
		||||
      #if defined(AXIS_LEVELING_COMMANDS) && defined(PARK_AND_RELEASE_COMMANDS)
 | 
			
		||||
        SpinnerDialogBox::enqueueAndWait_P(F(
 | 
			
		||||
        SpinnerDialogBox::enqueueAndWait(F(
 | 
			
		||||
          "G28 E\n"
 | 
			
		||||
          AXIS_LEVELING_COMMANDS "\n"
 | 
			
		||||
          PARK_AND_RELEASE_COMMANDS
 | 
			
		||||
 
 | 
			
		||||
@@ -36,7 +36,7 @@ bool BioConfirmHomeXYZ::onTouchEnd(uint8_t tag) {
 | 
			
		||||
  switch (tag) {
 | 
			
		||||
    case 1:
 | 
			
		||||
      #ifdef PARK_AND_RELEASE_COMMANDS
 | 
			
		||||
        SpinnerDialogBox::enqueueAndWait_P(F(
 | 
			
		||||
        SpinnerDialogBox::enqueueAndWait(F(
 | 
			
		||||
         "G28\n"
 | 
			
		||||
         PARK_AND_RELEASE_COMMANDS
 | 
			
		||||
        ));
 | 
			
		||||
 
 | 
			
		||||
@@ -54,7 +54,7 @@ void MainMenu::onRedraw(draw_mode_t what) {
 | 
			
		||||
       .tag(8).button(BTN_POS(1,8), BTN_SIZE(2,1), GET_TEXT_F(MSG_ADVANCED_SETTINGS))
 | 
			
		||||
       .tag(9).button(BTN_POS(1,9), BTN_SIZE(2,1), GET_TEXT_F(MSG_INFO_MENU))
 | 
			
		||||
       .colors(action_btn)
 | 
			
		||||
       .tag(1).button(BTN_POS(1,10), BTN_SIZE(2,1), GET_TEXT_F(MSG_BACK));
 | 
			
		||||
       .tag(1).button(BTN_POS(1,10), BTN_SIZE(2,1), GET_TEXT_F(MSG_BUTTON_DONE));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  #undef GRID_COLS
 | 
			
		||||
@@ -67,17 +67,17 @@ bool MainMenu::onTouchEnd(uint8_t tag) {
 | 
			
		||||
  const bool e_homed = isAxisPositionKnown(E0);
 | 
			
		||||
 | 
			
		||||
  switch (tag) {
 | 
			
		||||
    case 1: SaveSettingsDialogBox::promptToSaveSettings();                               break;
 | 
			
		||||
    case 2: GOTO_SCREEN(BioConfirmHomeXYZ);                                              break;
 | 
			
		||||
    case 3: SpinnerDialogBox::enqueueAndWait_P(e_homed ? F("G0 E0 F120") : F("G112"));   break;
 | 
			
		||||
    case 4: StatusScreen::unlockMotors();                                                break;
 | 
			
		||||
    case 1: SaveSettingsDialogBox::promptToSaveSettings();                           break;
 | 
			
		||||
    case 2: GOTO_SCREEN(BioConfirmHomeXYZ);                                          break;
 | 
			
		||||
    case 3: SpinnerDialogBox::enqueueAndWait(e_homed ? F("G0 E0 F120") : F("G112")); break;
 | 
			
		||||
    case 4: StatusScreen::unlockMotors();                                            break;
 | 
			
		||||
    #ifdef AXIS_LEVELING_COMMANDS
 | 
			
		||||
    case 5: SpinnerDialogBox::enqueueAndWait_P(F(AXIS_LEVELING_COMMANDS));               break;
 | 
			
		||||
    case 5: SpinnerDialogBox::enqueueAndWait(F(AXIS_LEVELING_COMMANDS));             break;
 | 
			
		||||
    #endif
 | 
			
		||||
    case 6: GOTO_SCREEN(TemperatureScreen);                                              break;
 | 
			
		||||
    case 7: GOTO_SCREEN(InterfaceSettingsScreen);                                        break;
 | 
			
		||||
    case 8: GOTO_SCREEN(AdvancedSettingsMenu);                                           break;
 | 
			
		||||
    case 9: GOTO_SCREEN(AboutScreen);                                                    break;
 | 
			
		||||
    case 6: GOTO_SCREEN(TemperatureScreen);                                          break;
 | 
			
		||||
    case 7: GOTO_SCREEN(InterfaceSettingsScreen);                                    break;
 | 
			
		||||
    case 8: GOTO_SCREEN(AdvancedSettingsMenu);                                       break;
 | 
			
		||||
    case 9: GOTO_SCREEN(AboutScreen);                                                break;
 | 
			
		||||
    default:
 | 
			
		||||
      return false;
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
@@ -316,7 +316,7 @@ bool StatusScreen::onTouchEnd(uint8_t tag) {
 | 
			
		||||
    case  9: GOTO_SCREEN(FilesScreen); break;
 | 
			
		||||
    case 10: GOTO_SCREEN(MainMenu); break;
 | 
			
		||||
    case 13: GOTO_SCREEN(BioConfirmHomeE); break;
 | 
			
		||||
    case 14: SpinnerDialogBox::enqueueAndWait_P(F("G28Z")); break;
 | 
			
		||||
    case 14: SpinnerDialogBox::enqueueAndWait(F("G28Z")); break;
 | 
			
		||||
    case 15: GOTO_SCREEN(TemperatureScreen);  break;
 | 
			
		||||
    case 16: fine_motion = !fine_motion; break;
 | 
			
		||||
    default: return false;
 | 
			
		||||
 
 | 
			
		||||
@@ -54,7 +54,7 @@ void TuneMenu::onRedraw(draw_mode_t what) {
 | 
			
		||||
       .enabled(!isPrinting()).tag(5).button(BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXT_F(MSG_MOVE_TO_HOME))
 | 
			
		||||
       .enabled(!isPrinting()).tag(6).button(BTN_POS(1,6), BTN_SIZE(2,1), GET_TEXT_F(MSG_RAISE_PLUNGER))
 | 
			
		||||
       .enabled(!isPrinting()).tag(7).button(BTN_POS(1,7), BTN_SIZE(2,1), GET_TEXT_F(MSG_RELEASE_XY_AXIS))
 | 
			
		||||
       .colors(action_btn)    .tag(1).button(BTN_POS(1,8), BTN_SIZE(2,1), GET_TEXT_F(MSG_BACK));
 | 
			
		||||
       .colors(action_btn)    .tag(1).button(BTN_POS(1,8), BTN_SIZE(2,1), GET_TEXT_F(MSG_BUTTON_DONE));
 | 
			
		||||
  }
 | 
			
		||||
  #undef GRID_COLS
 | 
			
		||||
  #undef GRID_ROWS
 | 
			
		||||
@@ -67,7 +67,7 @@ bool TuneMenu::onTouchEnd(uint8_t tag) {
 | 
			
		||||
    case 3: GOTO_SCREEN(TemperatureScreen);                      break;
 | 
			
		||||
    case 4: GOTO_SCREEN(NudgeNozzleScreen);                      break;
 | 
			
		||||
    case 5: GOTO_SCREEN(BioConfirmHomeXYZ);                      break;
 | 
			
		||||
    case 6: SpinnerDialogBox::enqueueAndWait_P(F("G0 E0 F120")); break;
 | 
			
		||||
    case 6: SpinnerDialogBox::enqueueAndWait(F("G0 E0 F120")); break;
 | 
			
		||||
    case 7: StatusScreen::unlockMotors();                        break;
 | 
			
		||||
    default:
 | 
			
		||||
      return false;
 | 
			
		||||
 
 | 
			
		||||
@@ -67,7 +67,7 @@ void AdvancedSettingsMenu::onRedraw(draw_mode_t what) {
 | 
			
		||||
      .tag(10).button(DISPLAY_POS,            GET_TEXT_F(MSG_DISPLAY_MENU))
 | 
			
		||||
      .tag(11).button(RESTORE_DEFAULTS_POS,   GET_TEXT_F(MSG_RESTORE_DEFAULTS))
 | 
			
		||||
      .colors(action_btn)
 | 
			
		||||
      .tag(1).button(BACK_POS,                GET_TEXT_F(MSG_BACK));
 | 
			
		||||
      .tag(1).button(BACK_POS,                GET_TEXT_F(MSG_BUTTON_DONE));
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -71,7 +71,7 @@ void LevelingMenu::onRedraw(draw_mode_t what) {
 | 
			
		||||
       #undef  GRID_COLS
 | 
			
		||||
       #define GRID_COLS 3
 | 
			
		||||
       .colors(action_btn)
 | 
			
		||||
       .tag(1).button(BACK_POS, GET_TEXT_F(MSG_BACK));
 | 
			
		||||
       .tag(1).button(BACK_POS, GET_TEXT_F(MSG_BUTTON_DONE));
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -82,7 +82,7 @@ bool LevelingMenu::onTouchEnd(uint8_t tag) {
 | 
			
		||||
    case 3: BedMeshViewScreen::show(); break;
 | 
			
		||||
    case 4: BedMeshEditScreen::show(); break;
 | 
			
		||||
    case 5: injectCommands_P(PSTR("M280 P0 S60")); break;
 | 
			
		||||
    case 6: SpinnerDialogBox::enqueueAndWait_P(F("M280 P0 S90\nG4 P100\nM280 P0 S120")); break;
 | 
			
		||||
    case 6: SpinnerDialogBox::enqueueAndWait(F("M280 P0 S90\nG4 P100\nM280 P0 S120")); break;
 | 
			
		||||
    default: return false;
 | 
			
		||||
  }
 | 
			
		||||
  return true;
 | 
			
		||||
 
 | 
			
		||||
@@ -90,7 +90,7 @@ void LoadChocolateScreen::draw_buttons(draw_mode_t what) {
 | 
			
		||||
  cmd.tag(3).button(x, y, h, v, GET_TEXT_F(MSG_FULL_LOAD));
 | 
			
		||||
 | 
			
		||||
  ui.bounds(POLY(load_screen_back_btn), x, y, h, v);
 | 
			
		||||
  cmd.tag(1).colors(action_btn).button(x, y, h, v, GET_TEXT_F(MSG_BACK));
 | 
			
		||||
  cmd.tag(1).colors(action_btn).button(x, y, h, v, GET_TEXT_F(MSG_BUTTON_DONE));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void LoadChocolateScreen::draw_text(draw_mode_t what) {
 | 
			
		||||
 
 | 
			
		||||
@@ -68,7 +68,7 @@ void MainMenu::onRedraw(draw_mode_t what) {
 | 
			
		||||
       .tag(10).button(LEVELING_POS,          GET_TEXT_F(MSG_LEVELING))
 | 
			
		||||
       .tag(11).button(ABOUT_PRINTER_POS,     GET_TEXT_F(MSG_INFO_MENU))
 | 
			
		||||
       .colors(action_btn)
 | 
			
		||||
       .tag(1).button(BACK_POS,               GET_TEXT_F(MSG_BACK));
 | 
			
		||||
       .tag(1).button(BACK_POS,               GET_TEXT_F(MSG_BUTTON_DONE));
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -65,7 +65,7 @@ void PreheatMenu::onRedraw(draw_mode_t what) {
 | 
			
		||||
      }
 | 
			
		||||
    #endif
 | 
			
		||||
    cmd.colors(action_btn)
 | 
			
		||||
       .tag(1) .button(BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXT_F(MSG_BACK));
 | 
			
		||||
       .tag(1) .button(BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXT_F(MSG_BUTTON_DONE));
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -77,7 +77,7 @@ void PreheatTimerScreen::draw_interaction_buttons(draw_mode_t what) {
 | 
			
		||||
    CommandProcessor cmd;
 | 
			
		||||
    cmd.colors(normal_btn)
 | 
			
		||||
       .font(font_medium)
 | 
			
		||||
       .tag(1).button(BACK_POS, GET_TEXT_F(MSG_BACK));
 | 
			
		||||
       .tag(1).button(BACK_POS, GET_TEXT_F(MSG_BUTTON_DONE));
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -108,7 +108,6 @@ enum {
 | 
			
		||||
#include "../generic/display_tuning_screen.h"
 | 
			
		||||
#include "../generic/statistics_screen.h"
 | 
			
		||||
#include "../generic/stepper_current_screen.h"
 | 
			
		||||
#include "../generic/leveling_menu.h"
 | 
			
		||||
#include "../generic/z_offset_screen.h"
 | 
			
		||||
#include "../generic/bed_mesh_base.h"
 | 
			
		||||
#include "../generic/bed_mesh_view_screen.h"
 | 
			
		||||
@@ -130,5 +129,6 @@ enum {
 | 
			
		||||
#include "preheat_menu.h"
 | 
			
		||||
#include "preheat_screen.h"
 | 
			
		||||
#include "load_chocolate.h"
 | 
			
		||||
#include "leveling_menu.h"
 | 
			
		||||
#include "move_xyz_screen.h"
 | 
			
		||||
#include "move_e_screen.h"
 | 
			
		||||
 
 | 
			
		||||
@@ -233,7 +233,7 @@ bool StatusScreen::onTouchStart(uint8_t) {
 | 
			
		||||
 | 
			
		||||
bool StatusScreen::onTouchEnd(uint8_t tag) {
 | 
			
		||||
  switch (tag) {
 | 
			
		||||
    case  1: SpinnerDialogBox::enqueueAndWait_P(F("G28 O\nG27")); break;
 | 
			
		||||
    case  1: SpinnerDialogBox::enqueueAndWait(F("G28 O\nG27")); break;
 | 
			
		||||
    case  2: GOTO_SCREEN(LoadChocolateScreen); break;
 | 
			
		||||
    case  3: GOTO_SCREEN(PreheatMenu); break;
 | 
			
		||||
    case  4: GOTO_SCREEN(MainMenu); break;
 | 
			
		||||
 
 | 
			
		||||
@@ -42,7 +42,7 @@ namespace FTDI {
 | 
			
		||||
      strcat_P(str, (const char*) units);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    cmd.text(VAL_POS, str);
 | 
			
		||||
    cmd.tag(0).text(VAL_POS, str);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void draw_adjuster(CommandProcessor& cmd, int16_t x, int16_t y, int16_t w, int16_t h, uint8_t tag, float value, progmem_str units, int8_t width, uint8_t precision, draw_mode_t what) {
 | 
			
		||||
 
 | 
			
		||||
@@ -232,13 +232,11 @@ class CommandProcessor : public CLCD::CommandFifo {
 | 
			
		||||
    FORCEDINLINE CommandProcessor& toggle(int16_t x, int16_t y, int16_t w, int16_t h, T text, bool state, uint16_t options = FTDI::OPT_3D) {
 | 
			
		||||
      CLCD::FontMetrics fm(_font);
 | 
			
		||||
      const int16_t widget_h = fm.height * 20.0 / 16;
 | 
			
		||||
      //const int16_t outer_bar_r = widget_h / 2;
 | 
			
		||||
      //const int16_t knob_r      = outer_bar_r - 1.5;
 | 
			
		||||
      // The y coordinate of the toggle is the baseline of the text,
 | 
			
		||||
      // so we must introduce a fudge factor based on the line height to
 | 
			
		||||
      // actually center the control.
 | 
			
		||||
      const int16_t fudge_y = fm.height * 5 / 16;
 | 
			
		||||
      CLCD::CommandFifo::toggle(x + h / 2, y + (h - widget_h) / 2 + fudge_y, w - h, _font, options, state);
 | 
			
		||||
      CLCD::CommandFifo::toggle(x + widget_h, y + (h - widget_h) / 2 + fudge_y, w - widget_h, _font, options, state);
 | 
			
		||||
      CLCD::CommandFifo::str(text);
 | 
			
		||||
      return *this;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -67,12 +67,12 @@ namespace FTDI {
 | 
			
		||||
    width = height = 0;
 | 
			
		||||
    for (;;) {
 | 
			
		||||
      const uint16_t line_width = find_line_break(utf8_fm, clcd_fm, wrap_width, line_start, line_end, use_utf8);
 | 
			
		||||
      if (line_end == line_start) break;
 | 
			
		||||
      width  = max(width, line_width);
 | 
			
		||||
      height += utf8_fm.get_height();
 | 
			
		||||
      if (*line_end == '\n' || *line_end == ' ') line_end++;
 | 
			
		||||
      if (*line_end == '\0') break;
 | 
			
		||||
      if (line_end == line_start) break;
 | 
			
		||||
      line_start = line_end;
 | 
			
		||||
      if (*line_start == '\n' || *line_start == ' ') line_start++;
 | 
			
		||||
      if (*line_start == '\0') break;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -109,7 +109,6 @@ namespace FTDI {
 | 
			
		||||
    const char *line_start = str, *line_end;
 | 
			
		||||
    for (;;) {
 | 
			
		||||
      find_line_break(utf8_fm, clcd_fm, w, line_start, line_end, use_utf8);
 | 
			
		||||
      if (line_end == line_start) break;
 | 
			
		||||
 | 
			
		||||
      const size_t line_len = line_end - line_start;
 | 
			
		||||
      if (line_len) {
 | 
			
		||||
@@ -125,9 +124,10 @@ namespace FTDI {
 | 
			
		||||
      }
 | 
			
		||||
      y += utf8_fm.get_height();
 | 
			
		||||
 | 
			
		||||
      if (*line_end == '\n' || *line_end == ' ') line_end++;
 | 
			
		||||
      if (*line_end == '\0') break;
 | 
			
		||||
      if (line_end == line_start) break;
 | 
			
		||||
      line_start = line_end;
 | 
			
		||||
      if (*line_start == '\n' || *line_start == ' ') line_start++;
 | 
			
		||||
      if (*line_start == '\0') break;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -29,30 +29,30 @@ namespace FTDI {
 | 
			
		||||
   * Helper function for drawing text with ellipses. The str buffer may be modified and should have space for up to two extra characters.
 | 
			
		||||
   */
 | 
			
		||||
  static void _draw_text_with_ellipsis(CommandProcessor& cmd, int16_t x, int16_t y, int16_t w, int16_t h, char *str, uint16_t options, uint8_t font) {
 | 
			
		||||
    FontMetrics fm(font);
 | 
			
		||||
    const int16_t ellipsisWidth = fm.get_char_width('.') * 3;
 | 
			
		||||
    #if ENABLED(TOUCH_UI_USE_UTF8)
 | 
			
		||||
      const bool use_utf8 = has_utf8_chars(str);
 | 
			
		||||
      #define CHAR_WIDTH(c) use_utf8 ? utf8_fm.get_char_width(c) : clcd_fm.char_widths[(uint8_t)c]
 | 
			
		||||
    #else
 | 
			
		||||
      #define CHAR_WIDTH(c) utf8_fm.get_char_width(c)
 | 
			
		||||
      constexpr bool use_utf8 = false;
 | 
			
		||||
    #endif
 | 
			
		||||
    FontMetrics utf8_fm(font);
 | 
			
		||||
    CLCD::FontMetrics clcd_fm;
 | 
			
		||||
    clcd_fm.load(font);
 | 
			
		||||
    const int16_t ellipsisWidth = utf8_fm.get_char_width('.') * 3;
 | 
			
		||||
 | 
			
		||||
    // Compute the total line length, as well as
 | 
			
		||||
    // the location in the string where it can
 | 
			
		||||
    // split and still allow the ellipsis to fit.
 | 
			
		||||
    int16_t lineWidth = 0;
 | 
			
		||||
    char *breakPoint   = str;
 | 
			
		||||
    #ifdef TOUCH_UI_USE_UTF8
 | 
			
		||||
      char *tstr = str;
 | 
			
		||||
      while (*tstr) {
 | 
			
		||||
        breakPoint = tstr;
 | 
			
		||||
        const utf8_char_t c = get_utf8_char_and_inc(tstr);
 | 
			
		||||
        lineWidth += fm.get_char_width(c);
 | 
			
		||||
        if (lineWidth + ellipsisWidth < w)
 | 
			
		||||
          break;
 | 
			
		||||
      }
 | 
			
		||||
    #else
 | 
			
		||||
      for (char *c = str; *c; c++) {
 | 
			
		||||
        lineWidth += fm.get_char_width(*c);
 | 
			
		||||
        if (lineWidth + ellipsisWidth < w)
 | 
			
		||||
          breakPoint = c;
 | 
			
		||||
      }
 | 
			
		||||
    #endif
 | 
			
		||||
    char *breakPoint = str;
 | 
			
		||||
    char *next = str;
 | 
			
		||||
    while (*next) {
 | 
			
		||||
      const utf8_char_t c = get_utf8_char_and_inc(next);
 | 
			
		||||
      lineWidth += CHAR_WIDTH(c);
 | 
			
		||||
      if (lineWidth + ellipsisWidth < w)
 | 
			
		||||
        breakPoint = next;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (lineWidth > w) {
 | 
			
		||||
      *breakPoint = '\0';
 | 
			
		||||
@@ -61,7 +61,7 @@ namespace FTDI {
 | 
			
		||||
 | 
			
		||||
    cmd.apply_text_alignment(x, y, w, h, options);
 | 
			
		||||
    #if ENABLED(TOUCH_UI_USE_UTF8)
 | 
			
		||||
      if (has_utf8_chars(str)) {
 | 
			
		||||
      if (use_utf8) {
 | 
			
		||||
        draw_utf8_text(cmd, x, y, str, font_size_t::from_romfont(font), options);
 | 
			
		||||
      } else
 | 
			
		||||
    #endif
 | 
			
		||||
 
 | 
			
		||||
@@ -68,15 +68,17 @@
 | 
			
		||||
 | 
			
		||||
  utf8_char_t FTDI::get_utf8_char_and_inc(const char *&c) {
 | 
			
		||||
    utf8_char_t val = *(uint8_t*)c++;
 | 
			
		||||
    while ((*c & 0xC0) == 0x80)
 | 
			
		||||
      val = (val << 8) | *(uint8_t*)c++;
 | 
			
		||||
    if ((val & 0xC0) == 0xC0)
 | 
			
		||||
      while ((*c & 0xC0) == 0x80)
 | 
			
		||||
        val = (val << 8) | *(uint8_t*)c++;
 | 
			
		||||
    return val;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  utf8_char_t FTDI::get_utf8_char_and_inc(char *&c) {
 | 
			
		||||
    utf8_char_t val = *(uint8_t*)c++;
 | 
			
		||||
    while ((*c & 0xC0) == 0x80)
 | 
			
		||||
      val = (val << 8) | *(uint8_t*)c++;
 | 
			
		||||
    if ((val & 0xC0) == 0xC0)
 | 
			
		||||
      while ((*c & 0xC0) == 0x80)
 | 
			
		||||
        val = (val << 8) | *(uint8_t*)c++;
 | 
			
		||||
    return val;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -96,7 +96,7 @@ void AboutScreen::onRedraw(draw_mode_t) {
 | 
			
		||||
       .tag(2).button(STATS_POS, GET_TEXT_F(MSG_INFO_STATS_MENU));
 | 
			
		||||
  #endif
 | 
			
		||||
  cmd.colors(action_btn)
 | 
			
		||||
     .tag(1).button(BACK_POS,  GET_TEXT_F(MSG_BACK));
 | 
			
		||||
     .tag(1).button(BACK_POS,  GET_TEXT_F(MSG_BUTTON_DONE));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool AboutScreen::onTouchEnd(uint8_t tag) {
 | 
			
		||||
 
 | 
			
		||||
@@ -111,7 +111,7 @@ void AdvancedSettingsMenu::onRedraw(draw_mode_t what) {
 | 
			
		||||
      .enabled(ENABLED(BACKLASH_GCODE))
 | 
			
		||||
      .tag(8).button(BACKLASH_POS,            GET_TEXT_F(MSG_BACKLASH))
 | 
			
		||||
      .colors(action_btn)
 | 
			
		||||
      .tag(1).button(BACK_POS,                GET_TEXT_F(MSG_BACK));
 | 
			
		||||
      .tag(1).button(BACK_POS,                GET_TEXT_F(MSG_BUTTON_DONE));
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -43,7 +43,7 @@ void AlertDialogBox::onRedraw(draw_mode_t what) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<typename T>
 | 
			
		||||
void AlertDialogBox::show(const T message) {
 | 
			
		||||
void AlertDialogBox::show(T message) {
 | 
			
		||||
  drawMessage(message);
 | 
			
		||||
  storeBackground();
 | 
			
		||||
  mydata.isError = false;
 | 
			
		||||
@@ -51,7 +51,7 @@ void AlertDialogBox::show(const T message) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<typename T>
 | 
			
		||||
void AlertDialogBox::showError(const T message) {
 | 
			
		||||
void AlertDialogBox::showError(T message) {
 | 
			
		||||
  drawMessage(message);
 | 
			
		||||
  storeBackground();
 | 
			
		||||
  mydata.isError = true;
 | 
			
		||||
@@ -64,8 +64,8 @@ void AlertDialogBox::hide() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template void AlertDialogBox::show(const char *);
 | 
			
		||||
template void AlertDialogBox::show(const progmem_str);
 | 
			
		||||
template void AlertDialogBox::show(progmem_str);
 | 
			
		||||
template void AlertDialogBox::showError(const char *);
 | 
			
		||||
template void AlertDialogBox::showError(const progmem_str);
 | 
			
		||||
template void AlertDialogBox::showError(progmem_str);
 | 
			
		||||
 | 
			
		||||
#endif // FTDI_ALERT_DIALOG_BOX
 | 
			
		||||
 
 | 
			
		||||
@@ -61,7 +61,7 @@ BaseNumericAdjustmentScreen::widgets_t::widgets_t(draw_mode_t what) : _what(what
 | 
			
		||||
    #else
 | 
			
		||||
      BTN_POS(15,7), BTN_SIZE(4,1),
 | 
			
		||||
    #endif
 | 
			
		||||
    GET_TEXT_F(MSG_BACK), true, true
 | 
			
		||||
    GET_TEXT_F(MSG_BUTTON_DONE), true, true
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  _line = 1;
 | 
			
		||||
 
 | 
			
		||||
@@ -136,7 +136,7 @@ void BedMeshEditScreen::drawHighlightedPointValue() {
 | 
			
		||||
  if (mydata.highlight.x != NONE)
 | 
			
		||||
    draw_adjuster(cmd, Z_VALUE_POS, 3, getHighlightedValue(), GET_TEXT_F(MSG_UNITS_MM), 4, 3);
 | 
			
		||||
  cmd.colors(mydata.needSave ? normal_btn : action_btn)
 | 
			
		||||
     .tag(1).button(BACK_POS, GET_TEXT_F(MSG_BUTTON_BACK))
 | 
			
		||||
     .tag(1).button(BACK_POS, GET_TEXT_F(MSG_BUTTON_DONE))
 | 
			
		||||
     .colors(mydata.needSave ? action_btn : normal_btn)
 | 
			
		||||
     .enabled(mydata.needSave)
 | 
			
		||||
     .tag(2).button(SAVE_POS, GET_TEXT_F(MSG_TOUCHMI_SAVE));
 | 
			
		||||
@@ -191,7 +191,7 @@ bool BedMeshEditScreen::onTouchEnd(uint8_t tag) {
 | 
			
		||||
 | 
			
		||||
void BedMeshEditScreen::show() {
 | 
			
		||||
  // On entry, always home (to account for possible Z offset changes) and save current mesh
 | 
			
		||||
  SpinnerDialogBox::enqueueAndWait_P(F("G28\nG29 S1"));
 | 
			
		||||
  SpinnerDialogBox::enqueueAndWait(F("G28\nG29 S1"));
 | 
			
		||||
  // After the spinner, go to this screen.
 | 
			
		||||
  current_screen.forget();
 | 
			
		||||
  PUSH_SCREEN(BedMeshEditScreen);
 | 
			
		||||
 
 | 
			
		||||
@@ -224,7 +224,7 @@ void ChangeFilamentScreen::onRedraw(draw_mode_t what) {
 | 
			
		||||
       .tag(6)                .enabled(t_ok).button (LOAD_MOMN_POS, GET_TEXT_F(MSG_MOMENTARY))
 | 
			
		||||
       .tag(7).TOG_STYLE(tog7).enabled(t_ok).button (UNLD_CONT_POS, GET_TEXT_F(MSG_CONTINUOUS))
 | 
			
		||||
       .tag(8).TOG_STYLE(tog8).enabled(t_ok).button (LOAD_CONT_POS, GET_TEXT_F(MSG_CONTINUOUS))
 | 
			
		||||
       .tag(1).colors(action_btn)           .button (BACK_POS, GET_TEXT_F(MSG_BACK));
 | 
			
		||||
       .tag(1).colors(action_btn)           .button (BACK_POS, GET_TEXT_F(MSG_BUTTON_DONE));
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -135,7 +135,7 @@ void CustomUserMenus::onRedraw(draw_mode_t what) {
 | 
			
		||||
        _USER_ITEM(20)
 | 
			
		||||
       #endif
 | 
			
		||||
      .colors(action_btn)
 | 
			
		||||
      .tag(1).button(BACK_POS, GET_TEXT_F(MSG_BACK));
 | 
			
		||||
      .tag(1).button(BACK_POS, GET_TEXT_F(MSG_BUTTON_DONE));
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -32,14 +32,14 @@ using namespace Theme;
 | 
			
		||||
#define GRID_ROWS 8
 | 
			
		||||
 | 
			
		||||
template<typename T>
 | 
			
		||||
void DialogBoxBaseClass::drawMessage(const T message, int16_t font) {
 | 
			
		||||
void DialogBoxBaseClass::drawMessage(T message, int16_t font) {
 | 
			
		||||
  CommandProcessor cmd;
 | 
			
		||||
  cmd.cmd(CMD_DLSTART)
 | 
			
		||||
     .cmd(CLEAR_COLOR_RGB(bg_color))
 | 
			
		||||
     .cmd(CLEAR(true,true,true))
 | 
			
		||||
     .cmd(COLOR_RGB(bg_text_enabled))
 | 
			
		||||
     .tag(0);
 | 
			
		||||
  draw_text_box(cmd, BTN_POS(1,1), BTN_SIZE(2,3), message, OPT_CENTER, font ? font : font_large);
 | 
			
		||||
  draw_text_box(cmd, BTN_POS(1,1), BTN_SIZE(2,6), message, OPT_CENTER, font ? font : font_large);
 | 
			
		||||
  cmd.colors(normal_btn);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -59,17 +59,15 @@ void DialogBoxBaseClass::drawOkayButton() {
 | 
			
		||||
     .tag(1).button(BTN_POS(1,8), BTN_SIZE(2,1), GET_TEXT_F(MSG_BUTTON_OKAY));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void DialogBoxBaseClass::drawButton(const progmem_str label) {
 | 
			
		||||
template<typename T>
 | 
			
		||||
void DialogBoxBaseClass::drawButton(T label) {
 | 
			
		||||
  CommandProcessor cmd;
 | 
			
		||||
  cmd.font(font_medium)
 | 
			
		||||
     .tag(1).button(BTN_POS(1,8), BTN_SIZE(2,1), label);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void DialogBoxBaseClass::drawSpinner() {
 | 
			
		||||
  CommandProcessor cmd;
 | 
			
		||||
  cmd.cmd(COLOR_RGB(bg_text_enabled))
 | 
			
		||||
     .spinner(BTN_POS(1,4), BTN_SIZE(2,3)).execute();
 | 
			
		||||
}
 | 
			
		||||
template void DialogBoxBaseClass::drawButton(const char *);
 | 
			
		||||
template void DialogBoxBaseClass::drawButton(progmem_str);
 | 
			
		||||
 | 
			
		||||
bool DialogBoxBaseClass::onTouchEnd(uint8_t tag) {
 | 
			
		||||
  switch (tag) {
 | 
			
		||||
 
 | 
			
		||||
@@ -27,11 +27,10 @@
 | 
			
		||||
 | 
			
		||||
class DialogBoxBaseClass : public BaseScreen {
 | 
			
		||||
  protected:
 | 
			
		||||
    template<typename T> static void drawMessage(const T, int16_t font = 0);
 | 
			
		||||
    template<typename T> static void drawMessage(T, int16_t font = 0);
 | 
			
		||||
    template<typename T> static void drawButton(T);
 | 
			
		||||
    static void drawYesNoButtons(uint8_t default_btn = 0);
 | 
			
		||||
    static void drawOkayButton();
 | 
			
		||||
    static void drawSpinner();
 | 
			
		||||
    static void drawButton(const progmem_str);
 | 
			
		||||
 | 
			
		||||
    static void onRedraw(draw_mode_t) {};
 | 
			
		||||
  public:
 | 
			
		||||
 
 | 
			
		||||
@@ -120,7 +120,7 @@ void EndstopStatesScreen::onRedraw(draw_mode_t) {
 | 
			
		||||
 | 
			
		||||
  cmd.font(font_medium)
 | 
			
		||||
     .colors(action_btn)
 | 
			
		||||
     .tag(1).button(BTN_POS(1,7), BTN_SIZE(6,1), GET_TEXT_F(MSG_BACK));
 | 
			
		||||
     .tag(1).button(BTN_POS(1,7), BTN_SIZE(6,1), GET_TEXT_F(MSG_BUTTON_DONE));
 | 
			
		||||
  #undef GRID_COLS
 | 
			
		||||
  #undef GRID_ROWS
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -63,7 +63,7 @@ void FilamentMenu::onRedraw(draw_mode_t what) {
 | 
			
		||||
       .enabled(ENABLED(LIN_ADVANCE))
 | 
			
		||||
       .tag(3).button(LIN_ADVANCE_POS, GET_TEXT_F(MSG_LINEAR_ADVANCE))
 | 
			
		||||
       .colors(action_btn)
 | 
			
		||||
       .tag(1).button(BACK_POS, GET_TEXT_F(MSG_BACK));
 | 
			
		||||
       .tag(1).button(BACK_POS, GET_TEXT_F(MSG_BUTTON_DONE));
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -168,7 +168,7 @@ void FilesScreen::drawFooter() {
 | 
			
		||||
  cmd.colors(normal_btn)
 | 
			
		||||
     .font(font_medium)
 | 
			
		||||
     .colors(has_selection ? normal_btn : action_btn)
 | 
			
		||||
     .tag(back_tag).button(BTN_POS(4,y), BTN_SIZE(3,h), GET_TEXT_F(MSG_BACK))
 | 
			
		||||
     .tag(back_tag).button(BTN_POS(4,y), BTN_SIZE(3,h), GET_TEXT_F(MSG_BUTTON_DONE))
 | 
			
		||||
     .enabled(has_selection)
 | 
			
		||||
     .colors(has_selection ? action_btn : normal_btn);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -104,15 +104,15 @@ void InterfaceSettingsScreen::onRedraw(draw_mode_t what) {
 | 
			
		||||
    #endif
 | 
			
		||||
    #undef EDGE_R
 | 
			
		||||
    #define EDGE_R 0
 | 
			
		||||
    #if ENABLED(TOUCH_UI_PORTRAIT)
 | 
			
		||||
       .colors(normal_btn)
 | 
			
		||||
    #if ENABLED(TOUCH_UI_PORTRAIT)
 | 
			
		||||
       .tag(6).button (BTN_POS(1,6), BTN_SIZE(4,1), GET_TEXT_F(MSG_SOUNDS))
 | 
			
		||||
       .colors(action_btn)
 | 
			
		||||
       .tag(1).button (BTN_POS(1,7), BTN_SIZE(4,1), GET_TEXT_F(MSG_BACK));
 | 
			
		||||
       .tag(1).button (BTN_POS(1,7), BTN_SIZE(4,1), GET_TEXT_F(MSG_BUTTON_DONE));
 | 
			
		||||
    #else
 | 
			
		||||
       .tag(6).button (BTN_POS(1,6), BTN_SIZE(2,1), GET_TEXT_F(MSG_SOUNDS))
 | 
			
		||||
       .colors(action_btn)
 | 
			
		||||
       .tag(1).button (BTN_POS(3,6), BTN_SIZE(2,1), GET_TEXT_F(MSG_BACK));
 | 
			
		||||
       .tag(1).button (BTN_POS(3,6), BTN_SIZE(2,1), GET_TEXT_F(MSG_BUTTON_DONE));
 | 
			
		||||
    #endif
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -74,8 +74,7 @@ void InterfaceSoundsScreen::onRedraw(draw_mode_t what) {
 | 
			
		||||
    #undef EDGE_R
 | 
			
		||||
    #define EDGE_R 30
 | 
			
		||||
       .font(font_small)
 | 
			
		||||
       .tag(0).text      (BTN_POS(1,2), BTN_SIZE(2,1), GET_TEXT_F(MSG_SOUND_VOLUME),   OPT_RIGHTX | OPT_CENTERY)
 | 
			
		||||
              .text      (BTN_POS(1,3), BTN_SIZE(2,1), GET_TEXT_F(MSG_CLICK_SOUNDS),   OPT_RIGHTX | OPT_CENTERY)
 | 
			
		||||
       .tag(0).text      (BTN_POS(1,3), BTN_SIZE(2,1), GET_TEXT_F(MSG_CLICK_SOUNDS),   OPT_RIGHTX | OPT_CENTERY)
 | 
			
		||||
              .text      (BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXT_F(MSG_PRINT_STARTING), OPT_RIGHTX | OPT_CENTERY)
 | 
			
		||||
              .text      (BTN_POS(1,6), BTN_SIZE(2,1), GET_TEXT_F(MSG_PRINT_FINISHED), OPT_RIGHTX | OPT_CENTERY)
 | 
			
		||||
              .text      (BTN_POS(1,7), BTN_SIZE(2,1), GET_TEXT_F(MSG_PRINT_ERROR),    OPT_RIGHTX | OPT_CENTERY);
 | 
			
		||||
@@ -89,20 +88,18 @@ void InterfaceSoundsScreen::onRedraw(draw_mode_t what) {
 | 
			
		||||
      constexpr uint8_t w = 1;
 | 
			
		||||
    #endif
 | 
			
		||||
 | 
			
		||||
    cmd.font(font_medium)
 | 
			
		||||
       .colors(ui_slider)
 | 
			
		||||
    cmd.font(font_small)
 | 
			
		||||
    #define EDGE_R 30
 | 
			
		||||
       .tag(2).slider    (BTN_POS(3,2), BTN_SIZE(2,1), screen_data.InterfaceSettingsScreen.volume, 0xFF)
 | 
			
		||||
       .colors(ui_toggle)
 | 
			
		||||
       .tag(3).toggle2   (BTN_POS(3,3), BTN_SIZE(w,1), GET_TEXT_F(MSG_NO), GET_TEXT_F(MSG_YES), UIData::touch_sounds_enabled())
 | 
			
		||||
       .tag(2).toggle2   (BTN_POS(3,3), BTN_SIZE(w,1), GET_TEXT_F(MSG_NO), GET_TEXT_F(MSG_YES), UIData::touch_sounds_enabled())
 | 
			
		||||
    #undef EDGE_R
 | 
			
		||||
       .colors(normal_btn)
 | 
			
		||||
    #define EDGE_R 0
 | 
			
		||||
       .tag(4).button    (BTN_POS(3,5), BTN_SIZE(2,1), getSoundSelection(PRINTING_STARTED))
 | 
			
		||||
       .tag(5).button    (BTN_POS(3,6), BTN_SIZE(2,1), getSoundSelection(PRINTING_FINISHED))
 | 
			
		||||
       .tag(6).button    (BTN_POS(3,7), BTN_SIZE(2,1), getSoundSelection(PRINTING_FAILED))
 | 
			
		||||
       .tag(3).button    (BTN_POS(3,5), BTN_SIZE(2,1), getSoundSelection(PRINTING_STARTED))
 | 
			
		||||
       .tag(4).button    (BTN_POS(3,6), BTN_SIZE(2,1), getSoundSelection(PRINTING_FINISHED))
 | 
			
		||||
       .tag(5).button    (BTN_POS(3,7), BTN_SIZE(2,1), getSoundSelection(PRINTING_FAILED))
 | 
			
		||||
       .colors(action_btn)
 | 
			
		||||
       .tag(1).button    (BTN_POS(1,9), BTN_SIZE(4,1), GET_TEXT_F(MSG_BACK));
 | 
			
		||||
       .tag(1).button    (BTN_POS(1,9), BTN_SIZE(4,1), GET_TEXT_F(MSG_BUTTON_DONE));
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -114,10 +111,10 @@ void InterfaceSoundsScreen::onEntry() {
 | 
			
		||||
bool InterfaceSoundsScreen::onTouchEnd(uint8_t tag) {
 | 
			
		||||
  switch (tag) {
 | 
			
		||||
    case 1: GOTO_PREVIOUS();                                              return true;
 | 
			
		||||
    case 3: UIData::enable_touch_sounds(!UIData::touch_sounds_enabled()); break;
 | 
			
		||||
    case 4: toggleSoundSelection(PRINTING_STARTED);                       break;
 | 
			
		||||
    case 5: toggleSoundSelection(PRINTING_FINISHED);                      break;
 | 
			
		||||
    case 6: toggleSoundSelection(PRINTING_FAILED);                        break;
 | 
			
		||||
    case 2: UIData::enable_touch_sounds(!UIData::touch_sounds_enabled()); break;
 | 
			
		||||
    case 3: toggleSoundSelection(PRINTING_STARTED);                       break;
 | 
			
		||||
    case 4: toggleSoundSelection(PRINTING_FINISHED);                      break;
 | 
			
		||||
    case 5: toggleSoundSelection(PRINTING_FAILED);                        break;
 | 
			
		||||
    default:
 | 
			
		||||
      return false;
 | 
			
		||||
  }
 | 
			
		||||
@@ -125,35 +122,4 @@ bool InterfaceSoundsScreen::onTouchEnd(uint8_t tag) {
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool InterfaceSoundsScreen::onTouchStart(uint8_t tag) {
 | 
			
		||||
  CommandProcessor cmd;
 | 
			
		||||
  #undef EDGE_R
 | 
			
		||||
  #define EDGE_R 30
 | 
			
		||||
  switch (tag) {
 | 
			
		||||
    case 2: cmd.track_linear(BTN_POS(3,2), BTN_SIZE(2,1), 2).execute(); break;
 | 
			
		||||
    default: break;
 | 
			
		||||
  }
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void InterfaceSoundsScreen::onIdle() {
 | 
			
		||||
  if (refresh_timer.elapsed(TOUCH_UPDATE_INTERVAL)) {
 | 
			
		||||
    refresh_timer.start();
 | 
			
		||||
 | 
			
		||||
    uint16_t value;
 | 
			
		||||
    CommandProcessor cmd;
 | 
			
		||||
    switch (cmd.track_tag(value)) {
 | 
			
		||||
      case 2:
 | 
			
		||||
        screen_data.InterfaceSettingsScreen.volume = value >> 8;
 | 
			
		||||
        SoundPlayer::set_volume(screen_data.InterfaceSettingsScreen.volume);
 | 
			
		||||
        SaveSettingsDialogBox::settingsChanged();
 | 
			
		||||
        break;
 | 
			
		||||
      default:
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    onRefresh();
 | 
			
		||||
  }
 | 
			
		||||
  BaseScreen::onIdle();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif // FTDI_INTERFACE_SOUNDS_SCREEN
 | 
			
		||||
 
 | 
			
		||||
@@ -51,7 +51,5 @@ class InterfaceSoundsScreen : public BaseScreen, public CachedScreen<INTERFACE_S
 | 
			
		||||
 | 
			
		||||
    static void onEntry();
 | 
			
		||||
    static void onRedraw(draw_mode_t);
 | 
			
		||||
    static bool onTouchStart(uint8_t tag);
 | 
			
		||||
    static bool onTouchEnd(uint8_t tag);
 | 
			
		||||
    static void onIdle();
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -96,7 +96,7 @@ void LevelingMenu::onRedraw(draw_mode_t what) {
 | 
			
		||||
       .tag(8).button(BLTOUCH_TEST_POS,  GET_TEXT_F(MSG_BLTOUCH_SELFTEST))
 | 
			
		||||
    #endif
 | 
			
		||||
       .colors(action_btn)
 | 
			
		||||
       .tag(1).button(BACK_POS, GET_TEXT_F(MSG_BACK));
 | 
			
		||||
       .tag(1).button(BACK_POS, GET_TEXT_F(MSG_BUTTON_DONE));
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -104,7 +104,7 @@ bool LevelingMenu::onTouchEnd(uint8_t tag) {
 | 
			
		||||
  switch (tag) {
 | 
			
		||||
    case 1: GOTO_PREVIOUS(); break;
 | 
			
		||||
    #if EITHER(Z_STEPPER_AUTO_ALIGN,MECHANICAL_GANTRY_CALIBRATION)
 | 
			
		||||
      case 2: SpinnerDialogBox::enqueueAndWait_P(F("G34")); break;
 | 
			
		||||
      case 2: SpinnerDialogBox::enqueueAndWait(F("G34")); break;
 | 
			
		||||
    #endif
 | 
			
		||||
    #if HAS_BED_PROBE
 | 
			
		||||
      case 3:
 | 
			
		||||
@@ -114,7 +114,7 @@ bool LevelingMenu::onTouchEnd(uint8_t tag) {
 | 
			
		||||
        #if ENABLED(AUTO_BED_LEVELING_UBL)
 | 
			
		||||
          BedMeshViewScreen::doProbe();
 | 
			
		||||
        #else
 | 
			
		||||
          SpinnerDialogBox::enqueueAndWait_P(F(BED_LEVELING_COMMANDS));
 | 
			
		||||
          SpinnerDialogBox::enqueueAndWait(F(BED_LEVELING_COMMANDS));
 | 
			
		||||
        #endif
 | 
			
		||||
        break;
 | 
			
		||||
    #endif
 | 
			
		||||
@@ -127,7 +127,7 @@ bool LevelingMenu::onTouchEnd(uint8_t tag) {
 | 
			
		||||
    #endif
 | 
			
		||||
    #if ENABLED(BLTOUCH)
 | 
			
		||||
      case 7: injectCommands_P(PSTR("M280 P0 S60")); break;
 | 
			
		||||
      case 8: SpinnerDialogBox::enqueueAndWait_P(F("M280 P0 S90\nG4 P100\nM280 P0 S120")); break;
 | 
			
		||||
      case 8: SpinnerDialogBox::enqueueAndWait(F("M280 P0 S90\nG4 P100\nM280 P0 S120")); break;
 | 
			
		||||
    #endif
 | 
			
		||||
    default: return false;
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
@@ -95,7 +95,7 @@ void MainMenu::onRedraw(draw_mode_t what) {
 | 
			
		||||
        .tag(11).button(CUSTOM_MENU_POS, GET_TEXT_F(MSG_CUSTOM_COMMANDS))
 | 
			
		||||
       #endif
 | 
			
		||||
       .colors(action_btn)
 | 
			
		||||
       .tag(1).button(BACK_POS,             GET_TEXT_F(MSG_BACK));
 | 
			
		||||
       .tag(1).button(BACK_POS,             GET_TEXT_F(MSG_BUTTON_DONE));
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -104,7 +104,7 @@ bool MainMenu::onTouchEnd(uint8_t tag) {
 | 
			
		||||
 | 
			
		||||
  switch (tag) {
 | 
			
		||||
    case 1:  SaveSettingsDialogBox::promptToSaveSettings();           break;
 | 
			
		||||
    case 2:  SpinnerDialogBox::enqueueAndWait_P(F("G28"));            break;
 | 
			
		||||
    case 2:  SpinnerDialogBox::enqueueAndWait(F("G28"));            break;
 | 
			
		||||
    #if ENABLED(NOZZLE_CLEAN_FEATURE)
 | 
			
		||||
      case 3: injectCommands_P(PSTR("G12")); GOTO_SCREEN(StatusScreen); break;
 | 
			
		||||
    #endif
 | 
			
		||||
 
 | 
			
		||||
@@ -98,10 +98,10 @@ bool BaseMoveAxisScreen::onTouchHeld(uint8_t tag) {
 | 
			
		||||
    case 14: UI_DECREMENT_AXIS(E3); mydata.e_rel[3] -= increment; break;
 | 
			
		||||
    case 15: UI_INCREMENT_AXIS(E3); mydata.e_rel[3] += increment; break;
 | 
			
		||||
    #endif
 | 
			
		||||
    case 20: SpinnerDialogBox::enqueueAndWait_P(F("G28X")); break;
 | 
			
		||||
    case 21: SpinnerDialogBox::enqueueAndWait_P(F("G28Y")); break;
 | 
			
		||||
    case 22: SpinnerDialogBox::enqueueAndWait_P(F("G28Z")); break;
 | 
			
		||||
    case 23: SpinnerDialogBox::enqueueAndWait_P(F("G28")); break;
 | 
			
		||||
    case 20: SpinnerDialogBox::enqueueAndWait(F("G28X")); break;
 | 
			
		||||
    case 21: SpinnerDialogBox::enqueueAndWait(F("G28Y")); break;
 | 
			
		||||
    case 22: SpinnerDialogBox::enqueueAndWait(F("G28Z")); break;
 | 
			
		||||
    case 23: SpinnerDialogBox::enqueueAndWait(F("G28")); break;
 | 
			
		||||
    case 24: raiseZtoTop(); break;
 | 
			
		||||
    default:
 | 
			
		||||
      return false;
 | 
			
		||||
 
 | 
			
		||||
@@ -26,43 +26,82 @@
 | 
			
		||||
 | 
			
		||||
#ifdef FTDI_SPINNER_DIALOG_BOX
 | 
			
		||||
 | 
			
		||||
#define GRID_COLS 2
 | 
			
		||||
#define GRID_ROWS 8
 | 
			
		||||
 | 
			
		||||
using namespace FTDI;
 | 
			
		||||
using namespace ExtUI;
 | 
			
		||||
using namespace Theme;
 | 
			
		||||
 | 
			
		||||
constexpr static SpinnerDialogBoxData &mydata = screen_data.SpinnerDialogBox;
 | 
			
		||||
 | 
			
		||||
void SpinnerDialogBox::onRedraw(draw_mode_t) {
 | 
			
		||||
void SpinnerDialogBox::onEntry() {
 | 
			
		||||
  UIScreen::onEntry();
 | 
			
		||||
  mydata.auto_hide = true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SpinnerDialogBox::show(const progmem_str message) {
 | 
			
		||||
  drawMessage(message);
 | 
			
		||||
  drawSpinner();
 | 
			
		||||
  storeBackground();
 | 
			
		||||
  mydata.auto_hide = false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SpinnerDialogBox::hide() {
 | 
			
		||||
void SpinnerDialogBox::onExit() {
 | 
			
		||||
  CommandProcessor cmd;
 | 
			
		||||
  cmd.stop().execute();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SpinnerDialogBox::enqueueAndWait_P(const progmem_str commands) {
 | 
			
		||||
  enqueueAndWait_P(GET_TEXT_F(MSG_PLEASE_WAIT), commands);
 | 
			
		||||
void SpinnerDialogBox::onRefresh() {
 | 
			
		||||
  using namespace FTDI;
 | 
			
		||||
  DLCache dlcache(SPINNER_CACHE);
 | 
			
		||||
  CommandProcessor cmd;
 | 
			
		||||
  cmd.cmd(CMD_DLSTART);
 | 
			
		||||
  if (dlcache.has_data())
 | 
			
		||||
    dlcache.append();
 | 
			
		||||
  else
 | 
			
		||||
    dlcache.store(SPINNER_DL_SIZE);
 | 
			
		||||
  cmd.spinner(BTN_POS(1,4), BTN_SIZE(2,3)).execute();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SpinnerDialogBox::enqueueAndWait_P(const progmem_str message, const progmem_str commands) {
 | 
			
		||||
void SpinnerDialogBox::onRedraw(draw_mode_t) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SpinnerDialogBox::show(progmem_str message) {
 | 
			
		||||
  CommandProcessor cmd;
 | 
			
		||||
  if (AT_SCREEN(SpinnerDialogBox)) cmd.stop().execute();
 | 
			
		||||
  cmd.cmd(CMD_DLSTART)
 | 
			
		||||
     .cmd(CLEAR_COLOR_RGB(bg_color))
 | 
			
		||||
     .cmd(CLEAR(true,true,true))
 | 
			
		||||
     .cmd(COLOR_RGB(bg_text_enabled))
 | 
			
		||||
     .tag(0);
 | 
			
		||||
  draw_text_box(cmd, BTN_POS(1,1), BTN_SIZE(2,3), message, OPT_CENTER, font_large);
 | 
			
		||||
  DLCache dlcache(SPINNER_CACHE);
 | 
			
		||||
  if (!dlcache.store(SPINNER_DL_SIZE)) {
 | 
			
		||||
    SERIAL_ECHO_MSG("CachedScreen::storeBackground() failed: not enough DL cache space");
 | 
			
		||||
    cmd.cmd(CMD_DLSTART).cmd(CLEAR(true,true,true));
 | 
			
		||||
    dlcache.store(SPINNER_DL_SIZE);
 | 
			
		||||
  }
 | 
			
		||||
  if (AT_SCREEN(SpinnerDialogBox))
 | 
			
		||||
    cmd.spinner(BTN_POS(1,4), BTN_SIZE(2,3)).execute();
 | 
			
		||||
  else
 | 
			
		||||
    GOTO_SCREEN(SpinnerDialogBox);
 | 
			
		||||
  mydata.auto_hide = false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SpinnerDialogBox::hide() {
 | 
			
		||||
  GOTO_PREVIOUS();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SpinnerDialogBox::enqueueAndWait(progmem_str message, progmem_str commands) {
 | 
			
		||||
  show(message);
 | 
			
		||||
  GOTO_SCREEN(SpinnerDialogBox);
 | 
			
		||||
  ExtUI::injectCommands_P((const char*)commands);
 | 
			
		||||
  mydata.auto_hide = true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SpinnerDialogBox::enqueueAndWait(progmem_str message, char *commands) {
 | 
			
		||||
  show(message);
 | 
			
		||||
  ExtUI::injectCommands(commands);
 | 
			
		||||
  mydata.auto_hide = true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SpinnerDialogBox::onIdle() {
 | 
			
		||||
  reset_menu_timeout();
 | 
			
		||||
  if (mydata.auto_hide && !commandsInQueue()) {
 | 
			
		||||
  if (mydata.auto_hide && !commandsInQueue() && TERN1(HOST_KEEPALIVE_FEATURE, GcodeSuite::busy_state == GcodeSuite::NOT_BUSY)) {
 | 
			
		||||
    mydata.auto_hide = false;
 | 
			
		||||
    hide();
 | 
			
		||||
    GOTO_PREVIOUS();
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -29,13 +29,20 @@ struct SpinnerDialogBoxData {
 | 
			
		||||
  bool auto_hide;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class SpinnerDialogBox : public DialogBoxBaseClass, public CachedScreen<SPINNER_CACHE,SPINNER_DL_SIZE> {
 | 
			
		||||
class SpinnerDialogBox : public UIScreen {
 | 
			
		||||
  public:
 | 
			
		||||
    static void onEntry();
 | 
			
		||||
    static void onExit();
 | 
			
		||||
    static void onRedraw(draw_mode_t);
 | 
			
		||||
    static void onRefresh();
 | 
			
		||||
    static void onIdle();
 | 
			
		||||
 | 
			
		||||
    static void show(const progmem_str);
 | 
			
		||||
    static void show(progmem_str);
 | 
			
		||||
    static void hide();
 | 
			
		||||
    static void enqueueAndWait_P(const progmem_str commands);
 | 
			
		||||
    static void enqueueAndWait_P(const progmem_str message, const progmem_str commands);
 | 
			
		||||
 | 
			
		||||
    template<typename T>
 | 
			
		||||
    static void enqueueAndWait(T commands) {enqueueAndWait(GET_TEXT_F(MSG_PLEASE_WAIT), commands);}
 | 
			
		||||
 | 
			
		||||
    static void enqueueAndWait(progmem_str message, char *commands);
 | 
			
		||||
    static void enqueueAndWait(progmem_str message, progmem_str commands);
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -63,7 +63,7 @@ void StatisticsScreen::onRedraw(draw_mode_t what) {
 | 
			
		||||
  if (what & FOREGROUND) {
 | 
			
		||||
    cmd.font(Theme::font_medium)
 | 
			
		||||
       .colors(action_btn)
 | 
			
		||||
       .tag(1).button(BTN_POS(1,7), BTN_SIZE(4,1), GET_TEXT_F(MSG_BACK));
 | 
			
		||||
       .tag(1).button(BTN_POS(1,7), BTN_SIZE(4,1), GET_TEXT_F(MSG_BUTTON_DONE));
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -92,7 +92,7 @@ void TuneMenu::onRedraw(draw_mode_t what) {
 | 
			
		||||
       .tag(10).button(CASE_LIGHT_POS, GET_TEXT_F(MSG_CASE_LIGHT))
 | 
			
		||||
       .tag(11).button(ADVANCED_SETTINGS_POS, GET_TEXT_F(MSG_ADVANCED_SETTINGS))
 | 
			
		||||
       .tag(1).colors(action_btn)
 | 
			
		||||
             .button(BACK_POS, GET_TEXT_F(MSG_BACK));
 | 
			
		||||
             .button(BACK_POS, GET_TEXT_F(MSG_BUTTON_DONE));
 | 
			
		||||
  }
 | 
			
		||||
  #undef GRID_COLS
 | 
			
		||||
  #undef GRID_ROWS
 | 
			
		||||
 
 | 
			
		||||
@@ -84,7 +84,7 @@ void ZOffsetScreen::runWizard() {
 | 
			
		||||
  strcat(cmd, str);
 | 
			
		||||
  injectCommands(cmd);
 | 
			
		||||
  // Show instructions for user.
 | 
			
		||||
  AlertDialogBox::show(PSTR("After the printer finishes homing, adjust the Z Offset so that a sheet of paper can pass between the nozzle and bed with slight resistance."));
 | 
			
		||||
  AlertDialogBox::show(F("After the printer finishes homing, adjust the Z Offset so that a sheet of paper can pass between the nozzle and bed with slight resistance."));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool ZOffsetScreen::wizardRunning() {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user