From 34d6c254f6de5b6f5f10d8e61a3e424fce8f1432 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Wed, 12 Feb 2025 21:15:29 +0100 Subject: [PATCH] Improve [text define] implementation --- Libraries/pure-data | 2 +- Source/Pd/Instance.cpp | 10 ++++++++++ Source/Pd/Instance.h | 1 + Source/PluginProcessor.cpp | 35 ++++++++++++++++++++++++++--------- Source/PluginProcessor.h | 3 ++- 5 files changed, 40 insertions(+), 11 deletions(-) diff --git a/Libraries/pure-data b/Libraries/pure-data index ad8ea1a43..8a4046a92 160000 --- a/Libraries/pure-data +++ b/Libraries/pure-data @@ -1 +1 @@ -Subproject commit ad8ea1a43168097eb3d9a082190e11e75432b901 +Subproject commit 8a4046a925311ce352bb2cab66af49b70db5249d diff --git a/Source/Pd/Instance.cpp b/Source/Pd/Instance.cpp index 56bf3780f..b4b012af9 100644 --- a/Source/Pd/Instance.cpp +++ b/Source/Pd/Instance.cpp @@ -533,6 +533,16 @@ void Instance::initialisePd(String& pdlua_version) binbuf_free(b); break; } + case hash("pdtk_textwindow_raise"): { + auto const ptr = reinterpret_cast(argv->a_w.w_gpointer); + static_cast(instance)->raiseTextEditorDialog(ptr); + break; + } + case hash("pdtk_textwindow_destroy"): { + auto const ptr = reinterpret_cast(argv->a_w.w_gpointer); + static_cast(instance)->hideTextEditorDialog(ptr); + break; + } } }; diff --git a/Source/Pd/Instance.h b/Source/Pd/Instance.h index bc5208757..65d2ef607 100644 --- a/Source/Pd/Instance.h +++ b/Source/Pd/Instance.h @@ -219,6 +219,7 @@ class Instance : public AsyncUpdater { virtual void addTextToTextEditor(uint64_t ptr, SmallString const& text) = 0; virtual void hideTextEditorDialog(uint64_t ptr) = 0; + virtual void raiseTextEditorDialog(uint64_t ptr) = 0; virtual void showTextEditorDialog(uint64_t ptr, SmallString const& title, std::function save, std::function close) = 0; virtual void clearTextEditor(uint64_t const ptr) = 0; virtual bool isTextEditorDialogShown(uint64_t ptr) = 0; diff --git a/Source/PluginProcessor.cpp b/Source/PluginProcessor.cpp index fe386f3c9..2a10b331f 100644 --- a/Source/PluginProcessor.cpp +++ b/Source/PluginProcessor.cpp @@ -1595,35 +1595,52 @@ void PluginProcessor::hideTextEditorDialog(uint64_t ptr) }); } +void PluginProcessor::raiseTextEditorDialog(uint64_t ptr) +{ + if(textEditorDialogs.contains(ptr)) + { + textEditorDialogs[ptr]->toFront(true); + } +} + void PluginProcessor::showTextEditorDialog(uint64_t ptr, SmallString const& title, std::function save, std::function close) { - MessageManager::callAsync([this, ptr, title, save, close]() { + MessageManager::callAsync([this, ptr, weakRef = pd::WeakReference(reinterpret_cast(ptr), this), title, save, close]() { static std::unique_ptr saveDialog = nullptr; - auto onClose = [this, save, title, ptr, close](String const& lastText, bool const hasChanged) { + auto onClose = [this, save, weakRef, title, ptr, close](String const& lastText, bool const hasChanged) { if (!hasChanged) { - close(ptr); + if (auto lock = weakRef.get()) { + close(ptr); + } textEditorDialogs[ptr].reset(nullptr); return; } Dialogs::showAskToSaveDialog( - &saveDialog, textEditorDialogs[ptr].get(), "", [this, save, close, ptr, title, text = lastText](int const result) mutable { + &saveDialog, textEditorDialogs[ptr].get(), "", [this, save, close, ptr, title, weakRef, text = lastText](int const result) mutable { if (result == 2) { - save(text, ptr); - close(ptr); + + if (auto lock = weakRef.get()) { + save(text, ptr); + close(ptr); + } textEditorDialogs[ptr].reset(nullptr); } if (result == 1) { - close(ptr); + if (auto lock = weakRef.get()) { + close(ptr); + } textEditorDialogs[ptr].reset(nullptr); } }, 15, false); }; - auto onSave = [save, ptr](String const& lastText) { - save(lastText, ptr); + auto onSave = [save, ptr, weakRef](String const& lastText) { + if (auto lock = weakRef.get()) { + save(lastText, ptr); + } }; textEditorDialogs[ptr].reset(Dialogs::showTextEditorDialog("", title.toString(), onClose, onSave)); diff --git a/Source/PluginProcessor.h b/Source/PluginProcessor.h index 4c20e742e..0d5ee0094 100644 --- a/Source/PluginProcessor.h +++ b/Source/PluginProcessor.h @@ -99,7 +99,8 @@ class PluginProcessor final : public AudioProcessor void addTextToTextEditor(uint64_t ptr, SmallString const& text) override; void hideTextEditorDialog(uint64_t ptr) override; void showTextEditorDialog(uint64_t ptr, SmallString const& title, std::function save, std::function close) override; - void clearTextEditor(uint64_t const ptr) override; + void raiseTextEditorDialog(uint64_t ptr) override; + void clearTextEditor(uint64_t ptr) override; bool isTextEditorDialogShown(uint64_t ptr) override; void updateConsole(int numMessages, bool newWarning) override;