Skip to content

Commit

Permalink
Improve [text define] implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
timothyschoen committed Feb 12, 2025
1 parent 6255179 commit 34d6c25
Show file tree
Hide file tree
Showing 5 changed files with 40 additions and 11 deletions.
2 changes: 1 addition & 1 deletion Libraries/pure-data
Submodule pure-data updated 2 files
+14 −6 src/s_inter.c
+2 −2 src/x_text.c
10 changes: 10 additions & 0 deletions Source/Pd/Instance.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -533,6 +533,16 @@ void Instance::initialisePd(String& pdlua_version)
binbuf_free(b);
break;
}
case hash("pdtk_textwindow_raise"): {
auto const ptr = reinterpret_cast<uint64_t>(argv->a_w.w_gpointer);
static_cast<Instance*>(instance)->raiseTextEditorDialog(ptr);
break;
}
case hash("pdtk_textwindow_destroy"): {
auto const ptr = reinterpret_cast<uint64_t>(argv->a_w.w_gpointer);
static_cast<Instance*>(instance)->hideTextEditorDialog(ptr);
break;
}
}
};

Expand Down
1 change: 1 addition & 0 deletions Source/Pd/Instance.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<void(String, uint64_t)> save, std::function<void(uint64_t)> close) = 0;
virtual void clearTextEditor(uint64_t const ptr) = 0;
virtual bool isTextEditorDialogShown(uint64_t ptr) = 0;
Expand Down
35 changes: 26 additions & 9 deletions Source/PluginProcessor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<void(String, uint64_t)> save, std::function<void(uint64_t)> close)
{
MessageManager::callAsync([this, ptr, title, save, close]() {
MessageManager::callAsync([this, ptr, weakRef = pd::WeakReference(reinterpret_cast<t_pd*>(ptr), this), title, save, close]() {
static std::unique_ptr<Dialog> 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<t_pd>()) {
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<t_pd>()) {
save(text, ptr);
close(ptr);
}
textEditorDialogs[ptr].reset(nullptr);
}
if (result == 1) {
close(ptr);
if (auto lock = weakRef.get<t_pd>()) {
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<t_pd>()) {
save(lastText, ptr);
}
};

textEditorDialogs[ptr].reset(Dialogs::showTextEditorDialog("", title.toString(), onClose, onSave));
Expand Down
3 changes: 2 additions & 1 deletion Source/PluginProcessor.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<void(String, uint64_t)> save, std::function<void(uint64_t)> 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;
Expand Down

0 comments on commit 34d6c25

Please sign in to comment.