diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/advanced_settings_menu.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/advanced_settings_menu.cpp
index 00cdf76331d6..f607dc102dc1 100644
--- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/advanced_settings_menu.cpp
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/advanced_settings_menu.cpp
@@ -58,8 +58,8 @@ void AdvancedSettingsMenu::onRedraw(draw_mode_t what) {
.enabled(ENABLED(HAS_TRINAMIC_CONFIG))
.tag(3) .button(TMC_CURRENT_POS, GET_TEXT_F(MSG_TMC_CURRENT))
.enabled(ENABLED(LIN_ADVANCE))
- .tag(4) .button(LIN_ADVANCE_POS, GET_TEXT_F(MSG_LINEAR_ADVANCE))
- .tag(5) .button(VELOCITY_POS, GET_TEXT_F(MSG_MAX_SPEED))
+ .tag(4) .button(LIN_ADVANCE_POS, GET_TEXT_F(MSG_LINEAR_ADVANCE))
+ .tag(5) .button(VELOCITY_POS, GET_TEXT_F(MSG_MAX_SPEED_NO_UNITS))
.tag(6) .button(ACCELERATION_POS, GET_TEXT_F(MSG_ACCELERATION))
.tag(7) .button(JERK_POS, GET_TEXT_F(TERN(HAS_JUNCTION_DEVIATION, MSG_JUNCTION_DEVIATION, MSG_JERK)))
.tag(8) .button(ENDSTOPS_POS, GET_TEXT_F(MSG_LCD_ENDSTOPS))
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/cocoa_press_ui.h b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/cocoa_press_ui.h
index 6a022289252d..5704371131c6 100644
--- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/cocoa_press_ui.h
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/cocoa_press_ui.h
@@ -1,4 +1,3 @@
-
/****************************************************************************
* 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 *
@@ -28,33 +27,26 @@ constexpr float x_max = 480.000000;
constexpr float y_min = 0.000000;
constexpr float y_max = 272.000000;
-const PROGMEM uint16_t syringe_outline[] = {0xED96, 0x14F0, 0xE65D, 0x10E9, 0xDED2, 0x0F9C, 0xD74B, 0x110E, 0xD01B, 0x1543, 0xCE80, 0x1836, 0xCE0A, 0x1C3A, 0xCE0F, 0x27AD, 0xCF0A, 0x2BD3, 0xD127, 0x2E5B, 0xD2A1, 0x2FF0, 0xD2A2, 0x9FC9, 0xD407, 0xA97A, 0xD7B9, 0xB10C, 0xD7BF, 0xBB58, 0xD978, 0xC2BE, 0xDD55, 0xC6EB, 0xDD58, 0xD159, 0xDE3B, 0xD3A8, 0xDFCF, 0xD3AF, 0xE0B8, 0xD04C, 0xE0B8, 0xC6EB, 0xE4A7, 0xC299, 0xE652, 0xBAF6, 0xE652, 0xB10C, 0xEA2E, 0xA8EA, 0xEB6C, 0x9E86, 0xEB6C, 0x2F58, 0xEF3C, 0x2B4E, 0xF003, 0x2583, 0xEFFD, 0x1AC2, 0xED96, 0x14F0, 0xED96, 0x14F0};
-const PROGMEM uint16_t syringe_fluid[] = {0xDE73, 0x2512, 0xDA0C, 0x261D, 0xD5B8, 0x29A0, 0xD4AE, 0x2D87, 0xD4AE, 0x9F60, 0xD585, 0xA63B, 0xDE44, 0xA9DE, 0xE32A, 0xA942, 0xE7E3, 0xA6A5, 0xE930, 0xA342, 0xE95D, 0x9C1D, 0xE95B, 0x31B8, 0xE955, 0x2B63, 0xE867, 0x2A67, 0xE790, 0x28DE, 0xE342, 0x25CB, 0xDE73, 0x2512};
-const PROGMEM uint16_t syringe[] = {0xED91, 0x1502, 0xE658, 0x10FB, 0xDECE, 0x0FAE, 0xD746, 0x1120, 0xD016, 0x1555, 0xCE7B, 0x1848, 0xCE05, 0x1C4D, 0xCE0A, 0x27BF, 0xCF05, 0x2BE5, 0xD122, 0x2E6E, 0xD29C, 0x3002, 0xD29D, 0x9FDB, 0xD402, 0xA98C, 0xD7B4, 0xB11F, 0xD7BA, 0xBB6A, 0xD973, 0xC2D1, 0xDD50, 0xC6FD, 0xDD53, 0xD16C, 0xDE36, 0xD3BA, 0xDFCA, 0xD3C2, 0xE0B3, 0xD05E, 0xE0B3, 0xC6FD, 0xE4A2, 0xC2AB, 0xE64D, 0xBB09, 0xE64D, 0xB11F, 0xEA29, 0xA8FC, 0xEB67, 0x9E98, 0xEB67, 0x2F6B, 0xEF37, 0x2B60, 0xEFFE, 0x2595, 0xEFF8, 0x1AD5, 0xED91, 0x1502, 0xED91, 0x1502, 0xFFFF, 0xD1CF, 0x1A7E, 0xD84F, 0x16DB, 0xDF19, 0x15A9, 0xE5E0, 0x16EA, 0xEC5B, 0x1AA4, 0xEC9D, 0x1D34, 0xEC9D, 0x20CC, 0xE5F1, 0x1D41, 0xDF02, 0x1C12, 0xD812, 0x1D41, 0xD166, 0x20CC, 0xD16C, 0x1B45, 0xD1CF, 0x1A7E, 0xFFFF, 0xE3BD, 0xACFD, 0xDE8E, 0xAF4F, 0xD988, 0xAC0F, 0xD7CC, 0xA8CD, 0xDD1C, 0xAAA9, 0xE287, 0xAA5B, 0xE655, 0xA8BE, 0xE3BD, 0xACFD, 0xFFFF, 0xE802, 0x2DC5, 0xE809, 0x343C, 0xE808, 0x9FC8, 0xE7E3, 0xA296, 0xE70D, 0xA4B1, 0xE2C9, 0xA70E, 0xDE4E, 0xA790, 0xD6A1, 0xA457, 0xD5FF, 0x9F2B, 0xD5FF, 0x2DFD, 0xD6B2, 0x2B72, 0xDA78, 0x2861, 0xDE9D, 0x276F, 0xE300, 0x2824, 0xE70D, 0x2B13, 0xE7FF, 0x2DB6, 0xE800, 0x2DC5, 0xE802, 0x2DC5, 0xFFFF, 0xE2ED, 0xBA8B, 0xE1CC, 0xBF52, 0xDF1C, 0xC165, 0xDC64, 0xBF99, 0xDB1B, 0xBAFF, 0xDB19, 0xB433, 0xDF04, 0xB552, 0xE2EF, 0xB438, 0xE2ED, 0xBA8B, 0xFFFF, 0xEC09, 0x2893, 0xE925, 0x2A08, 0xE57D, 0x261D, 0xE149, 0x246F, 0xDBDE, 0x24A0, 0xD6BC, 0x2795, 0xD484, 0x2A46, 0xD1C0, 0x2853, 0xD166, 0x251E, 0xD80D, 0x2151, 0xDF02, 0x200C, 0xE5F6, 0x2151, 0xEC9D, 0x251E, 0xEC09, 0x2893};
-const PROGMEM uint16_t park_btn[] = {0x0AAA, 0x0E1E, 0x57FF, 0x0E1E, 0x57FF, 0x33C3, 0x0AAA, 0x33C3, 0x0AAA, 0x0E1E};
-const PROGMEM uint16_t pause_btn[] = {0x47FF, 0xCA58, 0x7FFF, 0xCA58, 0x7FFF, 0xEFFE, 0x47FF, 0xEFFE, 0x47FF, 0xCA58};
-const PROGMEM uint16_t load_chocolate_btn[] = {0x0AAA, 0x3D2C, 0x57FF, 0x3D2C, 0x57FF, 0x62D2, 0x0AAA, 0x62D2, 0x0AAA, 0x3D2C};
-const PROGMEM uint16_t preheat_chocolate_btn[] = {0x0AAA, 0x6C3B, 0x57FF, 0x6C3B, 0x57FF, 0x91E0, 0x0AAA, 0x91E0, 0x0AAA, 0x6C3B};
-const PROGMEM uint16_t menu_btn[] = {0x0AAA, 0x9B4A, 0x57FF, 0x9B4A, 0x57FF, 0xC0EF, 0x0AAA, 0xC0EF, 0x0AAA, 0x9B4A};
-const PROGMEM uint16_t print_btn[] = {0x0AAA, 0xCA58, 0x42AA, 0xCA58, 0x42AA, 0xEFFE, 0x0AAA, 0xEFFE, 0x0AAA, 0xCA58};
-const PROGMEM uint16_t stop_btn[] = {0x8554, 0xCA58, 0xBD53, 0xCA58, 0xBD53, 0xEFFE, 0x8554, 0xEFFE, 0x8554, 0xCA58};
-const PROGMEM uint16_t print_time_hms[] = {0x62A9, 0xA968, 0x8FFE, 0xA968, 0x8FFE, 0xC0EF, 0x62A9, 0xC0EF, 0x62A9, 0xA968};
-const PROGMEM uint16_t print_time_percent[] = {0x8FFE, 0xA968, 0xBD53, 0xA968, 0xBD53, 0xC0EF, 0x8FFE, 0xC0EF, 0x8FFE, 0xA968};
-const PROGMEM uint16_t print_time_label[] = {0x62A9, 0x91E0, 0xBD53, 0x91E0, 0xBD53, 0xA986, 0x62A9, 0xA986, 0x62A9, 0x91E0};
-const PROGMEM uint16_t h3_temp[] = {0x62A9, 0x75A4, 0x8FFE, 0x75A4, 0x8FFE, 0x8D2C, 0x62A9, 0x8D2C, 0x62A9, 0x75A4};
-const PROGMEM uint16_t h3_label[] = {0x62A9, 0x5E1D, 0x8FFE, 0x5E1D, 0x8FFE, 0x75A4, 0x62A9, 0x75A4, 0x62A9, 0x5E1D};
-const PROGMEM uint16_t chocolate_label[] = {0x62A9, 0x12D2, 0xBD53, 0x12D2, 0xBD53, 0x2A5A, 0x62A9, 0x2A5A, 0x62A9, 0x12D2};
-const PROGMEM uint16_t h0_label[] = {0x62A9, 0x2A5A, 0x8FFE, 0x2A5A, 0x8FFE, 0x41E1, 0x62A9, 0x41E1, 0x62A9, 0x2A5A};
-const PROGMEM uint16_t h0_temp[] = {0x62A9, 0x41E1, 0x8FFE, 0x41E1, 0x8FFE, 0x5968, 0x62A9, 0x5968, 0x62A9, 0x41E1};
-const PROGMEM uint16_t h1_label[] = {0x8FFE, 0x2A5A, 0xBD53, 0x2A5A, 0xBD53, 0x41E1, 0x8FFE, 0x41E1, 0x8FFE, 0x2A5A};
-const PROGMEM uint16_t h1_temp[] = {0x8FFE, 0x41E1, 0xBD53, 0x41E1, 0xBD53, 0x5968, 0x8FFE, 0x5968, 0x8FFE, 0x41E1};
-const PROGMEM uint16_t h2_label[] = {0x8FFE, 0x5E1D, 0xBD53, 0x5E1D, 0xBD53, 0x75A4, 0x8FFE, 0x75A4, 0x8FFE, 0x5E1D};
-const PROGMEM uint16_t h2_temp[] = {0x8FFE, 0x75A4, 0xBD53, 0x75A4, 0xBD53, 0x8D2C, 0x8FFE, 0x8D2C, 0x8FFE, 0x75A4};
-const PROGMEM uint16_t extrude_btn[] = {0xC859, 0xDD2B, 0xF5AE, 0xDD2B, 0xF5AE, 0xEFFE, 0xC859, 0xEFFE, 0xC859, 0xDD2B};
-const PROGMEM uint16_t load_screen_extrude[] = {0x25FB, 0x89AE, 0x2F58, 0x89AE, 0x2F58, 0xAAF6, 0x3406, 0xAAF6, 0x2AAA, 0xBB9A, 0x214D, 0xAAF6, 0x25FB, 0xAAF6, 0x25FB, 0x89AE};
-const PROGMEM uint16_t load_screen_retract[] = {0x25FC, 0x790A, 0x2F58, 0x790A, 0x2F58, 0x57C2, 0x3406, 0x57C2, 0x2AAA, 0x471D, 0x214D, 0x57C2, 0x25FC, 0x57C2, 0x25FC, 0x790A};
-const PROGMEM uint16_t load_screen_back_btn[] = {0x1555, 0xCA58, 0xC553, 0xCA58, 0xC553, 0xEFFE, 0x1555, 0xEFFE, 0x1555, 0xCA58};
-const PROGMEM uint16_t load_screen_unload_btn[] = {0x4AAA, 0x8EBD, 0xC553, 0x8EBD, 0xC553, 0xB463, 0x4AAA, 0xB463, 0x4AAA, 0x8EBD};
-const PROGMEM uint16_t load_screen_load_btn[] = {0x4AAA, 0x5322, 0xC553, 0x5322, 0xC553, 0x78C7, 0x4AAA, 0x78C7, 0x4AAA, 0x5322};
-const PROGMEM uint16_t load_sreen_title[] = {0x4AAA, 0x1787, 0xC553, 0x1787, 0xC553, 0x3D2C, 0x4AAA, 0x3D2C, 0x4AAA, 0x1787};
-const PROGMEM uint16_t load_screen_increment[] = {0x1555, 0x2E1D, 0x3FFF, 0x2E1D, 0x3FFF, 0x3D2C, 0x1555, 0x3D2C, 0x1555, 0x2E1D};
+const PROGMEM uint16_t menu_btn[] = {0x0AAA, 0x0E1E, 0x6D54, 0x0E1E, 0x6D54, 0x2F0E, 0x0AAA, 0x2F0E, 0x0AAA, 0x0E1E};
+const PROGMEM uint16_t print_btn[] = {0x47FF, 0xCF0D, 0x7FFF, 0xCF0D, 0x7FFF, 0xEFFE, 0x47FF, 0xEFFE, 0x47FF, 0xCF0D};
+const PROGMEM uint16_t load_chocolate_btn[] = {0x0AAA, 0x3878, 0x6D54, 0x3878, 0x6D54, 0x5968, 0x0AAA, 0x5968, 0x0AAA, 0x3878};
+const PROGMEM uint16_t extrude_btn[] = {0x0AAA, 0x5E1D, 0x6D54, 0x5E1D, 0x6D54, 0x7F0E, 0x0AAA, 0x7F0E, 0x0AAA, 0x5E1D};
+const PROGMEM uint16_t preheat_chocolate_btn[] = {0x0AAA, 0x83C2, 0x6D54, 0x83C2, 0x6D54, 0xA4B3, 0x0AAA, 0xA4B3, 0x0AAA, 0x83C2};
+const PROGMEM uint16_t media_btn[] = {0x0AAA, 0xCF0D, 0x42AA, 0xCF0D, 0x42AA, 0xEFFE, 0x0AAA, 0xEFFE, 0x0AAA, 0xCF0D};
+const PROGMEM uint16_t pause_btn[] = {0x8554, 0xCF0D, 0xBD53, 0xCF0D, 0xBD53, 0xEFFE, 0x8554, 0xEFFE, 0x8554, 0xCF0D};
+const PROGMEM uint16_t print_time_hms[] = {0xC59E, 0xAEA0, 0xF510, 0xAEA0, 0xF510, 0xC52D, 0xC59E, 0xC52D, 0xC59E, 0xAEA0};
+const PROGMEM uint16_t file_name[] = {0x0B0E, 0xAECD, 0xBCEF, 0xAECD, 0xBCEF, 0xC4AB, 0x0B0E, 0xC4AB, 0x0B0E, 0xAECD};
+const PROGMEM uint16_t chocolate_label[] = {0x75C1, 0x1369, 0xF4FE, 0x1369, 0xF4FE, 0x2AB1, 0x75C1, 0x2AB1, 0x75C1, 0x1369};
+const PROGMEM uint16_t h0_label[] = {0x8304, 0x4BEB, 0xB271, 0x4BEB, 0xB271, 0x63B0, 0x8304, 0x63B0, 0x8304, 0x4BEB};
+const PROGMEM uint16_t h0_temp[] = {0x8304, 0x7190, 0xB271, 0x7190, 0xB271, 0x8955, 0x8304, 0x8955, 0x8304, 0x7190};
+const PROGMEM uint16_t h1_label[] = {0xBB04, 0x4BEB, 0xEA71, 0x4BEB, 0xEA71, 0x63B0, 0xBB04, 0x63B0, 0xBB04, 0x4BEB};
+const PROGMEM uint16_t h1_temp[] = {0xBB04, 0x7190, 0xEA71, 0x7190, 0xEA71, 0x8956, 0xBB04, 0x8956, 0xBB04, 0x7190};
+const PROGMEM uint16_t stop_btn[] = {0xC2A9, 0xCF0D, 0xF553, 0xCF0D, 0xF553, 0xEFFE, 0xC2A9, 0xEFFE, 0xC2A9, 0xCF0D};
+const PROGMEM uint16_t load_screen_extrude[] = {0x382C, 0x8B02, 0x4188, 0x8B02, 0x4188, 0xAC4A, 0x4637, 0xAC4A, 0x3CDA, 0xBCEE, 0x337D, 0xAC4A, 0x382C, 0xAC4A, 0x382C, 0x8B02};
+const PROGMEM uint16_t load_screen_retract[] = {0x382C, 0x7A5D, 0x4188, 0x7A5D, 0x4188, 0x5915, 0x4637, 0x5915, 0x3CDA, 0x4871, 0x337E, 0x5915, 0x382C, 0x5915, 0x382C, 0x7A5D};
+const PROGMEM uint16_t load_screen_back_btn[] = {0x1555, 0xCA58, 0xEAA8, 0xCA58, 0xEAA8, 0xEFFE, 0x1555, 0xEFFE, 0x1555, 0xCA58};
+const PROGMEM uint16_t load_screen_unload_btn[] = {0x67FF, 0x70F0, 0xEAA8, 0x70F0, 0xEAA8, 0x9695, 0x67FF, 0x9695, 0x67FF, 0x70F0};
+const PROGMEM uint16_t load_screen_start_stop_btn[] = {0x67FF, 0x9B4A, 0xEAA8, 0x9B4A, 0xEAA8, 0xC0EF, 0x67FF, 0xC0EF, 0x67FF, 0x9B4A};
+const PROGMEM uint16_t load_screen_load_btn[] = {0x67FF, 0x4696, 0xEAA8, 0x4696, 0xEAA8, 0x6C3B, 0x67FF, 0x6C3B, 0x67FF, 0x4696};
+const PROGMEM uint16_t load_screen_continuous[] = {0x67FF, 0x1787, 0xEAA8, 0x1787, 0xEAA8, 0x3D2C, 0x67FF, 0x3D2C, 0x67FF, 0x1787};
+const PROGMEM uint16_t load_screen_increment[] = {0x1555, 0x1787, 0x62A9, 0x1787, 0x62A9, 0x3D2C, 0x1555, 0x3D2C, 0x1555, 0x1787};
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/confirm_start_print_dialog_box.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/confirm_start_print_dialog_box.cpp
new file mode 100644
index 000000000000..ca98e7c9b6d4
--- /dev/null
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/confirm_start_print_dialog_box.cpp
@@ -0,0 +1,55 @@
+/**************************************
+ * confirm_start_print_dialog_box.cpp *
+ **************************************/
+
+/****************************************************************************
+ * Written By Mark Pelletier 2017 - Aleph Objects, Inc. *
+ * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. *
+ * *
+ * 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: . *
+ ****************************************************************************/
+
+#include "../config.h"
+#include "../screens.h"
+
+#ifdef COCOA_CONFIRM_START_PRINT
+
+using namespace FTDI;
+using namespace Theme;
+using namespace ExtUI;
+
+void ConfirmStartPrintDialogBox::onRedraw(draw_mode_t) {
+ FileList files;
+ const char *filename = files.filename();
+ char buffer[strlen_P(GET_TEXT(MSG_START_PRINT_CONFIRMATION)) + strlen(filename) + 1];
+ sprintf_P(buffer, GET_TEXT(MSG_START_PRINT_CONFIRMATION), filename);
+ drawMessage((const char *)buffer);
+ drawYesNoButtons();
+}
+
+bool ConfirmStartPrintDialogBox::onTouchEnd(uint8_t tag) {
+ switch (tag) {
+ case 1: {
+ FileList files;
+ printFile(files.shortFilename());
+ StatusScreen::setStatusMessage(GET_TEXT_F(MSG_PRINT_STARTING));
+ GOTO_SCREEN(StatusScreen);
+ return true;
+ }
+ case 2: GOTO_PREVIOUS(); return true;
+ default: return false;
+ }
+}
+
+#endif // COCOA_CONFIRM_START_PRINT
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/confirm_start_print_dialog_box.h b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/confirm_start_print_dialog_box.h
new file mode 100644
index 000000000000..38cb5c2774bf
--- /dev/null
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/confirm_start_print_dialog_box.h
@@ -0,0 +1,32 @@
+/************************************
+ * confirm_start_print_dialog_box.h *
+ ************************************/
+
+/****************************************************************************
+ * Written By Mark Pelletier 2017 - Aleph Objects, Inc. *
+ * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. *
+ * *
+ * 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: . *
+ ****************************************************************************/
+
+#pragma once
+
+#define COCOA_CONFIRM_START_PRINT
+#define COCOA_CONFIRM_START_PRINT_CLASS ConfirmStartPrintDialogBox
+
+class ConfirmStartPrintDialogBox : public DialogBoxBaseClass, public UncachedScreen {
+ public:
+ static void onRedraw(draw_mode_t);
+ static bool onTouchEnd(uint8_t);
+};
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/files_screen.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/files_screen.cpp
new file mode 100644
index 000000000000..581c3374288b
--- /dev/null
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/files_screen.cpp
@@ -0,0 +1,289 @@
+/********************
+ * files_screen.cpp *
+ ********************/
+
+/****************************************************************************
+ * Written By Mark Pelletier 2017 - Aleph Objects, Inc. *
+ * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. *
+ * *
+ * 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: . *
+ ****************************************************************************/
+
+#include "../config.h"
+#include "../screens.h"
+#include "../screen_data.h"
+
+#ifdef COCOA_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;
+
+constexpr static FilesScreenData &mydata = screen_data.FilesScreen;
+
+void FilesScreen::onEntry() {
+ mydata.cur_page = 0;
+ mydata.selected_tag = 0xFF;
+ #if ENABLED(SCROLL_LONG_FILENAMES) && (FTDI_API_LEVEL >= 810)
+ CLCD::mem_write_32(CLCD::REG::MACRO_0,DL::NOP);
+ #endif
+ gotoPage(0);
+ BaseScreen::onEntry();
+}
+
+const char *FilesScreen::getSelectedFilename(bool shortName) {
+ FileList files;
+ files.seek(getSelectedFileIndex(), true);
+ return shortName ? files.shortFilename() : files.filename();
+}
+
+void FilesScreen::drawSelectedFile() {
+ if(mydata.selected_tag == 0xFF) return;
+ FileList files;
+ files.seek(getSelectedFileIndex(), true);
+ mydata.flags.is_dir = files.isDir();
+ drawFileButton(
+ files.filename(),
+ mydata.selected_tag,
+ mydata.flags.is_dir,
+ true
+ );
+}
+
+uint16_t FilesScreen::getSelectedFileIndex() {
+ return getFileForTag(mydata.selected_tag);
+}
+
+uint16_t FilesScreen::getFileForTag(uint8_t tag) {
+ return mydata.cur_page * FILES_PER_PAGE + tag - 2;
+}
+
+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);
+
+ CommandProcessor cmd;
+ cmd.tag(tag);
+ cmd.cmd(COLOR_RGB(is_highlighted ? fg_action : bg_color));
+ cmd.font(font_medium).rectangle(bx, by, bw, bh);
+ cmd.cmd(COLOR_RGB(is_highlighted ? normal_btn.rgb : bg_text_enabled));
+ #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(bx, by, bw, bh, filename, OPT_CENTERY | OPT_NOFIT);
+ } else
+ #endif
+ 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());
+ #endif
+}
+
+void FilesScreen::drawFileList() {
+ FileList files;
+ 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();
+ mydata.flags.is_empty = true;
+
+ 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);
+ mydata.flags.is_empty = false;
+ } else
+ break;
+ }
+}
+
+void FilesScreen::drawHeader() {
+ char str[16];
+ 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(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() {
+ const bool has_selection = mydata.selected_tag != 0xFF;
+
+ CommandProcessor cmd;
+ cmd.colors(normal_btn)
+ .font(font_medium)
+ .colors(normal_btn)
+ .enabled(!mydata.flags.is_root)
+ .tag(245).button(BTN2_POS, F("Up Dir"))
+ .colors(action_btn);
+
+ if (mydata.flags.is_empty)
+ cmd.tag(240).button(BTN1_POS, GET_TEXT_F(MSG_BUTTON_DONE));
+ else if (has_selection && mydata.flags.is_dir)
+ cmd.tag(244).button(BTN1_POS, GET_TEXT_F(MSG_BUTTON_OPEN));
+ else
+ cmd.tag(241).enabled(has_selection).button(BTN1_POS, F("Select"));
+}
+
+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();
+ }
+}
+
+void FilesScreen::gotoPage(uint8_t page) {
+ mydata.selected_tag = 0xFF;
+ mydata.cur_page = page;
+ CommandProcessor cmd;
+ cmd.cmd(CMD_DLSTART)
+ .cmd(CLEAR_COLOR_RGB(bg_color))
+ .cmd(CLEAR(true,true,true))
+ .colors(normal_btn);
+ drawFileList();
+ storeBackground();
+}
+
+bool FilesScreen::onTouchEnd(uint8_t tag) {
+ switch (tag) {
+ case 240: // Done button, always select first file
+ {
+ FileList files;
+ files.seek(0);
+ GOTO_PREVIOUS();
+ }
+ return true;
+ case 241: // Select highlighted file
+ GOTO_PREVIOUS();
+ return true;
+ case 242: // Previous page
+ if (mydata.cur_page > 0) {
+ gotoPage(mydata.cur_page-1);
+ }
+ break;
+ case 243: // Next page
+ if (mydata.cur_page < (mydata.num_page-1)) {
+ gotoPage(mydata.cur_page+1);
+ }
+ break;
+ case 244: // Select directory
+ {
+ FileList files;
+ files.changeDir(getSelectedShortFilename());
+ gotoPage(0);
+ }
+ break;
+ case 245: // Up directory
+ {
+ FileList files;
+ files.upDir();
+ gotoPage(0);
+ }
+ break;
+ 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 *filename = getSelectedFilename();
+ if (filename[0]) {
+ CommandProcessor cmd;
+ constexpr int dim[4] = {LIST_POS};
+ const uint16_t text_width = cmd.font(font_medium).text_width(filename);
+ if (text_width > dim[2])
+ mydata.scroll_max = text_width - dim[2] + MARGIN_L + MARGIN_R + 10;
+ }
+ }
+ #endif
+ }
+ break;
+ }
+ return true;
+}
+
+void FilesScreen::onIdle() {
+ #if ENABLED(SCROLL_LONG_FILENAMES) && (FTDI_API_LEVEL >= 810)
+ if (FTDI::ftdi_chip >= 810) {
+ CLCD::mem_write_32(CLCD::REG::MACRO_0,
+ VERTEX_TRANSLATE_X(-int32_t(mydata.scroll_pos)));
+ if (mydata.scroll_pos < mydata.scroll_max * 16)
+ mydata.scroll_pos++;
+ }
+ #endif
+}
+
+void FilesScreen::onMediaRemoved() {
+ if (AT_SCREEN(FilesScreen)) GOTO_SCREEN(StatusScreen);
+}
+
+#endif // COCOA_FILES_SCREEN
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/files_screen.h b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/files_screen.h
new file mode 100644
index 000000000000..99ea52ff817b
--- /dev/null
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/files_screen.h
@@ -0,0 +1,68 @@
+/******************
+ * files_screen.h *
+ ******************/
+
+/****************************************************************************
+ * Written By Mark Pelletier 2017 - Aleph Objects, Inc. *
+ * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. *
+ * *
+ * 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: . *
+ ****************************************************************************/
+
+#pragma once
+
+#define COCOA_FILES_SCREEN
+#define COCOA_FILES_SCREEN_CLASS FilesScreen
+
+struct FilesScreenData {
+ struct {
+ uint8_t is_dir : 1;
+ uint8_t is_root : 1;
+ uint8_t is_empty : 1;
+ } flags;
+ uint8_t selected_tag;
+ uint8_t num_page;
+ uint8_t cur_page;
+ #if ENABLED(SCROLL_LONG_FILENAMES) && (FTDI_API_LEVEL >= 810)
+ uint16_t scroll_pos;
+ uint16_t scroll_max;
+ #endif
+};
+
+class FilesScreen : public BaseScreen, public CachedScreen {
+ private:
+ 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);
+ static uint16_t getSelectedFileIndex();
+
+ inline static const char *getSelectedShortFilename() {return getSelectedFilename(true);}
+ static const char *getSelectedFilename(bool shortName = false);
+
+ 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();
+
+ static void gotoPage(uint8_t);
+ public:
+ static void onEntry();
+ static void onRedraw(draw_mode_t);
+ static bool onTouchEnd(uint8_t tag);
+ static void onIdle();
+ static void onMediaRemoved();
+};
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/leveling_menu.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/leveling_menu.cpp
index 5e61bdb12f18..be18c0348388 100644
--- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/leveling_menu.cpp
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/leveling_menu.cpp
@@ -57,7 +57,9 @@ void LevelingMenu::onRedraw(draw_mode_t what) {
cmd.font(font_large)
.cmd(COLOR_RGB(bg_text_enabled))
.text(BED_MESH_TITLE_POS, GET_TEXT_F(MSG_BED_LEVELING))
+ #if ENABLED(BLTOUCH)
.text(BLTOUCH_TITLE_POS, GET_TEXT_F(MSG_BLTOUCH))
+ #endif
.font(font_medium).colors(normal_btn)
.tag(2).button(PROBE_BED_POS, GET_TEXT_F(MSG_PROBE_BED))
.enabled(ENABLED(HAS_MESH))
@@ -66,8 +68,10 @@ void LevelingMenu::onRedraw(draw_mode_t what) {
.tag(4).button(EDIT_MESH_POS, GET_TEXT_F(MSG_EDIT_MESH))
#undef GRID_COLS
#define GRID_COLS 2
+ #if ENABLED(BLTOUCH)
.tag(5).button(BLTOUCH_RESET_POS, GET_TEXT_F(MSG_BLTOUCH_RESET))
.tag(6).button(BLTOUCH_TEST_POS, GET_TEXT_F(MSG_BLTOUCH_SELFTEST))
+ #endif
#undef GRID_COLS
#define GRID_COLS 3
.colors(action_btn)
@@ -81,8 +85,10 @@ bool LevelingMenu::onTouchEnd(uint8_t tag) {
case 2: BedMeshViewScreen::doProbe(); break;
case 3: BedMeshViewScreen::show(); break;
case 4: BedMeshEditScreen::show(); break;
+ #if ENABLED(BLTOUCH)
case 5: injectCommands(F("M280 P0 S60")); break;
case 6: SpinnerDialogBox::enqueueAndWait(F("M280 P0 S90\nG4 P100\nM280 P0 S120")); break;
+ #endif
default: return false;
}
return true;
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/load_chocolate.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/load_chocolate.cpp
index d40b3be35460..95ddf7d387f7 100644
--- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/load_chocolate.cpp
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/load_chocolate.cpp
@@ -39,42 +39,6 @@ using namespace Theme;
constexpr static LoadChocolateScreenData &mydata = screen_data.LoadChocolateScreen;
-void LoadChocolateScreen::draw_syringe(draw_mode_t what) {
- #if ENABLED(COCOA_PRESS_CHOCOLATE_LEVEL_SENSOR)
- const float fill_level = get_chocolate_fill_level();
- #else
- constexpr float fill_level = 1.0f;
- #endif
-
- CommandProcessor cmd;
- PolyUI ui(cmd, what);
-
- if (what & BACKGROUND) {
- // Paint the shadow for the syringe
- ui.color(shadow_rgb);
- ui.shadow(POLY(syringe_outline), shadow_depth);
- }
-
- if (what & FOREGROUND) {
- int16_t x, y, h, v;
-
- // Paint the syringe icon
- ui.color(syringe_rgb);
- ui.fill(POLY(syringe_outline));
-
- ui.color(fluid_rgb);
- ui.bounds(POLY(syringe_fluid), x, y, h, v);
- cmd.cmd(SAVE_CONTEXT());
- cmd.cmd(SCISSOR_XY(x,y + v * (1.0 - fill_level)));
- cmd.cmd(SCISSOR_SIZE(h, v * fill_level));
- ui.fill(POLY(syringe_fluid), false);
- cmd.cmd(RESTORE_CONTEXT());
-
- ui.color(stroke_rgb);
- ui.fill(POLY(syringe));
- }
-}
-
void LoadChocolateScreen::draw_buttons(draw_mode_t what) {
int16_t x, y, h, v;
@@ -84,10 +48,18 @@ void LoadChocolateScreen::draw_buttons(draw_mode_t what) {
cmd.font(font_medium).colors(normal_btn);
ui.bounds(POLY(load_screen_unload_btn), x, y, h, v);
- cmd.tag(2).button(x, y, h, v, GET_TEXT_F(MSG_FULL_UNLOAD));
+ cmd.tag(2).colors(mydata.repeat_tag == 5 ? action_btn : normal_btn).button(x, y, h, v, GET_TEXT_F(MSG_UNLOAD));
ui.bounds(POLY(load_screen_load_btn), x, y, h, v);
- cmd.tag(3).button(x, y, h, v, GET_TEXT_F(MSG_FULL_LOAD));
+ cmd.tag(3).colors(mydata.repeat_tag == 6 ? action_btn : normal_btn).button(x, y, h, v, GET_TEXT_F(MSG_LOAD));
+
+ ui.bounds(POLY(load_screen_start_stop_btn), x, y, h, v);
+ if(mydata.repeat_tag == 0) {
+ cmd.colors(normal_btn).enabled(false);
+ } else {
+ cmd.colors(mydata.repeating ? action_btn : normal_btn).enabled(true);
+ }
+ cmd.tag(4).button(x, y, h, v, GET_TEXT_F(MSG_START_STOP));
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_BUTTON_DONE));
@@ -102,8 +74,8 @@ void LoadChocolateScreen::draw_text(draw_mode_t what) {
cmd.font(font_medium).cmd(COLOR_RGB(bg_text_enabled));
- ui.bounds(POLY(load_sreen_title), x, y, h, v);
- cmd.tag(2).text(x, y, h, v, GET_TEXT_F(MSG_LOAD_UNLOAD));
+ ui.bounds(POLY(load_screen_continuous), x, y, h, v);
+ cmd.tag(2).text(x, y, h, v, GET_TEXT_F(MSG_CONTINUOUS));
ui.bounds(POLY(load_screen_increment), x, y, h, v);
cmd.tag(3).text(x, y, h, v, GET_TEXT_F(MSG_INCREMENT));
@@ -120,11 +92,12 @@ void LoadChocolateScreen::draw_arrows(draw_mode_t what) {
constexpr uint8_t style = PolyUI::REGULAR;
- ui.button(4, POLY(load_screen_extrude), style);
- ui.button(5, POLY(load_screen_retract), style);
+ ui.button(5, POLY(load_screen_extrude), style);
+ ui.button(6, POLY(load_screen_retract), style);
}
void LoadChocolateScreen::onEntry() {
+ mydata.repeating = false;
mydata.repeat_tag = 0;
}
@@ -136,14 +109,15 @@ void LoadChocolateScreen::onRedraw(draw_mode_t what) {
.tag(0);
}
- draw_syringe(what);
draw_arrows(what);
draw_buttons(what);
draw_text(what);
}
-bool LoadChocolateScreen::onTouchStart(uint8_t) {
- mydata.repeat_tag = 0;
+bool LoadChocolateScreen::onTouchStart(uint8_t tag) {
+ if(tag != 4) {
+ mydata.repeating = false;
+ }
return true;
}
@@ -151,10 +125,13 @@ bool LoadChocolateScreen::onTouchEnd(uint8_t tag) {
using namespace ExtUI;
switch (tag) {
case 2:
- mydata.repeat_tag = (mydata.repeat_tag == 2) ? 0 : 2;
+ mydata.repeat_tag = 5;
break;
case 3:
- mydata.repeat_tag = (mydata.repeat_tag == 3) ? 0 : 3;
+ mydata.repeat_tag = 6;
+ break;
+ case 4:
+ mydata.repeating = !mydata.repeating;
break;
case 1: GOTO_PREVIOUS(); break;
}
@@ -176,26 +153,10 @@ bool LoadChocolateScreen::onTouchHeld(uint8_t tag) {
#define UI_INCREMENT_AXIS(axis) UI_INCREMENT(AxisPosition_mm, axis);
#define UI_DECREMENT_AXIS(axis) UI_DECREMENT(AxisPosition_mm, axis);
switch (tag) {
- case 2: {
- if (get_chocolate_fill_level() < 0.1) {
- mydata.repeat_tag = 0;
- return false;
- }
- UI_INCREMENT_AXIS(E0);
- break;
- }
- case 3: {
- if (get_chocolate_fill_level() > 0.75) {
- mydata.repeat_tag = 0;
- return false;
- }
- UI_DECREMENT_AXIS(E0);
- break;
- }
- case 4:
+ case 5:
UI_INCREMENT_AXIS(E0);
break;
- case 5:
+ case 6:
UI_DECREMENT_AXIS(E0);
break;
default: return false;
@@ -207,7 +168,7 @@ bool LoadChocolateScreen::onTouchHeld(uint8_t tag) {
void LoadChocolateScreen::onIdle() {
reset_menu_timeout();
- if (mydata.repeat_tag) onTouchHeld(mydata.repeat_tag);
+ if (mydata.repeating) onTouchHeld(mydata.repeat_tag);
if (refresh_timer.elapsed(STATUS_UPDATE_INTERVAL)) {
if (!EventLoop::is_touch_held())
onRefresh();
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/load_chocolate.h b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/load_chocolate.h
index 4a582f0212f8..426669775d66 100644
--- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/load_chocolate.h
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/load_chocolate.h
@@ -28,11 +28,11 @@
struct LoadChocolateScreenData {
uint8_t repeat_tag;
+ bool repeating;
};
class LoadChocolateScreen : public BaseScreen, public CachedScreen {
private:
- static void draw_syringe(draw_mode_t what);
static void draw_arrows(draw_mode_t what);
static void draw_buttons(draw_mode_t what);
static void draw_text(draw_mode_t what);
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/preheat_menu.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/preheat_menu.cpp
index b01aa81dd441..2fabb81ee4db 100644
--- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/preheat_menu.cpp
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/preheat_menu.cpp
@@ -32,7 +32,7 @@ using namespace Theme;
#define GRID_ROWS 5
void PreheatMenu::onRedraw(draw_mode_t what) {
- const int16_t w = TERN0(COCOA_PRESS_EXTRA_HEATER, has_extra_heater() ? BTN_W(1) : BTN_W(2));
+ const int16_t w = TERN0(COCOA_PRESS_EXTRA_HEATER, has_extra_heater()) ? BTN_W(1) : BTN_W(2);
const int16_t h = BTN_H(1);
if (what & BACKGROUND) {
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/screens.h b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/screens.h
index 8481e446c425..5276f64f4429 100644
--- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/screens.h
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/screens.h
@@ -90,7 +90,6 @@ enum {
#include "../generic/spinner_dialog_box.h"
#include "../generic/restore_failsafe_dialog_box.h"
#include "../generic/save_settings_dialog_box.h"
-#include "../generic/confirm_start_print_dialog_box.h"
#include "../generic/confirm_abort_print_dialog_box.h"
#include "../generic/confirm_user_request_alert_box.h"
#include "../generic/touch_calibration_screen.h"
@@ -114,7 +113,6 @@ enum {
#include "../generic/bed_mesh_edit_screen.h"
#include "../generic/case_light_screen.h"
#include "../generic/linear_advance_screen.h"
-#include "../generic/files_screen.h"
#include "../generic/move_axis_screen.h"
#include "../generic/flow_percent_screen.h"
#if HAS_JUNCTION_DEVIATION
@@ -132,3 +130,5 @@ enum {
#include "leveling_menu.h"
#include "move_xyz_screen.h"
#include "move_e_screen.h"
+#include "files_screen.h"
+#include "confirm_start_print_dialog_box.h"
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/status_screen.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/status_screen.cpp
index 00b2d6a0943e..eddf36723977 100644
--- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/status_screen.cpp
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/status_screen.cpp
@@ -29,6 +29,8 @@
#include "cocoa_press_ui.h"
#define POLY(A) PolyUI::poly_reader_t(A, sizeof(A)/sizeof(A[0]))
+#define ICON_POS(x,y,w,h) x, y, h, h
+#define TEXT_POS(x,y,w,h) x + h, y, w - h, h
const uint8_t shadow_depth = 5;
@@ -38,8 +40,28 @@ using namespace ExtUI;
float StatusScreen::increment;
+void StatusScreen::_format_time(char *outstr, uint32_t time) {
+ const uint8_t hrs = time / 3600,
+ min = (time / 60) % 60,
+ sec = time % 60;
+ if (hrs)
+ sprintf_P(outstr, PSTR("%02d:%02d"), hrs, min);
+ else
+ sprintf_P(outstr, PSTR("%02d:%02ds"), min, sec);
+}
+
void StatusScreen::loadBitmaps() {
+ // Load the bitmaps for the status screen
+ using namespace Theme;
constexpr uint32_t base = ftdi_memory_map::RAM_G;
+ CLCD::mem_write_xbm(base + Light_Bulb_Info.RAMG_offset, Light_Bulb, sizeof(Light_Bulb));
+ CLCD::mem_write_xbm(base + Chamber_Icon_Info.RAMG_offset, Chamber_Icon, sizeof(Chamber_Icon));
+ CLCD::mem_write_xbm(base + Clock_Icon_Info.RAMG_offset, Clock_Icon, sizeof(Clock_Icon));
+ CLCD::mem_write_xbm(base + File_Icon_Info.RAMG_offset, File_Icon, sizeof(File_Icon));
+ CLCD::mem_write_xbm(base + TD_Icon_Info.RAMG_offset, TD_Icon, sizeof(TD_Icon));
+ CLCD::mem_write_xbm(base + Extruder_Icon_Info.RAMG_offset, Extruder_Icon, sizeof(Extruder_Icon));
+ CLCD::mem_write_xbm(base + Bed_Heat_Icon_Info.RAMG_offset, Bed_Heat_Icon, sizeof(Bed_Heat_Icon));
+ CLCD::mem_write_xbm(base + Fan_Icon_Info.RAMG_offset, Fan_Icon, sizeof(Fan_Icon));
// Load fonts for internationalization
#if ENABLED(TOUCH_UI_USE_UTF8)
@@ -47,33 +69,50 @@ void StatusScreen::loadBitmaps() {
#endif
}
-void StatusScreen::draw_progress(draw_mode_t what) {
+void StatusScreen::draw_time(draw_mode_t what) {
CommandProcessor cmd;
PolyUI ui(cmd, what);
- int16_t x, y, h, v;
-
- cmd.cmd(COLOR_RGB(accent_color_1));
- cmd.font(font_medium);
+ int16_t x, y, w, h;
+ ui.bounds(POLY(print_time_hms), x, y, w, h);
if (what & BACKGROUND) {
- ui.bounds(POLY(print_time_label), x, y, h, v);
- cmd.text(x, y, h, v, GET_TEXT_F(MSG_ELAPSED_PRINT));
+ cmd.cmd(COLOR_RGB(bg_text_enabled))
+ .cmd (BITMAP_SOURCE(Clock_Icon_Info))
+ .cmd (BITMAP_LAYOUT(Clock_Icon_Info))
+ .cmd (BITMAP_SIZE (Clock_Icon_Info))
+ .icon(ICON_POS(x, y, w, h), Clock_Icon_Info, icon_scale)
+ .cmd(COLOR_RGB(bg_text_enabled));
}
if (what & FOREGROUND) {
const uint32_t elapsed = getProgress_seconds_elapsed();
- const uint8_t hrs = elapsed/3600;
- const uint8_t min = (elapsed/60)%60;
+ char elapsed_str[10];
+ _format_time(elapsed_str, elapsed);
+
+ cmd.font(font_medium)
+ .cmd(COLOR_RGB(bg_text_enabled))
+ .text(TEXT_POS(x, y, w, h), elapsed_str);
+ }
+}
+
+
+void StatusScreen::draw_progress(draw_mode_t what) {
+ CommandProcessor cmd;
+ PolyUI ui(cmd, what);
- char str[10];
- sprintf_P(str, PSTR(" %02d : %02d"), hrs, min);
- ui.bounds(POLY(print_time_hms), x, y, h, v);
- cmd.text(x, y, h, v, str);
+ int16_t x, y, w, h;
- sprintf_P(str, PSTR("%-3d%%"), getProgress_percent() );
- ui.bounds(POLY(print_time_percent), x, y, h, v);
- cmd.text(x, y, h, v, str);
+ cmd.cmd(COLOR_RGB(accent_color_1));
+ cmd.font(font_medium);
+
+ if (what & FOREGROUND) {
+ // Draw progress bar
+ ui.bounds(POLY(file_name), x, y, w, h);
+ const uint16_t bar_width = w * getProgress_percent() / 100;
+ cmd.tag(8)
+ .cmd(COLOR_RGB(accent_color_5))
+ .rectangle(x, y, bar_width, h);
}
}
@@ -81,30 +120,38 @@ void StatusScreen::draw_temperature(draw_mode_t what) {
CommandProcessor cmd;
PolyUI ui(cmd, what);
- int16_t x, y, h, v;
+ int16_t x, y, w, h;
if (what & BACKGROUND) {
cmd.cmd(COLOR_RGB(fluid_rgb));
cmd.font(font_medium).tag(10);
- ui.bounds(POLY(chocolate_label), x, y, h, v);
- cmd.text(x, y, h, v, GET_TEXT_F(MSG_CHOCOLATE));
+ /*ui.bounds(POLY(temp_lbl), x, y, w, h);
+ cmd.text(x, y, w, h, F("Temp"));
- ui.bounds(POLY(h0_label), x, y, h, v);
- cmd.text(x, y, h, v, GET_TEXT_F(MSG_NOZZLE));
+ ui.bounds(POLY(set_lbl), x, y, w, h);
+ cmd.text(x, y, w, h, F("Set"));*/
- ui.bounds(POLY(h1_label), x, y, h, v);
- cmd.text(x, y, h, v, GET_TEXT_F(MSG_BODY));
+ ui.bounds(POLY(chocolate_label), x, y, w, h);
+ cmd.text(x, y, w, h, F("Cocoa Press"));
+
+ ui.bounds(POLY(h0_label), x, y, w, h);
+ cmd.text(x, y, w, h, GET_TEXT_F(MSG_NOZZLE));
+
+ ui.bounds(POLY(h1_label), x, y, w, h);
+ cmd.text(x, y, w, h, GET_TEXT_F(MSG_BODY));
#if ENABLED(COCOA_PRESS_EXTRA_HEATER)
if (has_extra_heater()) {
- ui.bounds(POLY(h2_label), x, y, h, v);
- cmd.text(x, y, h, v, GET_TEXT_F(MSG_EXTERNAL));
+ ui.bounds(POLY(h2_label), x, y, w, h);
+ cmd.text(x, y, w, h, GET_TEXT_F(MSG_EXTERNAL));
}
#endif
- ui.bounds(POLY(h3_label), x, y, h, v);
- cmd.text(x, y, h, v, GET_TEXT_F(MSG_CHAMBER));
+ #if ENABLED(COCOA_PRESS_CHAMBER_COOLER)
+ ui.bounds(POLY(h3_label), x, y, w, h);
+ cmd.text(x, y, w, h, GET_TEXT_F(MSG_CHAMBER));
+ #endif
#if ENABLED(TOUCH_UI_USE_UTF8)
load_utf8_bitmaps(cmd); // Restore font bitmap handles
@@ -117,68 +164,60 @@ void StatusScreen::draw_temperature(draw_mode_t what) {
cmd.font(font_large).tag(10);
+ // Show the actual temperatures
+
format_temp(str, getActualTemp_celsius(E0));
- ui.bounds(POLY(h0_temp), x, y, h, v);
- cmd.text(x, y, h, v, str);
+ ui.bounds(POLY(h0_temp), x, y, w, h);
+ cmd.text(x, y, w, h, str);
format_temp(str, getActualTemp_celsius(E1));
- ui.bounds(POLY(h1_temp), x, y, h, v);
- cmd.text(x, y, h, v, str);
+ ui.bounds(POLY(h1_temp), x, y, w, h);
+ cmd.text(x, y, w, h, str);
#if ENABLED(COCOA_PRESS_EXTRA_HEATER)
if (has_extra_heater()) {
format_temp(str, getActualTemp_celsius(E2));
- ui.bounds(POLY(h2_temp), x, y, h, v);
- cmd.text(x, y, h, v, str);
+ ui.bounds(POLY(h2_temp), x, y, w, h);
+ cmd.text(x, y, w, h, str);
}
#endif
- format_temp(str, getActualTemp_celsius(CHAMBER));
- ui.bounds(POLY(h3_temp), x, y, h, v);
- cmd.text(x, y, h, v, str);
- }
-}
+ #if ENABLED(COCOA_PRESS_CHAMBER_COOLER)
+ format_temp(str, getActualTemp_celsius(CHAMBER));
+ ui.bounds(POLY(h3_temp), x, y, w, h);
+ cmd.text(x, y, w, h, str);
+ #endif
-void StatusScreen::draw_syringe(draw_mode_t what) {
- #if ENABLED(COCOA_PRESS_CHOCOLATE_LEVEL_SENSOR)
- const float fill_level = get_chocolate_fill_level();
- #else
- constexpr float fill_level = 1.0f;
- #endif
+ /*// Show the set temperatures
+ format_temp(str, getTargetTemp_celsius(E0));
+ ui.bounds(POLY(h0_set), x, y, w, h);
+ cmd.text(x, y, w, h, str);
- CommandProcessor cmd;
- PolyUI ui(cmd, what);
+ format_temp(str, getTargetTemp_celsius(E1));
+ ui.bounds(POLY(h1_set), x, y, w, h);
+ cmd.text(x, y, w, h, str);
- if (what & BACKGROUND) {
- // Paint the shadow for the syringe
- ui.color(shadow_rgb);
- ui.shadow(POLY(syringe_outline), shadow_depth);
- }
+ #if ENABLED(COCOA_PRESS_EXTRA_HEATER)
+ if (has_extra_heater()) {
+ format_temp(str, getTargetTemp_celsius(E2));
+ ui.bounds(POLY(h2_set), x, y, w, h);
+ cmd.text(x, y, w, h, str);
+ }
+ #endif
- if (what & FOREGROUND) {
- int16_t x, y, h, v;
-
- // Paint the syringe icon
- ui.color(syringe_rgb);
- ui.fill(POLY(syringe_outline));
-
- ui.color(fluid_rgb);
- ui.bounds(POLY(syringe_fluid), x, y, h, v);
- cmd.cmd(SAVE_CONTEXT());
- cmd.cmd(SCISSOR_XY(x,y + v * (1.0 - fill_level)));
- cmd.cmd(SCISSOR_SIZE(h, v * fill_level));
- ui.fill(POLY(syringe_fluid), false);
- cmd.cmd(RESTORE_CONTEXT());
-
- ui.color(stroke_rgb);
- ui.fill(POLY(syringe));
+ #if ENABLED(COCOA_PRESS_CHAMBER_COOLER)
+ format_temp(str, getTargetTemp_celsius(CHAMBER));
+ ui.bounds(POLY(h3_set), x, y, w, h);
+ cmd.text(x, y, w, h, str);
+ #endif*/
}
}
void StatusScreen::draw_buttons(draw_mode_t what) {
- int16_t x, y, h, v;
+ int16_t x, y, w, h;
- const bool can_print = isMediaInserted() && !isPrintingFromMedia();
+ const bool can_print = !isPrinting() && isMediaInserted() && isFileSelected();
+ const bool can_select = !isPrinting() && isMediaInserted();
const bool sdOrHostPrinting = ExtUI::isPrinting();
const bool sdOrHostPaused = ExtUI::isPrintingPaused();
@@ -187,29 +226,68 @@ void StatusScreen::draw_buttons(draw_mode_t what) {
cmd.font(font_medium).colors(normal_btn);
- ui.bounds(POLY(park_btn), x, y, h, v);
- cmd.tag(1).button(x, y, h, v, GET_TEXT_F(MSG_FILAMENT_PARK_ENABLED));
+ ui.bounds(POLY(load_chocolate_btn), x, y, w, h);
+ cmd.tag(1).button(x, y, w, h, GET_TEXT_F(MSG_LOAD_UNLOAD));
+
+ ui.bounds(POLY(extrude_btn), x, y, w, h);
+ cmd.tag(2).button(x, y, w, h, GET_TEXT_F(MSG_EXTRUDE));
+
+ ui.bounds(POLY(preheat_chocolate_btn), x, y, w, h);
+ cmd.tag(3).button(x, y, w, h, GET_TEXT_F(MSG_PREHEAT_CHOCOLATE));
+
+ ui.bounds(POLY(menu_btn), x, y, w, h);
+ cmd.tag(4).button(x, y, w, h, GET_TEXT_F(MSG_BUTTON_MENU));
+
+ ui.bounds(POLY(media_btn), x, y, w, h);
+ cmd.tag(5).enabled(can_select).button(x, y, w, h, GET_TEXT_F(MSG_BUTTON_MEDIA));
+
+ ui.bounds(POLY(print_btn), x, y, w, h);
+ cmd.tag(6).colors(action_btn).enabled(can_print).button(x, y, w, h, GET_TEXT_F(MSG_BUTTON_PRINT));
- ui.bounds(POLY(load_chocolate_btn), x, y, h, v);
- cmd.tag(2).button(x, y, h, v, GET_TEXT_F(MSG_LOAD_UNLOAD));
+ ui.bounds(POLY(pause_btn), x, y, w, h);
+ cmd.tag(sdOrHostPaused ? 8 : 7).enabled(sdOrHostPrinting).button(x, y, w, h, sdOrHostPaused ? GET_TEXT_F(MSG_BUTTON_RESUME) : GET_TEXT_F(MSG_BUTTON_PAUSE));
- ui.bounds(POLY(preheat_chocolate_btn), x, y, h, v);
- cmd.tag(3).button(x, y, h, v, GET_TEXT_F(MSG_PREHEAT_CHOCOLATE));
+ ui.bounds(POLY(stop_btn), x, y, w, h);
+ cmd.tag(9).enabled(sdOrHostPrinting).button(x, y, w, h, GET_TEXT_F(MSG_BUTTON_STOP));
+}
- ui.bounds(POLY(menu_btn), x, y, h, v);
- cmd.tag(4).button(x, y, h, v, GET_TEXT_F(MSG_BUTTON_MENU));
+void StatusScreen::draw_file(draw_mode_t what) {
+ int16_t x, y, w, h;
- ui.bounds(POLY(pause_btn), x, y, h, v);
- cmd.tag(sdOrHostPaused ? 6 : 5).enabled(sdOrHostPrinting).button(x, y, h, v, sdOrHostPaused ? GET_TEXT_F(MSG_BUTTON_RESUME) : GET_TEXT_F(MSG_BUTTON_PAUSE));
+ CommandProcessor cmd;
+ PolyUI ui(cmd, what);
- ui.bounds(POLY(stop_btn), x, y, h, v);
- cmd.tag(7).enabled(sdOrHostPrinting).button(x, y, h, v, GET_TEXT_F(MSG_BUTTON_STOP));
+ ui.bounds(POLY(file_name), x, y, w, h);
- ui.bounds(POLY(extrude_btn), x, y, h, v);
- cmd.tag(8).button(x, y, h, v, GET_TEXT_F(MSG_EXTRUDE));
+ if (what & BACKGROUND) {
+ cmd.tag(5)
+ .cmd(COLOR_RGB(bg_text_enabled))
+ .cmd (BITMAP_SOURCE(File_Icon_Info))
+ .cmd (BITMAP_LAYOUT(File_Icon_Info))
+ .cmd (BITMAP_SIZE (File_Icon_Info))
+ .icon(ICON_POS(x, y, w, h), File_Icon_Info, icon_scale);
+ }
- ui.bounds(POLY(print_btn), x, y, h, v);
- cmd.tag(9).colors(action_btn).enabled(can_print).button(x, y, h, v, GET_TEXT_F(MSG_BUTTON_PRINT));
+ if (what & FOREGROUND) {
+ cmd.cmd(COLOR_RGB(bg_text_enabled));
+
+ if(!isMediaInserted())
+ draw_text_with_ellipsis(cmd, TEXT_POS(x, y, w, h), F("No media present"), OPT_CENTERY, font_small);
+ else if(isFileSelected()) {
+ FileList list;
+ draw_text_with_ellipsis(cmd, TEXT_POS(x, y, w, h), list.filename(), OPT_CENTERY, font_small);
+ } else
+ draw_text_with_ellipsis(cmd, TEXT_POS(x, y, w, h), F("No file selected"), OPT_CENTERY, font_small);
+ }
+}
+
+bool StatusScreen::isFileSelected() {
+ if(!isMediaInserted()) return false;
+ FileList list;
+ if(list.isDir()) return false;
+ const char *filename = list.filename();
+ if(filename[0] == '\0') return false;
+ return true;
}
void StatusScreen::onRedraw(draw_mode_t what) {
@@ -220,8 +298,9 @@ void StatusScreen::onRedraw(draw_mode_t what) {
.tag(0);
}
+ draw_file(what);
+ draw_time(what);
draw_progress(what);
- draw_syringe(what);
draw_temperature(what);
draw_buttons(what);
}
@@ -233,11 +312,12 @@ bool StatusScreen::onTouchStart(uint8_t) {
bool StatusScreen::onTouchEnd(uint8_t tag) {
switch (tag) {
- case 1: SpinnerDialogBox::enqueueAndWait(F("G28 O\nG27")); break;
- case 2: GOTO_SCREEN(LoadChocolateScreen); break;
+ case 1: GOTO_SCREEN(LoadChocolateScreen); break;
case 3: GOTO_SCREEN(PreheatMenu); break;
case 4: GOTO_SCREEN(MainMenu); break;
- case 5:
+ case 5: GOTO_SCREEN(FilesScreen); break;
+ case 6: GOTO_SCREEN(ConfirmStartPrintDialogBox); break;
+ case 7:
sound.play(twinkle, PLAY_ASYNCHRONOUS);
if (ExtUI::isPrintingFromMedia())
ExtUI::pausePrint();
@@ -246,7 +326,7 @@ bool StatusScreen::onTouchEnd(uint8_t tag) {
#endif
GOTO_SCREEN(StatusScreen);
break;
- case 6:
+ case 8:
sound.play(twinkle, PLAY_ASYNCHRONOUS);
if (ExtUI::isPrintingFromMedia())
ExtUI::resumePrint();
@@ -255,12 +335,12 @@ bool StatusScreen::onTouchEnd(uint8_t tag) {
#endif
GOTO_SCREEN(StatusScreen);
break;
- case 7:
+ case 9:
GOTO_SCREEN(ConfirmAbortPrintDialogBox);
current_screen.forget();
PUSH_SCREEN(StatusScreen);
break;
- case 9: GOTO_SCREEN(FilesScreen); break;
+
case 10: GOTO_SCREEN(TemperatureScreen); break;
default: return false;
}
@@ -271,7 +351,7 @@ bool StatusScreen::onTouchEnd(uint8_t tag) {
}
bool StatusScreen::onTouchHeld(uint8_t tag) {
- if (tag == 8 && !ExtUI::isMoving()) {
+ if (tag == 2 && !ExtUI::isMoving()) {
LoadChocolateScreen::setManualFeedrateAndIncrement(1, increment);
UI_INCREMENT(AxisPosition_mm, E0);
current_screen.onRefresh();
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/status_screen.h b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/status_screen.h
index 08fb6f26d4c5..05f99e953d6c 100644
--- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/status_screen.h
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/status_screen.h
@@ -28,17 +28,19 @@
class StatusScreen : public BaseScreen, public CachedScreen {
private:
+ static void _format_time(char *outstr, uint32_t time);
+
static float increment;
static bool jog_xy;
static bool fine_motion;
+ static void draw_time(draw_mode_t what);
static void draw_progress(draw_mode_t what);
static void draw_temperature(draw_mode_t what);
- static void draw_syringe(draw_mode_t what);
- static void draw_arrows(draw_mode_t what);
- static void draw_overlay_icons(draw_mode_t what);
- static void draw_fine_motion(draw_mode_t what);
static void draw_buttons(draw_mode_t what);
+ static void draw_file(draw_mode_t what);
+
+ static bool isFileSelected();
public:
static void loadBitmaps();
static void unlockMotors();
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/max_velocity_screen.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/max_velocity_screen.cpp
index e7fc23ab4870..666a7542cccb 100644
--- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/max_velocity_screen.cpp
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/max_velocity_screen.cpp
@@ -34,7 +34,7 @@ void MaxVelocityScreen::onRedraw(draw_mode_t what) {
widgets_t w(what);
w.precision(0);
w.units(GET_TEXT_F(MSG_UNITS_MM_S));
- w.heading( GET_TEXT_F(MSG_MAX_SPEED));
+ w.heading( GET_TEXT_F(MSG_MAX_SPEED_NO_UNITS));
w.color(x_axis) .adjuster( 2, GET_TEXT_F(MSG_VMAX_X), getAxisMaxFeedrate_mm_s(X) );
w.color(y_axis) .adjuster( 4, GET_TEXT_F(MSG_VMAX_Y), getAxisMaxFeedrate_mm_s(Y) );
w.color(z_axis) .adjuster( 6, GET_TEXT_F(MSG_VMAX_Z), getAxisMaxFeedrate_mm_s(Z) );
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/language/language_en.h b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/language/language_en.h
index 5dbde8a5c359..05e625842ad9 100644
--- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/language/language_en.h
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/language/language_en.h
@@ -146,6 +146,7 @@ namespace Language_en {
LSTR MSG_PROBE_BED = u8"Probe Mesh";
LSTR MSG_PRINT_TEST = u8"Print Test (PLA)";
LSTR MSG_MOVE_Z_TO_TOP = u8"Raise Z to Top";
+ LSTR MSG_MAX_SPEED_NO_UNITS = u8"Max Speed";
#if ENABLED(TOUCH_UI_LULZBOT_BIO)
LSTR MSG_MOVE_TO_HOME = u8"Move to Home";
@@ -163,8 +164,9 @@ namespace Language_en {
LSTR MSG_CHOCOLATE = u8"Chocolate";
LSTR MSG_UNLOAD_CARTRIDGE = u8"Unload Cartridge";
LSTR MSG_LOAD_UNLOAD = u8"Load/Unload";
- LSTR MSG_FULL_LOAD = u8"Full Load";
- LSTR MSG_FULL_UNLOAD = u8"Full Unload";
+ LSTR MSG_START_STOP = u8"Start/Stop";
+ LSTR MSG_LOAD = u8"Load";
+ LSTR MSG_UNLOAD = u8"Unload";
LSTR MSG_PREHEAT_CHOCOLATE = u8"Preheat Chocolate";
LSTR MSG_PREHEAT_FINISHED = u8"Preheat finished";
LSTR MSG_PREHEAT = u8"Preheat";
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/screen_data.h b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/screen_data.h
index 5d715572fa27..48a0c1a96440 100644
--- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/screen_data.h
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/screen_data.h
@@ -64,6 +64,7 @@ union screen_data_t {
DECL_DATA_IF_INCLUDED(FTDI_ALERT_DIALOG_BOX)
DECL_DATA_IF_INCLUDED(COCOA_PREHEAT_SCREEN)
DECL_DATA_IF_INCLUDED(COCOA_LOAD_CHOCOLATE_SCREEN)
+ DECL_DATA_IF_INCLUDED(COCOA_FILES_SCREEN)
};
extern screen_data_t screen_data;
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/screens.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/screens.cpp
index ec627e313b13..ed210369c4f2 100644
--- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/screens.cpp
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/screens.cpp
@@ -116,6 +116,8 @@ SCREEN_TABLE {
DECL_SCREEN_IF_INCLUDED(COCOA_LEVELING_MENU)
DECL_SCREEN_IF_INCLUDED(COCOA_MOVE_XYZ_SCREEN)
DECL_SCREEN_IF_INCLUDED(COCOA_MOVE_E_SCREEN)
+ DECL_SCREEN_IF_INCLUDED(COCOA_CONFIRM_START_PRINT)
+ DECL_SCREEN_IF_INCLUDED(COCOA_FILES_SCREEN)
};
SCREEN_TABLE_POST
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/theme/marlin_bootscreen_landscape.h b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/theme/marlin_bootscreen_landscape.h
index 1231d31dc387..4e706a645a06 100644
--- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/theme/marlin_bootscreen_landscape.h
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/theme/marlin_bootscreen_landscape.h
@@ -1,4 +1,3 @@
-
/****************************************************************************
* 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 *
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/theme/marlin_bootscreen_portrait.h b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/theme/marlin_bootscreen_portrait.h
index c6065af7f7ca..ce0423921323 100644
--- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/theme/marlin_bootscreen_portrait.h
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/theme/marlin_bootscreen_portrait.h
@@ -1,4 +1,3 @@
-
/****************************************************************************
* 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 *