From b71d2ba85c9233a9c3a4a39bbafe31db9ffc774b Mon Sep 17 00:00:00 2001
From: Dan Green <danngreen1@gmail.com>
Date: Thu, 22 Aug 2024 14:29:56 -0700
Subject: [PATCH 1/7] Going back from PatchView always goes to PatchSel, and
 PatchSel always goes to MainMenu

---
 firmware/src/gui/pages/patch_selector.hh | 2 +-
 firmware/src/gui/pages/patch_view.hh     | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/firmware/src/gui/pages/patch_selector.hh b/firmware/src/gui/pages/patch_selector.hh
index 91f0a34a9..f91190d2d 100644
--- a/firmware/src/gui/pages/patch_selector.hh
+++ b/firmware/src/gui/pages/patch_selector.hh
@@ -243,7 +243,7 @@ struct PatchSelectorPage : PageBase {
 				lv_obj_clear_state(ui_PatchListRoller, LV_STATE_FOCUSED);
 				subdir_panel.focus();
 			} else {
-				page_list.request_last_page();
+				page_list.request_new_page_no_history(PageId::MainMenu, args);
 			}
 		}
 
diff --git a/firmware/src/gui/pages/patch_view.hh b/firmware/src/gui/pages/patch_view.hh
index ed1a61c79..a46fc03ff 100644
--- a/firmware/src/gui/pages/patch_view.hh
+++ b/firmware/src/gui/pages/patch_view.hh
@@ -279,7 +279,7 @@ struct PatchViewPage : PageBase {
 
 			} else {
 				abort_cable(gui_state, notify_queue);
-				page_list.request_last_page();
+				page_list.request_new_page_no_history(PageId::PatchSel, args);
 				blur();
 			}
 		}

From f969939ead38fdf97074e15f9d735b45fa66b94c Mon Sep 17 00:00:00 2001
From: Dan Green <danngreen1@gmail.com>
Date: Thu, 22 Aug 2024 15:43:17 -0700
Subject: [PATCH 2/7] New patches should not start with /

---
 firmware/src/gui/pages/save_dialog.hh         | 3 ++-
 firmware/src/patch_file/open_patch_manager.hh | 2 +-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/firmware/src/gui/pages/save_dialog.hh b/firmware/src/gui/pages/save_dialog.hh
index a85506ec4..8243fd8d5 100644
--- a/firmware/src/gui/pages/save_dialog.hh
+++ b/firmware/src/gui/pages/save_dialog.hh
@@ -250,7 +250,8 @@ private:
 
 		page->file_name = lv_textarea_get_text(ui_SaveDialogFilename);
 
-		std::string fullpath = page->file_path + "/" + page->file_name;
+		std::string fullpath = page->file_path.length() ? (page->file_path + "/") : "";
+		fullpath += page->file_name;
 		if (!fullpath.ends_with(".yml")) {
 			fullpath.append(".yml");
 		}
diff --git a/firmware/src/patch_file/open_patch_manager.hh b/firmware/src/patch_file/open_patch_manager.hh
index a37ee61c2..a275d03a4 100644
--- a/firmware/src/patch_file/open_patch_manager.hh
+++ b/firmware/src/patch_file/open_patch_manager.hh
@@ -193,7 +193,7 @@ public:
 
 	void new_patch() {
 		std::string name = "Untitled Patch " + std::to_string((uint8_t)std::rand());
-		std::string filename = "/" + name + ".yml";
+		std::string filename = name + ".yml";
 		PatchLocation loc{std::string_view{filename}, Volume::RamDisk};
 		view_patch_ = open_patches_.emplace_back(loc);
 		view_patch_->patch.blank_patch(name);

From e1bbb8bbfd3dfed0955f6654a60627b59c1231a9 Mon Sep 17 00:00:00 2001
From: Dan Green <danngreen1@gmail.com>
Date: Thu, 22 Aug 2024 15:43:46 -0700
Subject: [PATCH 3/7] Fix issue with saving a new patch, play button doesnt
 work

---
 firmware/src/gui/pages/patch_view.hh | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/firmware/src/gui/pages/patch_view.hh b/firmware/src/gui/pages/patch_view.hh
index a46fc03ff..444b2cb2f 100644
--- a/firmware/src/gui/pages/patch_view.hh
+++ b/firmware/src/gui/pages/patch_view.hh
@@ -292,6 +292,8 @@ struct PatchViewPage : PageBase {
 
 		if (file_menu.did_filesystem_change()) {
 			gui_state.force_refresh_vol = patches.get_view_patch_vol();
+			displayed_patch_loc_hash = patches.get_view_patch_loc_hash();
+			args.patch_loc_hash = patches.get_view_patch_loc_hash();
 		}
 
 		if (is_patch_playing && !patch_playloader.is_audio_muted()) {

From 3c7d412351bbf943b1cffb7d2c2e08b54f01e287 Mon Sep 17 00:00:00 2001
From: Dan Green <danngreen1@gmail.com>
Date: Thu, 22 Aug 2024 16:25:01 -0700
Subject: [PATCH 4/7] Don't persiste module selection between patches

---
 firmware/src/gui/pages/patch_selector.hh | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/firmware/src/gui/pages/patch_selector.hh b/firmware/src/gui/pages/patch_selector.hh
index f91190d2d..aa7ec7a5d 100644
--- a/firmware/src/gui/pages/patch_selector.hh
+++ b/firmware/src/gui/pages/patch_selector.hh
@@ -36,6 +36,9 @@ struct PatchSelectorPage : PageBase {
 	void prepare_focus() override {
 		abort_cable(gui_state, notify_queue);
 
+		// Don't persist module selection
+		args.module_id = std::nullopt;
+
 		state = State::TryingToRequestPatchList;
 		hide_spinner();
 		blur_subdir_panel();

From da5ada22a01b4d374153d09c42943f5a2c2f5022 Mon Sep 17 00:00:00 2001
From: Dan Green <danngreen1@gmail.com>
Date: Thu, 22 Aug 2024 16:31:01 -0700
Subject: [PATCH 5/7] Open Patch Manager: Check if playing patch still exists

---
 firmware/src/patch_file/open_patch_manager.hh | 12 +++++++++---
 firmware/src/patch_file/open_patches.hh       | 12 +++++++++++-
 2 files changed, 20 insertions(+), 4 deletions(-)

diff --git a/firmware/src/patch_file/open_patch_manager.hh b/firmware/src/patch_file/open_patch_manager.hh
index a275d03a4..73f11e155 100644
--- a/firmware/src/patch_file/open_patch_manager.hh
+++ b/firmware/src/patch_file/open_patch_manager.hh
@@ -111,9 +111,15 @@ public:
 	// playing_patch: (copy of) patch currently playing in the audio thread
 	//
 	PatchData *get_playing_patch() {
-		if (playing_patch_)
-			return &playing_patch_->patch;
-		else {
+		if (playing_patch_) {
+			if (open_patches_.exists(playing_patch_)) {
+				pr_dbg("Playing patch exists\n");
+				return &playing_patch_->patch;
+			} else {
+				pr_err("Playing patch not null and not found in open patches!\n");
+				return nullptr;
+			}
+		} else {
 			return nullptr;
 		}
 	}
diff --git a/firmware/src/patch_file/open_patches.hh b/firmware/src/patch_file/open_patches.hh
index 68517d23e..f6bf07cd7 100644
--- a/firmware/src/patch_file/open_patches.hh
+++ b/firmware/src/patch_file/open_patches.hh
@@ -57,6 +57,16 @@ struct OpenPatchList {
 		return num_erased > 0;
 	}
 
+	bool exists(OpenPatch const *patch) {
+		for (auto const &p : list) {
+			if (&p == patch)
+				return true;
+		}
+		return false;
+
+		// return (std::find(list.begin(), list.end(), patch) != list.end());
+	}
+
 	void remove(std::list<OpenPatch>::iterator item) {
 		list.erase(item);
 	}
@@ -81,7 +91,6 @@ struct OpenPatchList {
 		return list.size();
 	}
 
-private:
 	void dump_open_patches() {
 		unsigned i = 0;
 		size_t total_size = 0;
@@ -100,6 +109,7 @@ private:
 		pr_dbg("TOTAL: %zu\n", total_size);
 	}
 
+private:
 	static size_t patch_size(PatchData const &p) {
 		auto sz = sizeof(PatchData);
 		sz += p.module_slugs.size() * sizeof(BrandModuleSlug);

From 80abe4febd7d657f208fe8abc5724b40b1009751 Mon Sep 17 00:00:00 2001
From: Dan Green <danngreen1@gmail.com>
Date: Thu, 22 Aug 2024 16:33:25 -0700
Subject: [PATCH 6/7] Update playing_patch if its removed from open patches due
 to needing to be reloaded

---
 firmware/src/patch_file/open_patch_manager.hh | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/firmware/src/patch_file/open_patch_manager.hh b/firmware/src/patch_file/open_patch_manager.hh
index 73f11e155..1057d5ec6 100644
--- a/firmware/src/patch_file/open_patch_manager.hh
+++ b/firmware/src/patch_file/open_patch_manager.hh
@@ -86,9 +86,17 @@ public:
 
 	// Parses and opens the loaded patch, and sets the view patch to point to it
 	bool open_patch(std::span<char> file_data, PatchLocation const &patch_loc) {
+		bool patch_is_playing = false;
 
-		if (open_patches_.find(patch_loc)) {
+		if (auto patch = open_patches_.find(patch_loc)) {
+			open_patches_.dump_open_patches();
+
+			if (patch == playing_patch_)
+				patch_is_playing = true;
+
+			pr_warn("open patch found already. p:%d\n", patch_is_playing);
 			open_patches_.remove(patch_loc);
+			open_patches_.dump_open_patches();
 		}
 
 		auto *new_patch = open_patches_.emplace_back(patch_loc);
@@ -96,6 +104,10 @@ public:
 		if (!yaml_raw_to_patch(file_data, new_patch->patch)) {
 			pr_err("Failed to parse\n");
 			open_patches_.remove_last();
+
+			if (patch_is_playing)
+				playing_patch_ = nullptr;
+
 			return false;
 		}
 
@@ -104,6 +116,9 @@ public:
 
 		view_patch_ = new_patch;
 
+		if (patch_is_playing)
+			playing_patch_ = new_patch;
+
 		return true;
 	}
 

From eccc77ac17a83d335be60a36415c43e6c326cb96 Mon Sep 17 00:00:00 2001
From: Dan Green <danngreen1@gmail.com>
Date: Thu, 22 Aug 2024 16:44:08 -0700
Subject: [PATCH 7/7] Update coreModules (build hub with 4ms)

---
 firmware/lib/CoreModules | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/firmware/lib/CoreModules b/firmware/lib/CoreModules
index f668f66b6..6112770ea 160000
--- a/firmware/lib/CoreModules
+++ b/firmware/lib/CoreModules
@@ -1 +1 @@
-Subproject commit f668f66b6130dcbf452d090f1241eadf1ff55681
+Subproject commit 6112770ea555dfb7afa8e7494ba94bba7a687294