From 172cc0dd03c796e08651e8df755e0fad2a3f3856 Mon Sep 17 00:00:00 2001
From: Thomas Niccolo Reyes <niccoreyes@gmail.com>
Date: Wed, 18 Nov 2020 12:30:32 +0800
Subject: [PATCH] Open File Browser on Media Insert (option) (#20151)

Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
---
 Marlin/Configuration_adv.h             |  2 ++
 Marlin/src/feature/password/password.h |  2 +-
 Marlin/src/gcode/gcode.h               |  8 ++------
 Marlin/src/lcd/marlinui.cpp            | 11 ++++++++++-
 Marlin/src/lcd/marlinui.h              |  1 +
 Marlin/src/lcd/menu/menu_item.h        |  1 +
 Marlin/src/lcd/menu/menu_main.cpp      |  4 ++--
 Marlin/src/lcd/menu/menu_media.cpp     |  4 +++-
 Marlin/src/lcd/menu/menu_password.cpp  |  8 +++-----
 9 files changed, 25 insertions(+), 16 deletions(-)

diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h
index 0951dfaa6d4..fa7323a6664 100644
--- a/Marlin/Configuration_adv.h
+++ b/Marlin/Configuration_adv.h
@@ -1193,6 +1193,8 @@
 
   //#define MENU_ADDAUTOSTART               // Add a menu option to run auto#.g files
 
+  //#define BROWSE_MEDIA_ON_INSERT          // Open the file browser when media is inserted
+
   #define EVENT_GCODE_SD_ABORT "G28XY"      // G-code to run on SD Abort Print (e.g., "G28XY" or "G27")
 
   #if ENABLED(PRINTER_EVENT_LEDS)
diff --git a/Marlin/src/feature/password/password.h b/Marlin/src/feature/password/password.h
index 97c31745578..1382d6df405 100644
--- a/Marlin/src/feature/password/password.h
+++ b/Marlin/src/feature/password/password.h
@@ -47,7 +47,7 @@ public:
     static void start_over();
 
     static void digit_entered();
-    static void set_password_done();
+    static void set_password_done(const bool with_set=true);
     static void menu_password_report();
 
     static void remove_password();
diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h
index ddd48a389d3..3fbb88829e0 100644
--- a/Marlin/src/gcode/gcode.h
+++ b/Marlin/src/gcode/gcode.h
@@ -769,12 +769,8 @@ private:
 
   #if ENABLED(PASSWORD_FEATURE)
     static void M510();
-    #if ENABLED(PASSWORD_UNLOCK_GCODE)
-      static void M511();
-    #endif
-    #if ENABLED(PASSWORD_CHANGE_GCODE)
-      static void M512();
-    #endif
+    TERN_(PASSWORD_UNLOCK_GCODE, static void M511());
+    TERN_(PASSWORD_CHANGE_GCODE, static void M512());
   #endif
 
   TERN_(SDSUPPORT, static void M524());
diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp
index 13c85be7872..9d0ebe27e4b 100644
--- a/Marlin/src/lcd/marlinui.cpp
+++ b/Marlin/src/lcd/marlinui.cpp
@@ -30,6 +30,10 @@
   #include "../feature/host_actions.h"
 #endif
 
+#if ENABLED(BROWSE_MEDIA_ON_INSERT, PASSWORD_ON_SD_PRINT_MENU)
+  #include "../feature/password/password.h"
+#endif
+
 // All displays share the MarlinUI class
 #include "marlinui.h"
 MarlinUI ui;
@@ -1620,7 +1624,12 @@ void MarlinUI::update() {
     if (status) {
       if (old_status < 2) {
         TERN_(EXTENSIBLE_UI, ExtUI::onMediaInserted()); // ExtUI response
-        set_status_P(GET_TEXT(MSG_MEDIA_INSERTED));
+        #if ENABLED(BROWSE_MEDIA_ON_INSERT)
+          quick_feedback();
+          goto_screen(MEDIA_MENU_GATEWAY);
+        #else
+          set_status_P(GET_TEXT(MSG_MEDIA_INSERTED));
+        #endif
       }
     }
     else {
diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h
index 6ce59132bf7..3311f55ed57 100644
--- a/Marlin/src/lcd/marlinui.h
+++ b/Marlin/src/lcd/marlinui.h
@@ -322,6 +322,7 @@ public:
   #endif
 
   #if ENABLED(SDSUPPORT)
+    #define MEDIA_MENU_GATEWAY TERN(PASSWORD_ON_SD_PRINT_MENU, password.media_gatekeeper, menu_media)
     static void media_changed(const uint8_t old_stat, const uint8_t stat);
   #endif
 
diff --git a/Marlin/src/lcd/menu/menu_item.h b/Marlin/src/lcd/menu/menu_item.h
index 3ebe38235dd..6430021223c 100644
--- a/Marlin/src/lcd/menu/menu_item.h
+++ b/Marlin/src/lcd/menu/menu_item.h
@@ -354,6 +354,7 @@ class MenuItem_bool : public MenuEditItemBase {
 #define MENU_ITEM_P(TYPE, PLABEL, V...)                 _MENU_ITEM_P(TYPE, false, PLABEL, ##V)
 #define MENU_ITEM(TYPE, LABEL, V...)                     MENU_ITEM_P(TYPE, GET_TEXT(LABEL), ##V)
 
+#define BACK_ITEM_P(PLABEL)                              MENU_ITEM_P(back, PLABEL)
 #define BACK_ITEM(LABEL)                                   MENU_ITEM(back, LABEL)
 
 #define ACTION_ITEM_N_S_P(N, S, PLABEL, ACTION)      MENU_ITEM_N_S_P(function, N, S, PLABEL, ACTION)
diff --git a/Marlin/src/lcd/menu/menu_main.cpp b/Marlin/src/lcd/menu/menu_main.cpp
index 992303b7913..bb65ce61e26 100644
--- a/Marlin/src/lcd/menu/menu_main.cpp
+++ b/Marlin/src/lcd/menu/menu_main.cpp
@@ -141,7 +141,7 @@ void menu_main() {
 
       if (card_detected) {
         if (!card_open) {
-          SUBMENU(MSG_MEDIA_MENU, TERN(PASSWORD_ON_SD_PRINT_MENU, password.media_gatekeeper, menu_media));
+          SUBMENU(MSG_MEDIA_MENU, MEDIA_MENU_GATEWAY);
           #if PIN_EXISTS(SD_DETECT)
             GCODES_ITEM(MSG_CHANGE_MEDIA, M21_STR);
           #else
@@ -248,7 +248,7 @@ void menu_main() {
           #else
             GCODES_ITEM(MSG_RELEASE_MEDIA, PSTR("M22"));
           #endif
-          SUBMENU(MSG_MEDIA_MENU, TERN(PASSWORD_ON_SD_PRINT_MENU, password.media_gatekeeper, menu_media));
+          SUBMENU(MSG_MEDIA_MENU, MEDIA_MENU_GATEWAY);
         }
       }
       else {
diff --git a/Marlin/src/lcd/menu/menu_media.cpp b/Marlin/src/lcd/menu/menu_media.cpp
index 93ecc49d985..59cb2baa231 100644
--- a/Marlin/src/lcd/menu/menu_media.cpp
+++ b/Marlin/src/lcd/menu/menu_media.cpp
@@ -104,6 +104,8 @@ class MenuItem_sdfolder : public MenuItem_sdbase {
     }
 };
 
+extern uint8_t screen_history_depth;
+
 void menu_media() {
   ui.encoder_direction_menus();
 
@@ -115,7 +117,7 @@ void menu_media() {
   #endif
 
   START_MENU();
-  BACK_ITEM(MSG_MAIN);
+  BACK_ITEM_P(TERN1(BROWSE_MEDIA_ON_INSERT, screen_history_depth) ? GET_TEXT(MSG_MAIN) : GET_TEXT(MSG_BACK));
   if (card.flag.workDirIsRoot) {
     #if !PIN_EXISTS(SD_DETECT)
       ACTION_ITEM(MSG_REFRESH, []{ encoderTopLine = 0; card.mount(); });
diff --git a/Marlin/src/lcd/menu/menu_password.cpp b/Marlin/src/lcd/menu/menu_password.cpp
index c3924b56869..c58931cf2e3 100644
--- a/Marlin/src/lcd/menu/menu_password.cpp
+++ b/Marlin/src/lcd/menu/menu_password.cpp
@@ -152,19 +152,17 @@ void Password::menu_password_report() {
   END_SCREEN();
 }
 
-void Password::set_password_done() {
-  is_set = true;
+void Password::set_password_done(const bool with_set/*=true*/) {
+  is_set = with_set;
   value = value_entry;
   ui.completion_feedback(true);
   ui.goto_screen(menu_password_report);
 }
 
 void Password::remove_password() {
-  is_set = false;
   string[0] = '0';
   string[1] = '\0';
-  ui.completion_feedback(true);
-  ui.goto_screen(menu_password_report);
+  set_password_done(false);
 }
 
 //