Add SCROLL_LONG_FILENAMES option
This commit is contained in:
@ -76,12 +76,16 @@ int16_t lcd_preheat_hotend_temp[2], lcd_preheat_bed_temp[2], lcd_preheat_fan_spe
|
||||
#endif
|
||||
#endif
|
||||
|
||||
uint8_t lcd_status_message_level;
|
||||
uint8_t lcd_status_update_delay = 1, // First update one loop delayed
|
||||
lcd_status_message_level; // Higher level overrides lower
|
||||
char lcd_status_message[3 * (LCD_WIDTH) + 1] = WELCOME_MSG; // worst case is kana with up to 3*LCD_WIDTH+1
|
||||
|
||||
#if ENABLED(STATUS_MESSAGE_SCROLLING)
|
||||
uint8_t status_scroll_pos = 0;
|
||||
#endif
|
||||
#if ENABLED(SCROLL_LONG_FILENAMES)
|
||||
uint8_t filename_scroll_pos, filename_scroll_max, filename_scroll_hash;
|
||||
#endif
|
||||
|
||||
#if ENABLED(LCD_SET_PROGRESS_MANUALLY)
|
||||
uint8_t progress_bar_percent;
|
||||
@ -4665,7 +4669,6 @@ void lcd_update() {
|
||||
|
||||
// We arrive here every ~100ms when idling often enough.
|
||||
// Instead of tracking the changes simply redraw the Info Screen ~1 time a second.
|
||||
static int8_t lcd_status_update_delay = 1; // first update one loop delayed
|
||||
if (
|
||||
#if ENABLED(ULTIPANEL)
|
||||
currentScreen == lcd_status_screen &&
|
||||
@ -4681,6 +4684,17 @@ void lcd_update() {
|
||||
lcdDrawUpdate = LCDVIEW_REDRAW_NOW;
|
||||
}
|
||||
|
||||
#if ENABLED(SCROLL_LONG_FILENAMES)
|
||||
// If scrolling of long file names is enabled and we are in the sd card menu,
|
||||
// cause a refresh to occur until all the text has scrolled into view.
|
||||
if (currentScreen == lcd_sdcard_menu && filename_scroll_pos < filename_scroll_max && !lcd_status_update_delay--) {
|
||||
lcd_status_update_delay = 6;
|
||||
lcdDrawUpdate = LCDVIEW_REDRAW_NOW;
|
||||
filename_scroll_pos++;
|
||||
return_to_status_ms = ms + LCD_TIMEOUT_TO_STATUS;
|
||||
}
|
||||
#endif
|
||||
|
||||
// then we want to use 1/2 of the time only.
|
||||
uint16_t bbr2 = planner.block_buffer_runtime() >> 1;
|
||||
|
||||
@ -4765,7 +4779,7 @@ void lcd_update() {
|
||||
} // ELAPSED(ms, next_lcd_update_ms)
|
||||
}
|
||||
|
||||
void pad_message_string() {
|
||||
inline void pad_message_string() {
|
||||
uint8_t i = 0, j = 0;
|
||||
char c;
|
||||
while ((c = lcd_status_message[i]) && j < LCD_WIDTH) {
|
||||
|
@ -935,19 +935,36 @@ static void lcd_implementation_status_screen() {
|
||||
|
||||
if (!PAGE_CONTAINS(row_y1, row_y2)) return;
|
||||
|
||||
uint8_t n = LCD_WIDTH - (START_COL) - 1;
|
||||
constexpr uint8_t maxlen = LCD_WIDTH - (START_COL) - 1;
|
||||
const char *outstr = longFilename[0] ? longFilename : filename;
|
||||
if (longFilename[0]) {
|
||||
filename = longFilename;
|
||||
longFilename[n] = '\0'; // cutoff at screen edge
|
||||
#if ENABLED(SCROLL_LONG_FILENAMES)
|
||||
if (isSelected) {
|
||||
uint8_t name_hash = row;
|
||||
for (uint8_t l = FILENAME_LENGTH; l--;)
|
||||
name_hash = ((name_hash << 1) | (name_hash >> 7)) ^ filename[l]; // rotate, xor
|
||||
if (filename_scroll_hash != name_hash) { // If the hash changed...
|
||||
filename_scroll_hash = name_hash; // Save the new hash
|
||||
filename_scroll_max = max(0, lcd_strlen(longFilename) - maxlen); // Update the scroll limit
|
||||
filename_scroll_pos = 0; // Reset scroll to the start
|
||||
lcd_status_update_delay = 8; // Don't scroll right away
|
||||
}
|
||||
outstr += filename_scroll_pos;
|
||||
}
|
||||
#else
|
||||
longFilename[maxlen] = '\0'; // cutoff at screen edge
|
||||
#endif
|
||||
}
|
||||
|
||||
if (isDir) lcd_print(LCD_STR_FOLDER[0]);
|
||||
|
||||
while (char c = *filename) {
|
||||
char c;
|
||||
uint8_t n = maxlen;
|
||||
while (n && (c = *outstr)) {
|
||||
n -= lcd_print_and_count(c);
|
||||
filename++;
|
||||
++outstr;
|
||||
}
|
||||
while (n--) u8g.print(' ');
|
||||
while (n) { --n; u8g.print(' '); }
|
||||
}
|
||||
|
||||
#define lcd_implementation_drawmenu_sdfile(sel, row, pstr, filename, longFilename) _drawmenu_sd(sel, row, pstr, filename, longFilename, false)
|
||||
|
@ -991,18 +991,37 @@ static void lcd_implementation_status_screen() {
|
||||
|
||||
static void lcd_implementation_drawmenu_sd(const bool sel, const uint8_t row, const char* const pstr, const char* filename, char* const longFilename, const uint8_t concat, const char post_char) {
|
||||
UNUSED(pstr);
|
||||
uint8_t n = LCD_WIDTH - concat;
|
||||
lcd.setCursor(0, row);
|
||||
lcd.print(sel ? '>' : ' ');
|
||||
|
||||
uint8_t n = LCD_WIDTH - concat;
|
||||
const char *outstr = longFilename[0] ? longFilename : filename;
|
||||
if (longFilename[0]) {
|
||||
filename = longFilename;
|
||||
longFilename[n] = '\0';
|
||||
#if ENABLED(SCROLL_LONG_FILENAMES)
|
||||
if (sel) {
|
||||
uint8_t name_hash = row;
|
||||
for (uint8_t l = FILENAME_LENGTH; l--;)
|
||||
name_hash = ((name_hash << 1) | (name_hash >> 7)) ^ filename[l]; // rotate, xor
|
||||
if (filename_scroll_hash != name_hash) { // If the hash changed...
|
||||
filename_scroll_hash = name_hash; // Save the new hash
|
||||
filename_scroll_max = max(0, lcd_strlen(longFilename) - n); // Update the scroll limit
|
||||
filename_scroll_pos = 0; // Reset scroll to the start
|
||||
lcd_status_update_delay = 8; // Don't scroll right away
|
||||
}
|
||||
outstr += filename_scroll_pos;
|
||||
}
|
||||
#else
|
||||
longFilename[n] = '\0'; // cutoff at screen edge
|
||||
#endif
|
||||
}
|
||||
while (char c = *filename) {
|
||||
|
||||
char c;
|
||||
while (n && (c = *outstr)) {
|
||||
n -= charset_mapper(c);
|
||||
filename++;
|
||||
++outstr;
|
||||
}
|
||||
while (n--) lcd.write(' ');
|
||||
while (n) { --n; lcd.write(' '); }
|
||||
|
||||
lcd.print(post_char);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user