⚡️ Fixes to FTDI Eve Touch UI (#22347)
This commit is contained in:
parent
05ebde3812
commit
fa6b01c677
|
@ -209,11 +209,25 @@ class CommandProcessor : public CLCD::CommandFifo {
|
|||
inline CommandProcessor& rectangle(int16_t x, int16_t y, int16_t w, int16_t h) {
|
||||
using namespace FTDI;
|
||||
CLCD::CommandFifo::cmd(BEGIN(RECTS));
|
||||
CLCD::CommandFifo::cmd(VERTEX2F(x * 16, y * 16));
|
||||
CLCD::CommandFifo::cmd(VERTEX2F( x * 16, y * 16));
|
||||
CLCD::CommandFifo::cmd(VERTEX2F((x + w) * 16, (y + h) * 16));
|
||||
return *this;
|
||||
}
|
||||
|
||||
inline CommandProcessor& border(int16_t x, int16_t y, int16_t w, int16_t h) {
|
||||
using namespace FTDI;
|
||||
CLCD::CommandFifo::cmd(BEGIN(LINES));
|
||||
CLCD::CommandFifo::cmd(VERTEX2F( x * 16, y * 16));
|
||||
CLCD::CommandFifo::cmd(VERTEX2F((x + w) * 16, y * 16));
|
||||
CLCD::CommandFifo::cmd(VERTEX2F((x + w) * 16, y * 16));
|
||||
CLCD::CommandFifo::cmd(VERTEX2F((x + w) * 16, (y + h) * 16));
|
||||
CLCD::CommandFifo::cmd(VERTEX2F((x + w) * 16, (y + h) * 16));
|
||||
CLCD::CommandFifo::cmd(VERTEX2F( x * 16, (y + h) * 16));
|
||||
CLCD::CommandFifo::cmd(VERTEX2F( x * 16, (y + h) * 16));
|
||||
CLCD::CommandFifo::cmd(VERTEX2F( x * 16, y * 16));
|
||||
return *this;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
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);
|
||||
|
|
|
@ -29,43 +29,49 @@ namespace FTDI {
|
|||
* be broken so that the display width is less than w. The line will also
|
||||
* be broken after a '\n'. Returns the display width of the line.
|
||||
*/
|
||||
static uint16_t find_line_break(const FontMetrics &fm, uint16_t w, const char *str, const char *&end) {
|
||||
w -= fm.get_char_width(' ');
|
||||
static uint16_t find_line_break(const FontMetrics &utf8_fm, const CLCD::FontMetrics &clcd_fm, const uint16_t w, const char *str, const char *&end, bool use_utf8) {
|
||||
const char *p = str;
|
||||
end = str;
|
||||
uint16_t lw = 0, result = 0;
|
||||
for (;;) {
|
||||
utf8_char_t c = get_utf8_char_and_inc(p);
|
||||
if (c == ' ' || c == '\n' || c == '\0') {
|
||||
if (lw < w || end == str) {
|
||||
end = (c == '\0') ? p-1 : p;
|
||||
const char *next = p;
|
||||
utf8_char_t c = get_utf8_char_and_inc(next);
|
||||
// Decide whether to break the string at this location
|
||||
if (c == '\n' || c == '\0' || c == ' ') {
|
||||
end = p;
|
||||
result = lw;
|
||||
}
|
||||
if (c == '\0' || c == '\n') break;
|
||||
}
|
||||
lw += fm.get_char_width(c);
|
||||
}
|
||||
if (c == '\n' || c == '\0') break;
|
||||
// Now add the length of the current character to the tally.
|
||||
lw += use_utf8 ? utf8_fm.get_char_width(c) : clcd_fm.char_widths[(uint8_t)c];
|
||||
// Stop processing once string exceeds the display width
|
||||
if (lw >= w) {
|
||||
if (end == str) {
|
||||
end = p-1;
|
||||
end = p;
|
||||
result = lw;
|
||||
}
|
||||
break;
|
||||
}
|
||||
p = next;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* This function returns a measurements of the word-wrapped text box.
|
||||
*/
|
||||
static void measure_text_box(const FontMetrics &fm, const char *str, uint16_t &width, uint16_t &height) {
|
||||
static void measure_text_box(const FontMetrics &utf8_fm, const CLCD::FontMetrics &clcd_fm, const char *str, uint16_t &width, uint16_t &height, bool use_utf8) {
|
||||
const char *line_start = (const char*)str;
|
||||
const char *line_end;
|
||||
const uint16_t wrap_width = width;
|
||||
width = height = 0;
|
||||
for (;;) {
|
||||
uint16_t line_width = find_line_break(fm, wrap_width, line_start, line_end);
|
||||
if (line_end == line_start) break;
|
||||
uint16_t line_width = find_line_break(utf8_fm, clcd_fm, wrap_width, line_start, line_end, use_utf8);
|
||||
width = max(width, line_width);
|
||||
height += fm.get_height();
|
||||
height += utf8_fm.get_height();
|
||||
line_start = line_end;
|
||||
if (line_start[0] == '\n' || line_start[0] == ' ') line_start++;
|
||||
if (line_start[0] == '\0') break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -73,41 +79,45 @@ namespace FTDI {
|
|||
* This function draws text inside a bounding box, doing word wrapping and using the largest font that will fit.
|
||||
*/
|
||||
void draw_text_box(CommandProcessor& cmd, int x, int y, int w, int h, const char *str, uint16_t options, uint8_t font) {
|
||||
#if ENABLED(TOUCH_UI_USE_UTF8)
|
||||
const bool use_utf8 = has_utf8_chars(str);
|
||||
#else
|
||||
constexpr bool use_utf8 = false;
|
||||
#endif
|
||||
uint16_t box_width, box_height;
|
||||
|
||||
FontMetrics fm(font);
|
||||
FontMetrics utf8_fm(font);
|
||||
CLCD::FontMetrics clcd_fm;
|
||||
clcd_fm.load(font);
|
||||
|
||||
// Shrink the font until we find a font that fits
|
||||
for (;;) {
|
||||
box_width = w;
|
||||
measure_text_box(fm, str, box_width, box_height);
|
||||
measure_text_box(utf8_fm, clcd_fm, str, box_width, box_height, use_utf8);
|
||||
if (box_width <= (uint16_t)w && box_height <= (uint16_t)h) break;
|
||||
if (font == 26) break;
|
||||
fm.load(--font);
|
||||
utf8_fm.load(--font);
|
||||
clcd_fm.load(font);
|
||||
}
|
||||
|
||||
const uint16_t dx = (options & OPT_RIGHTX) ? w :
|
||||
(options & OPT_CENTERX) ? w/2 : 0;
|
||||
const uint16_t dy = (options & OPT_BOTTOMY) ? (h - box_height) :
|
||||
(options & OPT_CENTERY) ? (h - box_height)/2 : 0;
|
||||
(options & OPT_CENTERX) ? w / 2 : 0,
|
||||
dy = (options & OPT_BOTTOMY) ? (h - box_height) :
|
||||
(options & OPT_CENTERY) ? (h - box_height) / 2 : 0;
|
||||
|
||||
const char *line_start = str;
|
||||
const char *line_end;
|
||||
const char *line_start = str, *line_end;
|
||||
for (;;) {
|
||||
find_line_break(fm, w, line_start, line_end);
|
||||
if (line_end == line_start) break;
|
||||
find_line_break(utf8_fm, clcd_fm, w, line_start, line_end, use_utf8);
|
||||
|
||||
const size_t line_len = line_end - line_start;
|
||||
if (line_len) {
|
||||
char line[line_len + 1];
|
||||
strncpy(line, line_start, line_len);
|
||||
line[line_len] = 0;
|
||||
if (line[line_len - 1] == '\n' || line[line_len - 1] == ' ')
|
||||
line[line_len - 1] = 0;
|
||||
|
||||
#if ENABLED(TOUCH_UI_USE_UTF8)
|
||||
if (has_utf8_chars(line)) {
|
||||
draw_utf8_text(cmd, x + dx, y + dy, line, fm.fs, options & ~(OPT_CENTERY | OPT_BOTTOMY));
|
||||
if (use_utf8) {
|
||||
draw_utf8_text(cmd, x + dx, y + dy, line, utf8_fm.fs, options & ~(OPT_CENTERY | OPT_BOTTOMY));
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
|
@ -115,9 +125,11 @@ namespace FTDI {
|
|||
cmd.CLCD::CommandFifo::str(line);
|
||||
}
|
||||
}
|
||||
y += fm.get_height();
|
||||
y += utf8_fm.get_height();
|
||||
|
||||
line_start = line_end;
|
||||
if (line_start[0] == '\n' || line_start[0] == ' ') line_start++;
|
||||
if (line_start[0] == '\0') break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -44,16 +44,13 @@ void AboutScreen::onRedraw(draw_mode_t) {
|
|||
.cmd(COLOR_RGB(bg_text_enabled))
|
||||
.tag(0);
|
||||
|
||||
#define HEADING_POS BTN_POS(1,2), BTN_SIZE(4,1)
|
||||
#define HEADING_POS BTN_POS(1,1), BTN_SIZE(4,2)
|
||||
#define FW_VERS_POS BTN_POS(1,3), BTN_SIZE(4,1)
|
||||
#define FW_INFO_POS BTN_POS(1,4), BTN_SIZE(4,1)
|
||||
#define LICENSE_POS BTN_POS(1,5), BTN_SIZE(4,3)
|
||||
#define STATS_POS BTN_POS(1,8), BTN_SIZE(2,1)
|
||||
#define BACK_POS BTN_POS(3,8), BTN_SIZE(2,1)
|
||||
|
||||
#define _INSET_POS(x,y,w,h) x + w/10, y, w - w/5, h
|
||||
#define INSET_POS(pos) _INSET_POS(pos)
|
||||
|
||||
char about_str[1
|
||||
+ strlen_P(GET_TEXT(MSG_ABOUT_TOUCH_PANEL_2))
|
||||
#ifdef TOOLHEAD_NAME
|
||||
|
@ -89,7 +86,7 @@ void AboutScreen::onRedraw(draw_mode_t) {
|
|||
, OPT_CENTER, font_medium);
|
||||
cmd.tag(0);
|
||||
draw_text_box(cmd, FW_INFO_POS, about_str, OPT_CENTER, font_medium);
|
||||
draw_text_box(cmd, INSET_POS(LICENSE_POS), GET_TEXT_F(MSG_LICENSE), OPT_CENTER, font_tiny);
|
||||
draw_text_box(cmd, LICENSE_POS, GET_TEXT_F(MSG_LICENSE), OPT_CENTER, font_tiny);
|
||||
|
||||
cmd.font(font_medium);
|
||||
#if ENABLED(PRINTCOUNTER) && defined(FTDI_STATISTICS_SCREEN)
|
||||
|
|
|
@ -58,11 +58,7 @@ void InterfaceSettingsScreen::onRedraw(draw_mode_t what) {
|
|||
if (what & BACKGROUND) {
|
||||
|
||||
#define GRID_COLS 4
|
||||
#if ENABLED(TOUCH_UI_PORTRAIT)
|
||||
#define GRID_ROWS 7
|
||||
#else
|
||||
#define GRID_ROWS 6
|
||||
#endif
|
||||
#define GRID_ROWS TERN(TOUCH_UI_PORTRAIT, 7, 6)
|
||||
|
||||
cmd.cmd(CLEAR_COLOR_RGB(bg_color))
|
||||
.cmd(CLEAR(true,true,true))
|
||||
|
@ -77,8 +73,10 @@ void InterfaceSettingsScreen::onRedraw(draw_mode_t what) {
|
|||
#if DISABLED(LCD_FYSETC_TFT81050)
|
||||
.text(BTN_POS(1,2), BTN_SIZE(2,1), GET_TEXT_F(MSG_LCD_BRIGHTNESS), OPT_RIGHTX | OPT_CENTERY)
|
||||
#endif
|
||||
.text(BTN_POS(1,3), BTN_SIZE(2,1), GET_TEXT_F(MSG_SOUND_VOLUME), OPT_RIGHTX | OPT_CENTERY)
|
||||
.text(BTN_POS(1,4), BTN_SIZE(2,1), GET_TEXT_F(MSG_SCREEN_LOCK), OPT_RIGHTX | OPT_CENTERY);
|
||||
.text(BTN_POS(1,3), BTN_SIZE(2,1), GET_TEXT_F(MSG_SOUND_VOLUME), OPT_RIGHTX | OPT_CENTERY);
|
||||
#if ENABLED(FTDI_LOCK_SCREEN)
|
||||
cmd.text(BTN_POS(1,4), BTN_SIZE(2,1), GET_TEXT_F(MSG_SCREEN_LOCK), OPT_RIGHTX | OPT_CENTERY);
|
||||
#endif
|
||||
#if DISABLED(TOUCH_UI_NO_BOOTSCREEN)
|
||||
cmd.text(BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXT_F(MSG_BOOT_SCREEN), OPT_RIGHTX | OPT_CENTERY);
|
||||
#endif
|
||||
|
@ -86,12 +84,8 @@ void InterfaceSettingsScreen::onRedraw(draw_mode_t what) {
|
|||
}
|
||||
|
||||
if (what & FOREGROUND) {
|
||||
#if defined(FTDI_LOCK_SCREEN) || DISABLED(TOUCH_UI_NO_BOOTSCREEN)
|
||||
#if ENABLED(TOUCH_UI_PORTRAIT)
|
||||
constexpr uint8_t w = 2;
|
||||
#else
|
||||
constexpr uint8_t w = 1;
|
||||
#endif
|
||||
#if ENABLED(FTDI_LOCK_SCREEN) || DISABLED(TOUCH_UI_NO_BOOTSCREEN)
|
||||
constexpr uint8_t w = TERN(TOUCH_UI_PORTRAIT, 2, 1);
|
||||
#endif
|
||||
|
||||
cmd.font(font_medium)
|
||||
|
@ -101,7 +95,7 @@ void InterfaceSettingsScreen::onRedraw(draw_mode_t what) {
|
|||
.tag(2).slider(BTN_POS(3,2), BTN_SIZE(2,1), mydata.brightness, 128)
|
||||
#endif
|
||||
.tag(3).slider(BTN_POS(3,3), BTN_SIZE(2,1), mydata.volume, 0xFF)
|
||||
#ifdef FTDI_LOCK_SCREEN
|
||||
#if ENABLED(FTDI_LOCK_SCREEN)
|
||||
.colors(ui_toggle)
|
||||
.tag(4).toggle2(BTN_POS(3,4), BTN_SIZE(w,1), GET_TEXT_F(MSG_NO), GET_TEXT_F(MSG_YES), LockScreen::is_enabled())
|
||||
#endif
|
||||
|
@ -126,7 +120,7 @@ void InterfaceSettingsScreen::onRedraw(draw_mode_t what) {
|
|||
bool InterfaceSettingsScreen::onTouchEnd(uint8_t tag) {
|
||||
switch (tag) {
|
||||
case 1: GOTO_PREVIOUS(); return true;
|
||||
#ifdef FTDI_LOCK_SCREEN
|
||||
#if ENABLED(FTDI_LOCK_SCREEN)
|
||||
case 4:
|
||||
if (!LockScreen::is_enabled())
|
||||
LockScreen::enable();
|
||||
|
@ -185,8 +179,7 @@ void InterfaceSettingsScreen::onIdle() {
|
|||
}
|
||||
|
||||
void InterfaceSettingsScreen::failSafeSettings() {
|
||||
// Reset settings that may make the printer interface
|
||||
// unusable.
|
||||
// Reset settings that may make the printer interface unusable.
|
||||
CLCD::mem_write_32(CLCD::REG::ROTATE, 0);
|
||||
CLCD::default_touch_transform();
|
||||
CLCD::default_display_orientation();
|
||||
|
@ -197,9 +190,7 @@ void InterfaceSettingsScreen::failSafeSettings() {
|
|||
}
|
||||
|
||||
void InterfaceSettingsScreen::defaultSettings() {
|
||||
#ifdef FTDI_LOCK_SCREEN
|
||||
LockScreen::passcode = 0;
|
||||
#endif
|
||||
TERN_(FTDI_LOCK_SCREEN, LockScreen::passcode = 0);
|
||||
SoundPlayer::set_volume(255);
|
||||
CLCD::set_brightness(255);
|
||||
UIData::reset_persistent_data();
|
||||
|
@ -218,11 +209,7 @@ void InterfaceSettingsScreen::saveSettings(char *buff) {
|
|||
|
||||
persistent_data_t eeprom;
|
||||
|
||||
#ifdef FTDI_LOCK_SCREEN
|
||||
eeprom.passcode = LockScreen::passcode;
|
||||
#else
|
||||
eeprom.passcode = 0;
|
||||
#endif
|
||||
eeprom.passcode = TERN0(FTDI_LOCK_SCREEN, LockScreen::passcode);
|
||||
eeprom.sound_volume = SoundPlayer::get_volume();
|
||||
eeprom.display_brightness = CLCD::get_brightness();
|
||||
eeprom.bit_flags = UIData::get_persistent_data();
|
||||
|
@ -251,7 +238,7 @@ void InterfaceSettingsScreen::loadSettings(const char *buff) {
|
|||
|
||||
SERIAL_ECHOLNPGM("Loading setting from EEPROM");
|
||||
|
||||
#ifdef FTDI_LOCK_SCREEN
|
||||
#if ENABLED(FTDI_LOCK_SCREEN)
|
||||
LockScreen::passcode = eeprom.passcode;
|
||||
#endif
|
||||
SoundPlayer::set_volume(eeprom.sound_volume);
|
||||
|
@ -282,10 +269,7 @@ void InterfaceSettingsScreen::loadSettings(const char *buff) {
|
|||
if (success)
|
||||
success = persistentStore.write_data(0, data, ARCHIM2_SPI_FLASH_EEPROM_BACKUP_SIZE) == PERSISTENT_STORE_SUCCESS;
|
||||
|
||||
if (success)
|
||||
StatusScreen::setStatusMessage(GET_TEXT_F(MSG_EEPROM_RESTORED));
|
||||
else
|
||||
StatusScreen::setStatusMessage(GET_TEXT_F(MSG_EEPROM_RESET));
|
||||
StatusScreen::setStatusMessage(success ? GET_TEXT_F(MSG_EEPROM_RESTORED) : GET_TEXT_F(MSG_EEPROM_RESET));
|
||||
|
||||
return success;
|
||||
}
|
||||
|
|
|
@ -60,4 +60,8 @@ void SaveSettingsDialogBox::promptToSaveSettings() {
|
|||
GOTO_PREVIOUS(); // No save needed.
|
||||
}
|
||||
|
||||
void SaveSettingsDialogBox::promptToSaveAndStay() {
|
||||
if (needs_save) GOTO_SCREEN(SaveSettingsDialogBox);
|
||||
}
|
||||
|
||||
#endif // FTDI_SAVE_SETTINGS_DIALOG_BOX
|
||||
|
|
|
@ -34,5 +34,6 @@ class SaveSettingsDialogBox : public DialogBoxBaseClass, public UncachedScreen {
|
|||
static bool onTouchEnd(uint8_t tag);
|
||||
|
||||
static void promptToSaveSettings();
|
||||
static void promptToSaveAndStay();
|
||||
static void settingsChanged() {needs_save = true;}
|
||||
};
|
||||
|
|
|
@ -55,7 +55,7 @@ namespace Theme {
|
|||
constexpr int16_t font_small = 27;
|
||||
constexpr int16_t font_medium = 28;
|
||||
constexpr int16_t font_large = 30;
|
||||
constexpr int16_t font_xlarge = 31;
|
||||
constexpr int16_t font_xlarge = 30;
|
||||
constexpr float icon_scale = 0.6;
|
||||
#endif
|
||||
#elif defined(TOUCH_UI_320x240)
|
||||
|
|
Loading…
Reference in a new issue