⚡️ Enhance and fix FTDI Eve Touch UI file select (#22651)
This commit is contained in:
parent
f721c44c22
commit
ab03c9a560
|
@ -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 "sound_list.h"
|
||||||
#include "polygon.h"
|
#include "polygon.h"
|
||||||
#include "poly_ui.h"
|
#include "poly_ui.h"
|
||||||
|
#include "arrows.h"
|
||||||
#include "text_box.h"
|
#include "text_box.h"
|
||||||
#include "text_ellipsis.h"
|
#include "text_ellipsis.h"
|
||||||
#include "adjuster_widget.h"
|
#include "adjuster_widget.h"
|
||||||
|
|
|
@ -54,23 +54,33 @@
|
||||||
#define EDGE_L 0
|
#define EDGE_L 0
|
||||||
#define EDGE_R 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.
|
// the layout grid.
|
||||||
#define GRID_X(x) ((x)*(FTDI::display_width-EDGE_R-EDGE_L)/GRID_COLS+EDGE_L)
|
#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_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
|
// 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.
|
// and height of a button, taking into account the button margins.
|
||||||
|
|
||||||
#define BTN_X(x) (GRID_X((x)-1) + MARGIN_L)
|
#define BTN_X(x) (BOX_X(x) + MARGIN_L)
|
||||||
#define BTN_Y(y) (GRID_Y((y)-1) + MARGIN_T)
|
#define BTN_Y(y) (BOX_Y(y) + MARGIN_T)
|
||||||
#define BTN_W(w) (GRID_X(w) - GRID_X(0) - MARGIN_L - MARGIN_R)
|
#define BTN_W(w) (BOX_W(w) - MARGIN_L - MARGIN_R)
|
||||||
#define BTN_H(h) (GRID_Y(h) - GRID_Y(0) - MARGIN_T - MARGIN_B)
|
#define BTN_H(h) (BOX_H(h) - MARGIN_T - MARGIN_B)
|
||||||
|
|
||||||
// Abbreviations for common phrases, to allow a button to be
|
// Abbreviations for common phrases, to allow a box or button
|
||||||
// defined in one line of source.
|
// to be defined in one line of source.
|
||||||
#define BTN_POS(x,y) BTN_X(x), BTN_Y(y)
|
#define BTN_POS(x,y) BTN_X(x), BTN_Y(y)
|
||||||
#define BTN_SIZE(w,h) BTN_W(w), BTN_H(h)
|
#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.
|
// Draw a reference grid for ease of spacing out widgets.
|
||||||
#define DRAW_LAYOUT_GRID \
|
#define DRAW_LAYOUT_GRID \
|
||||||
|
@ -78,13 +88,13 @@
|
||||||
cmd.cmd(LINE_WIDTH(4)); \
|
cmd.cmd(LINE_WIDTH(4)); \
|
||||||
for (int i = 1; i <= GRID_COLS; i++) { \
|
for (int i = 1; i <= GRID_COLS; i++) { \
|
||||||
cmd.cmd(BEGIN(LINES)); \
|
cmd.cmd(BEGIN(LINES)); \
|
||||||
cmd.cmd(VERTEX2F(GRID_X(i) *16, 0 *16)); \
|
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, FTDI::display_height *16)); \
|
||||||
} \
|
} \
|
||||||
for (int i = 1; i < GRID_ROWS; i++) { \
|
for (int i = 1; i < GRID_ROWS; i++) { \
|
||||||
cmd.cmd(BEGIN(LINES)); \
|
cmd.cmd(BEGIN(LINES)); \
|
||||||
cmd.cmd(VERTEX2F(0 *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(VERTEX2F(FTDI::display_width *16, _GRID_Y(i) *16)); \
|
||||||
} \
|
} \
|
||||||
cmd.cmd(LINE_WIDTH(16)); \
|
cmd.cmd(LINE_WIDTH(16)); \
|
||||||
}
|
}
|
||||||
|
|
|
@ -157,12 +157,6 @@ void BedMeshViewScreen::doProbe() {
|
||||||
injectCommands_P(PSTR(BED_LEVELING_COMMANDS));
|
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() {
|
void BedMeshViewScreen::show() {
|
||||||
injectCommands_P(PSTR("G29 L1"));
|
injectCommands_P(PSTR("G29 L1"));
|
||||||
GOTO_SCREEN(BedMeshViewScreen);
|
GOTO_SCREEN(BedMeshViewScreen);
|
||||||
|
|
|
@ -43,6 +43,5 @@ class BedMeshViewScreen : public BedMeshBase, public CachedScreen<BED_MESH_VIEW_
|
||||||
static bool onTouchEnd(uint8_t tag);
|
static bool onTouchEnd(uint8_t tag);
|
||||||
|
|
||||||
static void doProbe();
|
static void doProbe();
|
||||||
static void doMeshValidation();
|
|
||||||
static void show();
|
static void show();
|
||||||
};
|
};
|
||||||
|
|
|
@ -26,6 +26,34 @@
|
||||||
|
|
||||||
#ifdef FTDI_FILES_SCREEN
|
#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 FTDI;
|
||||||
using namespace ExtUI;
|
using namespace ExtUI;
|
||||||
using namespace Theme;
|
using namespace Theme;
|
||||||
|
@ -49,6 +77,7 @@ const char *FilesScreen::getSelectedFilename(bool longName) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void FilesScreen::drawSelectedFile() {
|
void FilesScreen::drawSelectedFile() {
|
||||||
|
if(mydata.selected_tag == 0xFF) return;
|
||||||
FileList files;
|
FileList files;
|
||||||
files.seek(getSelectedFileIndex(), true);
|
files.seek(getSelectedFileIndex(), true);
|
||||||
mydata.flags.is_dir = files.isDir();
|
mydata.flags.is_dir = files.isDir();
|
||||||
|
@ -65,122 +94,108 @@ uint16_t FilesScreen::getSelectedFileIndex() {
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t FilesScreen::getFileForTag(uint8_t tag) {
|
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)
|
void FilesScreen::drawFileButton(int x, int y, int w, int h, const char *filename, uint8_t tag, bool is_dir, bool is_highlighted) {
|
||||||
#define GRID_COLS 6
|
#define SUB_COLS 6
|
||||||
#define GRID_ROWS (files_per_page + header_h + footer_h)
|
#define SUB_ROWS FILES_PER_PAGE
|
||||||
#else
|
|
||||||
#define GRID_COLS 6
|
const int bx = SUB_X(1);
|
||||||
#define GRID_ROWS (files_per_page + header_h + footer_h)
|
const int by = SUB_Y(getLineForTag(tag)+1);
|
||||||
#endif
|
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;
|
CommandProcessor cmd;
|
||||||
cmd.tag(tag);
|
cmd.tag(tag);
|
||||||
cmd.cmd(COLOR_RGB(is_highlighted ? fg_action : bg_color));
|
cmd.cmd(COLOR_RGB(is_highlighted ? fg_action : bg_color));
|
||||||
cmd.font(font_medium)
|
cmd.font(font_medium).rectangle(bx, by, bw, bh);
|
||||||
.rectangle( 0, BTN_Y(header_h+line), display_width, BTN_H(1));
|
|
||||||
cmd.cmd(COLOR_RGB(is_highlighted ? normal_btn.rgb : bg_text_enabled));
|
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 ENABLED(SCROLL_LONG_FILENAMES)
|
||||||
if (is_highlighted) {
|
if (is_highlighted) {
|
||||||
cmd.cmd(SAVE_CONTEXT());
|
cmd.cmd(SAVE_CONTEXT());
|
||||||
|
cmd.cmd(SCISSOR_XY(x,y));
|
||||||
|
cmd.cmd(SCISSOR_SIZE(w,h));
|
||||||
cmd.cmd(MACRO(0));
|
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
|
} else
|
||||||
#endif
|
#endif
|
||||||
draw_text_with_ellipsis(cmd, POS_AND_SHORTEN(is_dir ? 20 : 0), filename, OPT_CENTERY, font_medium);
|
draw_text_with_ellipsis(cmd, bx,by, bw - (is_dir ? 20 : 0), bh, filename, OPT_CENTERY, font_medium);
|
||||||
if (is_dir && !is_highlighted) {
|
if (is_dir && !is_highlighted) cmd.text(bx, by, bw, bh, F("> "), OPT_CENTERY | OPT_RIGHTX);
|
||||||
cmd.text(POS_AND_SIZE, F("> "), OPT_CENTERY | OPT_RIGHTX);
|
|
||||||
}
|
|
||||||
#if ENABLED(SCROLL_LONG_FILENAMES)
|
#if ENABLED(SCROLL_LONG_FILENAMES)
|
||||||
if (is_highlighted) {
|
if (is_highlighted) cmd.cmd(RESTORE_CONTEXT());
|
||||||
cmd.cmd(RESTORE_CONTEXT());
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void FilesScreen::drawFileList() {
|
void FilesScreen::drawFileList() {
|
||||||
FileList files;
|
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.cur_page = min(mydata.cur_page, mydata.num_page-1);
|
||||||
mydata.flags.is_root = files.isAtRootDir();
|
mydata.flags.is_root = files.isAtRootDir();
|
||||||
|
|
||||||
#undef MARGIN_T
|
uint16_t fileIndex = mydata.cur_page * FILES_PER_PAGE;
|
||||||
#undef MARGIN_B
|
for (uint8_t i = 0; i < FILES_PER_PAGE; i++, fileIndex++) {
|
||||||
#define MARGIN_T 0
|
if (files.seek(fileIndex))
|
||||||
#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)) {
|
|
||||||
drawFileButton(files.filename(), getTagForLine(i), files.isDir(), false);
|
drawFileButton(files.filename(), getTagForLine(i), files.isDir(), false);
|
||||||
}
|
else
|
||||||
else {
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void FilesScreen::drawHeader() {
|
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];
|
char str[16];
|
||||||
sprintf_P(str, PSTR("Page %d of %d"),
|
sprintf_P(str, PSTR("Page %d of %d"), mydata.cur_page + 1, mydata.num_page);
|
||||||
mydata.cur_page + 1, mydata.num_page);
|
|
||||||
|
|
||||||
CommandProcessor cmd;
|
CommandProcessor cmd;
|
||||||
cmd.colors(normal_btn)
|
cmd.colors(normal_btn)
|
||||||
.font(font_small)
|
.font(font_small)
|
||||||
.tag(0).button(BTN_POS(2,1), BTN_SIZE(4,header_h), str, OPT_CENTER | OPT_FLAT)
|
.tag(0).button(HEAD_POS, 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("<"))
|
void FilesScreen::drawArrows() {
|
||||||
.tag(242).enabled(next_enabled).button(BTN_POS(6,1), BTN_SIZE(1,header_h), F(">"));
|
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() {
|
void FilesScreen::drawFooter() {
|
||||||
#undef MARGIN_T
|
const bool has_selection = mydata.selected_tag != 0xFF;
|
||||||
#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;
|
|
||||||
|
|
||||||
CommandProcessor cmd;
|
CommandProcessor cmd;
|
||||||
cmd.colors(normal_btn)
|
cmd.colors(normal_btn)
|
||||||
.font(font_medium)
|
.font(font_medium)
|
||||||
.colors(has_selection ? normal_btn : action_btn)
|
.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)
|
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);
|
.colors(has_selection ? action_btn : normal_btn);
|
||||||
|
|
||||||
if (mydata.flags.is_dir)
|
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
|
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) {
|
void FilesScreen::onRedraw(draw_mode_t what) {
|
||||||
if (what & FOREGROUND) {
|
if (what & FOREGROUND) {
|
||||||
drawHeader();
|
drawHeader();
|
||||||
|
drawArrows();
|
||||||
drawSelectedFile();
|
drawSelectedFile();
|
||||||
drawFooter();
|
drawFooter();
|
||||||
}
|
}
|
||||||
|
@ -200,48 +215,50 @@ void FilesScreen::gotoPage(uint8_t page) {
|
||||||
|
|
||||||
bool FilesScreen::onTouchEnd(uint8_t tag) {
|
bool FilesScreen::onTouchEnd(uint8_t tag) {
|
||||||
switch (tag) {
|
switch (tag) {
|
||||||
case 240: GOTO_PREVIOUS(); return true;
|
case 240: // Done button
|
||||||
case 241:
|
GOTO_PREVIOUS();
|
||||||
|
return true;
|
||||||
|
case 241: // Print highlighted file
|
||||||
|
ConfirmStartPrintDialogBox::show(getSelectedFileIndex());
|
||||||
|
return true;
|
||||||
|
case 242: // Previous page
|
||||||
if (mydata.cur_page > 0) {
|
if (mydata.cur_page > 0) {
|
||||||
gotoPage(mydata.cur_page-1);
|
gotoPage(mydata.cur_page-1);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 242:
|
case 243: // Next page
|
||||||
if (mydata.cur_page < (mydata.num_page-1)) {
|
if (mydata.cur_page < (mydata.num_page-1)) {
|
||||||
gotoPage(mydata.cur_page+1);
|
gotoPage(mydata.cur_page+1);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 243:
|
case 244: // Select directory
|
||||||
ConfirmStartPrintDialogBox::show(getSelectedFileIndex());
|
|
||||||
return true;
|
|
||||||
case 244:
|
|
||||||
{
|
{
|
||||||
FileList files;
|
FileList files;
|
||||||
files.changeDir(getSelectedShortFilename());
|
files.changeDir(getSelectedShortFilename());
|
||||||
gotoPage(0);
|
gotoPage(0);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 245:
|
case 245: // Up directory
|
||||||
{
|
{
|
||||||
FileList files;
|
FileList files;
|
||||||
files.upDir();
|
files.upDir();
|
||||||
gotoPage(0);
|
gotoPage(0);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default: // File selected
|
||||||
if (tag < 240) {
|
if (tag < 240) {
|
||||||
mydata.selected_tag = tag;
|
mydata.selected_tag = tag;
|
||||||
#if ENABLED(SCROLL_LONG_FILENAMES) && (FTDI_API_LEVEL >= 810)
|
#if ENABLED(SCROLL_LONG_FILENAMES) && (FTDI_API_LEVEL >= 810)
|
||||||
|
mydata.scroll_pos = 0;
|
||||||
|
mydata.scroll_max = 0;
|
||||||
if (FTDI::ftdi_chip >= 810) {
|
if (FTDI::ftdi_chip >= 810) {
|
||||||
const char *longFilename = getSelectedLongFilename();
|
const char *longFilename = getSelectedLongFilename();
|
||||||
if (longFilename[0]) {
|
if (longFilename[0]) {
|
||||||
CommandProcessor cmd;
|
CommandProcessor cmd;
|
||||||
uint16_t text_width = cmd.font(font_medium).text_width(longFilename);
|
constexpr int dim[4] = {LIST_POS};
|
||||||
mydata.scroll_pos = 0;
|
const uint16_t text_width = cmd.font(font_medium).text_width(longFilename);
|
||||||
if (text_width > display_width)
|
if (text_width > dim[2])
|
||||||
mydata.scroll_max = text_width - display_width + MARGIN_L + MARGIN_R;
|
mydata.scroll_max = text_width - dim[2] + MARGIN_L + MARGIN_R + 10;
|
||||||
else
|
|
||||||
mydata.scroll_max = 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -41,16 +41,6 @@ struct FilesScreenData {
|
||||||
|
|
||||||
class FilesScreen : public BaseScreen, public CachedScreen<FILES_SCREEN_CACHE, FILE_SCREEN_DL_SIZE> {
|
class FilesScreen : public BaseScreen, public CachedScreen<FILES_SCREEN_CACHE, FILE_SCREEN_DL_SIZE> {
|
||||||
private:
|
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 getTagForLine(uint8_t line) {return line + 2;}
|
||||||
static uint8_t getLineForTag(uint8_t tag) {return tag - 2;}
|
static uint8_t getLineForTag(uint8_t tag) {return tag - 2;}
|
||||||
static uint16_t getFileForTag(uint8_t tag);
|
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);}
|
inline static const char *getSelectedLongFilename() {return getSelectedFilename(true);}
|
||||||
static const char *getSelectedFilename(bool longName);
|
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 drawFileButton(const char *filename, uint8_t tag, bool is_dir, bool is_highlighted);
|
||||||
static void drawFileList();
|
static void drawFileList();
|
||||||
static void drawHeader();
|
static void drawHeader();
|
||||||
|
static void drawArrows();
|
||||||
static void drawFooter();
|
static void drawFooter();
|
||||||
static void drawSelectedFile();
|
static void drawSelectedFile();
|
||||||
|
|
||||||
|
|
|
@ -123,7 +123,10 @@ bool LevelingMenu::onTouchEnd(uint8_t tag) {
|
||||||
case 5: BedMeshEditScreen::show(); break;
|
case 5: BedMeshEditScreen::show(); break;
|
||||||
#endif
|
#endif
|
||||||
#if ENABLED(G26_MESH_VALIDATION)
|
#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
|
#endif
|
||||||
#if ENABLED(BLTOUCH)
|
#if ENABLED(BLTOUCH)
|
||||||
case 7: injectCommands_P(PSTR("M280 P0 S60")); break;
|
case 7: injectCommands_P(PSTR("M280 P0 S60")); break;
|
||||||
|
|
Loading…
Reference in a new issue