⚡️ Enhance and fix FTDI Eve Touch UI file select (#22651)
This commit is contained in:
		| @@ -0,0 +1,52 @@ | ||||
| /************** | ||||
|  * arrows.cpp * | ||||
|  **************/ | ||||
|  | ||||
| /**************************************************************************** | ||||
|  *   Written By Marcio Teixeira 2021 - SynDaver 3D                          * | ||||
|  *                                                                          * | ||||
|  *   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.                           * | ||||
|  *                                                                          * | ||||
|  *   To view a copy of the GNU General Public License, go to the following  * | ||||
|  *   location: <https://www.gnu.org/licenses/>.                             * | ||||
|  ****************************************************************************/ | ||||
|  | ||||
| #include "ftdi_extended.h" | ||||
|  | ||||
| #if ENABLED(FTDI_EXTENDED) | ||||
|  | ||||
| #define COORD(X,Y) cx + s*(swapXY ? Y : (flipX ? -X : X)), cy + s*(swapXY ? (flipX ? -X : X) : Y) | ||||
|  | ||||
| namespace FTDI { | ||||
|  | ||||
|   void drawArrow(int x, int y, int w, int h, Direction direction) { | ||||
|     const bool swapXY = direction == UP || direction == DOWN; | ||||
|     const bool flipX  = direction == UP || direction == LEFT; | ||||
|     const int s  = min(w,h); | ||||
|     const int cx = (x + w/2)*16; | ||||
|     const int cy = (y + h/2)*16; | ||||
|  | ||||
|     CommandProcessor cmd; | ||||
|     cmd.cmd(SAVE_CONTEXT()) | ||||
|        .cmd(LINE_WIDTH(s/2)) | ||||
|        .cmd(BEGIN(LINES)) | ||||
|        .cmd(VERTEX2F(COORD( 5, 0))) | ||||
|        .cmd(VERTEX2F(COORD( 2,-2))) | ||||
|        .cmd(VERTEX2F(COORD( 5, 0))) | ||||
|        .cmd(VERTEX2F(COORD( 2, 2))) | ||||
|        .cmd(VERTEX2F(COORD( 5, 0))) | ||||
|        .cmd(VERTEX2F(COORD(-5, 0))) | ||||
|        .cmd(RESTORE_CONTEXT()); | ||||
|   } | ||||
|  | ||||
| } // namespace FTDI | ||||
|  | ||||
| #endif // FTDI_EXTENDED | ||||
| @@ -0,0 +1,28 @@ | ||||
| /************ | ||||
|  * arrows.h * | ||||
|  ************/ | ||||
|  | ||||
| /**************************************************************************** | ||||
|  *   Written By Marcio Teixeira 2021 - SynDaver 3D                          * | ||||
|  *                                                                          * | ||||
|  *   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.                           * | ||||
|  *                                                                          * | ||||
|  *   To view a copy of the GNU General Public License, go to the following  * | ||||
|  *   location: <https://www.gnu.org/licenses/>.                             * | ||||
|  ****************************************************************************/ | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| namespace FTDI { | ||||
|   enum Direction {UP, DOWN, LEFT, RIGHT}; | ||||
|  | ||||
|   void drawArrow(int x, int y, int w, int h, Direction direction); | ||||
| } | ||||
| @@ -48,6 +48,7 @@ | ||||
|   #include "sound_list.h" | ||||
|   #include "polygon.h" | ||||
|   #include "poly_ui.h" | ||||
|   #include "arrows.h" | ||||
|   #include "text_box.h" | ||||
|   #include "text_ellipsis.h" | ||||
|   #include "adjuster_widget.h" | ||||
|   | ||||
| @@ -54,23 +54,33 @@ | ||||
| #define EDGE_L           0 | ||||
| #define EDGE_R           0 | ||||
|  | ||||
| // GRID_X and GRID_Y computes the positions of the divisions on | ||||
| // _GRID_X and _GRID_Y computes the positions of the divisions on | ||||
| // the layout grid. | ||||
| #define GRID_X(x)        ((x)*(FTDI::display_width-EDGE_R-EDGE_L)/GRID_COLS+EDGE_L) | ||||
| #define GRID_Y(y)        ((y)*(FTDI::display_height-EDGE_B-EDGE_T)/GRID_ROWS+EDGE_T) | ||||
| #define _GRID_X(x)       ((x)*(FTDI::display_width-EDGE_R-EDGE_L)/GRID_COLS+EDGE_L) | ||||
| #define _GRID_Y(y)       ((y)*(FTDI::display_height-EDGE_B-EDGE_T)/GRID_ROWS+EDGE_T) | ||||
|  | ||||
| // BOX_X, BOX_Y, BOX_W and BOX_X returns the top-left and width | ||||
| // and height of position on the grid. | ||||
|  | ||||
| #define BOX_X(x)         (_GRID_X((x)-1)) | ||||
| #define BOX_Y(y)         (_GRID_Y((y)-1)) | ||||
| #define BOX_W(w)         (_GRID_X(w) - _GRID_X(0)) | ||||
| #define BOX_H(h)         (_GRID_Y(h) - _GRID_Y(0)) | ||||
|  | ||||
| // BTN_X, BTN_Y, BTN_W and BTN_X returns the top-left and width | ||||
| // and height of a button, taking into account the button margins. | ||||
|  | ||||
| #define BTN_X(x)         (GRID_X((x)-1) + MARGIN_L) | ||||
| #define BTN_Y(y)         (GRID_Y((y)-1) + MARGIN_T) | ||||
| #define BTN_W(w)         (GRID_X(w) - GRID_X(0) - MARGIN_L - MARGIN_R) | ||||
| #define BTN_H(h)         (GRID_Y(h) - GRID_Y(0) - MARGIN_T - MARGIN_B) | ||||
| #define BTN_X(x)         (BOX_X(x) + MARGIN_L) | ||||
| #define BTN_Y(y)         (BOX_Y(y) + MARGIN_T) | ||||
| #define BTN_W(w)         (BOX_W(w) - MARGIN_L - MARGIN_R) | ||||
| #define BTN_H(h)         (BOX_H(h) - MARGIN_T - MARGIN_B) | ||||
|  | ||||
| // Abbreviations for common phrases, to allow a button to be | ||||
| // defined in one line of source. | ||||
| // Abbreviations for common phrases, to allow a box or button | ||||
| // to be defined in one line of source. | ||||
| #define BTN_POS(x,y)     BTN_X(x), BTN_Y(y) | ||||
| #define BTN_SIZE(w,h)    BTN_W(w), BTN_H(h) | ||||
| #define BOX_POS(x,y)     BOX_X(x), BOX_Y(y) | ||||
| #define BOX_SIZE(w,h)    BOX_W(w), BOX_H(h) | ||||
|  | ||||
| // Draw a reference grid for ease of spacing out widgets. | ||||
| #define DRAW_LAYOUT_GRID \ | ||||
| @@ -78,13 +88,13 @@ | ||||
|     cmd.cmd(LINE_WIDTH(4)); \ | ||||
|     for (int i = 1; i <= GRID_COLS; i++) { \ | ||||
|       cmd.cmd(BEGIN(LINES)); \ | ||||
|       cmd.cmd(VERTEX2F(GRID_X(i) *16, 0             *16)); \ | ||||
|       cmd.cmd(VERTEX2F(GRID_X(i) *16, FTDI::display_height *16)); \ | ||||
|       cmd.cmd(VERTEX2F(_GRID_X(i) *16, 0             *16)); \ | ||||
|       cmd.cmd(VERTEX2F(_GRID_X(i) *16, FTDI::display_height *16)); \ | ||||
|     } \ | ||||
|     for (int i = 1; i < GRID_ROWS; i++) { \ | ||||
|       cmd.cmd(BEGIN(LINES)); \ | ||||
|       cmd.cmd(VERTEX2F(0                       *16, GRID_Y(i) *16)); \ | ||||
|       cmd.cmd(VERTEX2F(FTDI::display_width     *16, GRID_Y(i) *16)); \ | ||||
|       cmd.cmd(VERTEX2F(0                       *16, _GRID_Y(i) *16)); \ | ||||
|       cmd.cmd(VERTEX2F(FTDI::display_width     *16, _GRID_Y(i) *16)); \ | ||||
|     } \ | ||||
|     cmd.cmd(LINE_WIDTH(16)); \ | ||||
|   } | ||||
|   | ||||
| @@ -157,12 +157,6 @@ void BedMeshViewScreen::doProbe() { | ||||
|   injectCommands_P(PSTR(BED_LEVELING_COMMANDS)); | ||||
| } | ||||
|  | ||||
| void BedMeshViewScreen::doMeshValidation() { | ||||
|   mydata.count = 0; | ||||
|   GOTO_SCREEN(StatusScreen); | ||||
|   injectCommands_P(PSTR("G28\nM117 Heating...\nG26 R X0 Y0\nG27")); | ||||
| } | ||||
|  | ||||
| void BedMeshViewScreen::show() { | ||||
|   injectCommands_P(PSTR("G29 L1")); | ||||
|   GOTO_SCREEN(BedMeshViewScreen); | ||||
|   | ||||
| @@ -43,6 +43,5 @@ class BedMeshViewScreen : public BedMeshBase, public CachedScreen<BED_MESH_VIEW_ | ||||
|     static bool onTouchEnd(uint8_t tag); | ||||
|  | ||||
|     static void doProbe(); | ||||
|     static void doMeshValidation(); | ||||
|     static void show(); | ||||
| }; | ||||
|   | ||||
| @@ -26,6 +26,34 @@ | ||||
|  | ||||
| #ifdef FTDI_FILES_SCREEN | ||||
|  | ||||
| #if ENABLED(TOUCH_UI_PORTRAIT) | ||||
|   #define GRID_COLS  6 | ||||
|   #define GRID_ROWS  15 | ||||
|   #define FILES_PER_PAGE 11 | ||||
|   #define PREV_DIR LEFT | ||||
|   #define NEXT_DIR RIGHT | ||||
|  | ||||
|   #define PREV_POS BTN_POS(1,1),  BTN_SIZE(1,2) | ||||
|   #define HEAD_POS BTN_POS(2,1),  BTN_SIZE(4,2) | ||||
|   #define NEXT_POS BTN_POS(6,1),  BTN_SIZE(1,2) | ||||
|   #define LIST_POS BTN_POS(1,3),  BTN_SIZE(6,FILES_PER_PAGE) | ||||
|   #define BTN1_POS BTN_POS(1,14), BTN_SIZE(3,2) | ||||
|   #define BTN2_POS BTN_POS(4,14), BTN_SIZE(3,2) | ||||
| #else | ||||
|   #define GRID_COLS  12 | ||||
|   #define GRID_ROWS  8 | ||||
|   #define FILES_PER_PAGE 6 | ||||
|   #define PREV_DIR UP | ||||
|   #define NEXT_DIR DOWN | ||||
|  | ||||
|   #define PREV_POS BTN_POS(12,2), BTN_SIZE(1,3) | ||||
|   #define HEAD_POS BTN_POS( 1,1), BTN_SIZE(12,1) | ||||
|   #define NEXT_POS BTN_POS(12,5), BTN_SIZE(1,4) | ||||
|   #define LIST_POS BTN_POS( 1,2), BTN_SIZE(11,FILES_PER_PAGE) | ||||
|   #define BTN1_POS BTN_POS( 1,8), BTN_SIZE(6,1) | ||||
|   #define BTN2_POS BTN_POS( 7,8), BTN_SIZE(5,1) | ||||
| #endif | ||||
|  | ||||
| using namespace FTDI; | ||||
| using namespace ExtUI; | ||||
| using namespace Theme; | ||||
| @@ -49,6 +77,7 @@ const char *FilesScreen::getSelectedFilename(bool longName) { | ||||
| } | ||||
|  | ||||
| void FilesScreen::drawSelectedFile() { | ||||
|   if(mydata.selected_tag == 0xFF) return; | ||||
|   FileList files; | ||||
|   files.seek(getSelectedFileIndex(), true); | ||||
|   mydata.flags.is_dir = files.isDir(); | ||||
| @@ -65,122 +94,108 @@ uint16_t FilesScreen::getSelectedFileIndex() { | ||||
| } | ||||
|  | ||||
| uint16_t FilesScreen::getFileForTag(uint8_t tag) { | ||||
|   return mydata.cur_page * files_per_page + tag - 2; | ||||
|   return mydata.cur_page * FILES_PER_PAGE + tag - 2; | ||||
| } | ||||
|  | ||||
| #if ENABLED(TOUCH_UI_PORTRAIT) | ||||
|   #define GRID_COLS  6 | ||||
|   #define GRID_ROWS (files_per_page + header_h + footer_h) | ||||
| #else | ||||
|   #define GRID_COLS  6 | ||||
|   #define GRID_ROWS (files_per_page + header_h + footer_h) | ||||
| #endif | ||||
| void FilesScreen::drawFileButton(int x, int y, int w, int h, const char *filename, uint8_t tag, bool is_dir, bool is_highlighted) { | ||||
|   #define SUB_COLS 6 | ||||
|   #define SUB_ROWS FILES_PER_PAGE | ||||
|  | ||||
|   const int bx = SUB_X(1); | ||||
|   const int by = SUB_Y(getLineForTag(tag)+1); | ||||
|   const int bw = SUB_W(6); | ||||
|   const int bh = SUB_H(1); | ||||
|  | ||||
| void FilesScreen::drawFileButton(const char *filename, uint8_t tag, bool is_dir, bool is_highlighted) { | ||||
|   const uint8_t line = getLineForTag(tag)+1; | ||||
|   CommandProcessor cmd; | ||||
|   cmd.tag(tag); | ||||
|   cmd.cmd(COLOR_RGB(is_highlighted ? fg_action : bg_color)); | ||||
|   cmd.font(font_medium) | ||||
|      .rectangle( 0, BTN_Y(header_h+line), display_width, BTN_H(1)); | ||||
|   cmd.font(font_medium).rectangle(bx, by, bw, bh); | ||||
|   cmd.cmd(COLOR_RGB(is_highlighted ? normal_btn.rgb : bg_text_enabled)); | ||||
|   constexpr uint16_t dim[2] = {BTN_SIZE(6,1)}; | ||||
|   #define POS_AND_SHORTEN(SHORTEN) BTN_POS(1,header_h+line), dim[0] - (SHORTEN), dim[1] | ||||
|   #define POS_AND_SIZE             POS_AND_SHORTEN(0) | ||||
|   #if ENABLED(SCROLL_LONG_FILENAMES) | ||||
|     if (is_highlighted) { | ||||
|       cmd.cmd(SAVE_CONTEXT()); | ||||
|       cmd.cmd(SCISSOR_XY(x,y)); | ||||
|       cmd.cmd(SCISSOR_SIZE(w,h)); | ||||
|       cmd.cmd(MACRO(0)); | ||||
|       cmd.text(POS_AND_SIZE, filename, OPT_CENTERY | OPT_NOFIT); | ||||
|       cmd.text(bx, by, bw, bh, filename, OPT_CENTERY | OPT_NOFIT); | ||||
|     } else | ||||
|   #endif | ||||
|   draw_text_with_ellipsis(cmd, POS_AND_SHORTEN(is_dir ? 20 : 0), filename, OPT_CENTERY, font_medium); | ||||
|   if (is_dir && !is_highlighted) { | ||||
|     cmd.text(POS_AND_SIZE, F("> "),  OPT_CENTERY | OPT_RIGHTX); | ||||
|   } | ||||
|   draw_text_with_ellipsis(cmd, bx,by, bw - (is_dir ? 20 : 0), bh, filename, OPT_CENTERY, font_medium); | ||||
|   if (is_dir && !is_highlighted) cmd.text(bx, by, bw, bh, F("> "),  OPT_CENTERY | OPT_RIGHTX); | ||||
|   #if ENABLED(SCROLL_LONG_FILENAMES) | ||||
|     if (is_highlighted) { | ||||
|       cmd.cmd(RESTORE_CONTEXT()); | ||||
|     } | ||||
|     if (is_highlighted) cmd.cmd(RESTORE_CONTEXT()); | ||||
|   #endif | ||||
| } | ||||
|  | ||||
| void FilesScreen::drawFileList() { | ||||
|   FileList files; | ||||
|   mydata.num_page = max(1,ceil(float(files.count()) / files_per_page)); | ||||
|   mydata.num_page = max(1,ceil(float(files.count()) / FILES_PER_PAGE)); | ||||
|   mydata.cur_page = min(mydata.cur_page, mydata.num_page-1); | ||||
|   mydata.flags.is_root  = files.isAtRootDir(); | ||||
|  | ||||
|   #undef MARGIN_T | ||||
|   #undef MARGIN_B | ||||
|   #define MARGIN_T 0 | ||||
|   #define MARGIN_B 0 | ||||
|   uint16_t fileIndex = mydata.cur_page * files_per_page; | ||||
|   for (uint8_t i = 0; i < files_per_page; i++, fileIndex++) { | ||||
|     if (files.seek(fileIndex)) { | ||||
|   uint16_t fileIndex = mydata.cur_page * FILES_PER_PAGE; | ||||
|   for (uint8_t i = 0; i < FILES_PER_PAGE; i++, fileIndex++) { | ||||
|     if (files.seek(fileIndex)) | ||||
|       drawFileButton(files.filename(), getTagForLine(i), files.isDir(), false); | ||||
|     } | ||||
|     else { | ||||
|     else | ||||
|       break; | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| void FilesScreen::drawHeader() { | ||||
|   const bool prev_enabled = mydata.cur_page > 0; | ||||
|   const bool next_enabled = mydata.cur_page < (mydata.num_page - 1); | ||||
|  | ||||
|   #undef MARGIN_T | ||||
|   #undef MARGIN_B | ||||
|   #define MARGIN_T 0 | ||||
|   #define MARGIN_B 2 | ||||
|  | ||||
|   char str[16]; | ||||
|   sprintf_P(str, PSTR("Page %d of %d"), | ||||
|     mydata.cur_page + 1, mydata.num_page); | ||||
|   sprintf_P(str, PSTR("Page %d of %d"), mydata.cur_page + 1, mydata.num_page); | ||||
|  | ||||
|   CommandProcessor cmd; | ||||
|   cmd.colors(normal_btn) | ||||
|      .font(font_small) | ||||
|      .tag(0).button(BTN_POS(2,1), BTN_SIZE(4,header_h), str, OPT_CENTER | OPT_FLAT) | ||||
|      .font(font_medium) | ||||
|      .colors(action_btn) | ||||
|      .tag(241).enabled(prev_enabled).button(BTN_POS(1,1), BTN_SIZE(1,header_h), F("<")) | ||||
|      .tag(242).enabled(next_enabled).button(BTN_POS(6,1), BTN_SIZE(1,header_h), F(">")); | ||||
|      .tag(0).button(HEAD_POS, str, OPT_CENTER | OPT_FLAT); | ||||
| } | ||||
|  | ||||
| void FilesScreen::drawArrows() { | ||||
|   const bool prev_enabled = mydata.cur_page > 0; | ||||
|   const bool next_enabled = mydata.cur_page < (mydata.num_page - 1); | ||||
|  | ||||
|   CommandProcessor cmd; | ||||
|   cmd.colors(normal_btn); | ||||
|   cmd.tag(242).enabled(prev_enabled).button(PREV_POS, F("")); if (prev_enabled) drawArrow(PREV_POS, PREV_DIR); | ||||
|   cmd.tag(243).enabled(next_enabled).button(NEXT_POS, F("")); if (next_enabled) drawArrow(NEXT_POS, NEXT_DIR); | ||||
| } | ||||
|  | ||||
| void FilesScreen::drawFooter() { | ||||
|   #undef MARGIN_T | ||||
|   #undef MARGIN_B | ||||
|   #if ENABLED(TOUCH_UI_PORTRAIT) | ||||
|     #define MARGIN_T 15 | ||||
|     #define MARGIN_B 5 | ||||
|   #else | ||||
|     #define MARGIN_T 5 | ||||
|     #define MARGIN_B 5 | ||||
|   #endif | ||||
|   const bool    has_selection = mydata.selected_tag != 0xFF; | ||||
|   const uint8_t back_tag      = mydata.flags.is_root ? 240 : 245; | ||||
|   const uint8_t y             = GRID_ROWS - footer_h + 1; | ||||
|   const uint8_t h             = footer_h; | ||||
|   const bool has_selection = mydata.selected_tag != 0xFF; | ||||
|  | ||||
|   CommandProcessor cmd; | ||||
|   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_BUTTON_DONE)) | ||||
|      .enabled(has_selection) | ||||
|      .colors(has_selection ? normal_btn : action_btn); | ||||
|  | ||||
|   if (mydata.flags.is_root) | ||||
|     cmd.tag(240).button(BTN2_POS, GET_TEXT_F(MSG_BUTTON_DONE)); | ||||
|   else | ||||
|     cmd.tag(245).button(BTN2_POS, F("Up Dir")); | ||||
|  | ||||
|   cmd.enabled(has_selection) | ||||
|      .colors(has_selection ? action_btn : normal_btn); | ||||
|  | ||||
|   if (mydata.flags.is_dir) | ||||
|     cmd.tag(244).button(BTN_POS(1, y), BTN_SIZE(3,h), GET_TEXT_F(MSG_BUTTON_OPEN)); | ||||
|     cmd.tag(244).button(BTN1_POS, GET_TEXT_F(MSG_BUTTON_OPEN)); | ||||
|   else | ||||
|     cmd.tag(243).button(BTN_POS(1, y), BTN_SIZE(3,h), GET_TEXT_F(MSG_BUTTON_PRINT)); | ||||
|     cmd.tag(241).button(BTN1_POS, GET_TEXT_F(MSG_BUTTON_PRINT)); | ||||
| } | ||||
|  | ||||
| void FilesScreen::drawFileButton(const char *filename, uint8_t tag, bool is_dir, bool is_highlighted) { | ||||
|   #undef  MARGIN_L | ||||
|   #undef  MARGIN_R | ||||
|   #define MARGIN_L 0 | ||||
|   #define MARGIN_R 0 | ||||
|   drawFileButton(LIST_POS, filename, tag, is_dir, is_highlighted); | ||||
| } | ||||
|  | ||||
| void FilesScreen::onRedraw(draw_mode_t what) { | ||||
|   if (what & FOREGROUND) { | ||||
|     drawHeader(); | ||||
|     drawArrows(); | ||||
|     drawSelectedFile(); | ||||
|     drawFooter(); | ||||
|   } | ||||
| @@ -200,48 +215,50 @@ void FilesScreen::gotoPage(uint8_t page) { | ||||
|  | ||||
| bool FilesScreen::onTouchEnd(uint8_t tag) { | ||||
|   switch (tag) { | ||||
|     case 240: GOTO_PREVIOUS();                  return true; | ||||
|     case 241: | ||||
|     case 240: // Done button | ||||
|       GOTO_PREVIOUS(); | ||||
|       return true; | ||||
|     case 241: // Print highlighted file | ||||
|       ConfirmStartPrintDialogBox::show(getSelectedFileIndex()); | ||||
|       return true; | ||||
|     case 242: // Previous page | ||||
|       if (mydata.cur_page > 0) { | ||||
|         gotoPage(mydata.cur_page-1); | ||||
|       } | ||||
|       break; | ||||
|     case 242: | ||||
|     case 243: // Next page | ||||
|       if (mydata.cur_page < (mydata.num_page-1)) { | ||||
|         gotoPage(mydata.cur_page+1); | ||||
|       } | ||||
|       break; | ||||
|     case 243: | ||||
|       ConfirmStartPrintDialogBox::show(getSelectedFileIndex()); | ||||
|       return true; | ||||
|     case 244: | ||||
|     case 244: // Select directory | ||||
|       { | ||||
|         FileList files; | ||||
|         files.changeDir(getSelectedShortFilename()); | ||||
|         gotoPage(0); | ||||
|       } | ||||
|       break; | ||||
|     case 245: | ||||
|     case 245: // Up directory | ||||
|       { | ||||
|         FileList files; | ||||
|         files.upDir(); | ||||
|         gotoPage(0); | ||||
|       } | ||||
|       break; | ||||
|     default: | ||||
|     default: // File selected | ||||
|       if (tag < 240) { | ||||
|         mydata.selected_tag = tag; | ||||
|         #if ENABLED(SCROLL_LONG_FILENAMES) && (FTDI_API_LEVEL >= 810) | ||||
|           mydata.scroll_pos = 0; | ||||
|           mydata.scroll_max = 0; | ||||
|           if (FTDI::ftdi_chip >= 810) { | ||||
|             const char *longFilename = getSelectedLongFilename(); | ||||
|             if (longFilename[0]) { | ||||
|               CommandProcessor cmd; | ||||
|               uint16_t text_width = cmd.font(font_medium).text_width(longFilename); | ||||
|               mydata.scroll_pos = 0; | ||||
|               if (text_width > display_width) | ||||
|                 mydata.scroll_max = text_width - display_width + MARGIN_L + MARGIN_R; | ||||
|               else | ||||
|                 mydata.scroll_max = 0; | ||||
|               constexpr int dim[4] = {LIST_POS}; | ||||
|               const uint16_t text_width = cmd.font(font_medium).text_width(longFilename); | ||||
|               if (text_width > dim[2]) | ||||
|                 mydata.scroll_max = text_width - dim[2] + MARGIN_L + MARGIN_R + 10; | ||||
|             } | ||||
|           } | ||||
|         #endif | ||||
|   | ||||
| @@ -41,16 +41,6 @@ struct FilesScreenData { | ||||
|  | ||||
| class FilesScreen : public BaseScreen, public CachedScreen<FILES_SCREEN_CACHE, FILE_SCREEN_DL_SIZE> { | ||||
|   private: | ||||
|     #if ENABLED(TOUCH_UI_PORTRAIT) | ||||
|       static constexpr uint8_t header_h       = 2; | ||||
|       static constexpr uint8_t footer_h       = 2; | ||||
|       static constexpr uint8_t files_per_page = 11; | ||||
|     #else | ||||
|       static constexpr uint8_t header_h       = 1; | ||||
|       static constexpr uint8_t footer_h       = 1; | ||||
|       static constexpr uint8_t files_per_page = 6; | ||||
|     #endif | ||||
|  | ||||
|     static uint8_t  getTagForLine(uint8_t line) {return line + 2;} | ||||
|     static uint8_t  getLineForTag(uint8_t tag)  {return  tag - 2;} | ||||
|     static uint16_t getFileForTag(uint8_t tag); | ||||
| @@ -60,9 +50,11 @@ class FilesScreen : public BaseScreen, public CachedScreen<FILES_SCREEN_CACHE, F | ||||
|     inline static const char *getSelectedLongFilename()  {return getSelectedFilename(true);} | ||||
|     static const char *getSelectedFilename(bool longName); | ||||
|  | ||||
|     static void drawFileButton(int x, int y, int w, int h, const char *filename, uint8_t tag, bool is_dir, bool is_highlighted); | ||||
|     static void drawFileButton(const char *filename, uint8_t tag, bool is_dir, bool is_highlighted); | ||||
|     static void drawFileList(); | ||||
|     static void drawHeader(); | ||||
|     static void drawArrows(); | ||||
|     static void drawFooter(); | ||||
|     static void drawSelectedFile(); | ||||
|  | ||||
|   | ||||
| @@ -123,7 +123,10 @@ bool LevelingMenu::onTouchEnd(uint8_t tag) { | ||||
|       case 5: BedMeshEditScreen::show(); break; | ||||
|     #endif | ||||
|     #if ENABLED(G26_MESH_VALIDATION) | ||||
|       case 6: BedMeshViewScreen::doMeshValidation(); break; | ||||
|       case 6: | ||||
|         GOTO_SCREEN(StatusScreen); | ||||
|         injectCommands_P(PSTR("G28\nM117 Heating...\nG26 R X0 Y0\nG27")); | ||||
|         break; | ||||
|     #endif | ||||
|     #if ENABLED(BLTOUCH) | ||||
|       case 7: injectCommands_P(PSTR("M280 P0 S60")); break; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user