UIYesNoCancel

This commit is contained in:
krzosa
2025-12-28 16:22:39 +01:00
parent e9db3d7386
commit 19d5a26966

View File

@@ -782,6 +782,37 @@ SaveResult TrySavingAllBuffers() {
return SAVE_YES; return SAVE_YES;
} }
String UIYesNoCancel(mco_coro *co, BSet main, String question) {
JumpGarbageBuffer(&main);
NextActiveWindowID = main.window->id;
RawAppendf(main.buffer, R"==(
%S
:Yes :No :Cancel
)==", question);
main.view->carets[0] = FindNext(main.buffer, u":Yes", MakeCaret(0));
main.view->carets[0].range.min = main.view->carets[0].range.max;
Add(&main.view->hooks, {"Yes", "enter", [](){BSet active = GetBSet(ActiveWindowID); active.view->hook_cmd = "Yes";}, ParseKeyCached("enter")});
Add(&main.view->hooks, {"No", "", [](){BSet active = GetBSet(ActiveWindowID); active.view->hook_cmd = "No";}, ParseKeyCached("")});
Add(&main.view->hooks, {"Cancel", "escape", [](){BSet active = GetBSet(ActiveWindowID); active.view->hook_cmd = "Cancel";}, ParseKeyCached("escape")});
String result = "Cancel";
for (;;) {
if (main.window->active_view != main.view->id || main.window->close) {
break;
}
if (main.view->hook_cmd != "") {
result = main.view->hook_cmd;
break;
}
CoYield(co);
}
Close(main.buffer->id);
return result;
}
void Coro_Close(mco_coro *co) { void Coro_Close(mco_coro *co) {
BSet main = GetBSet(LastActiveLayoutWindowID); BSet main = GetBSet(LastActiveLayoutWindowID);
if (main.buffer->special || main.buffer->garbage) { if (main.buffer->special || main.buffer->garbage) {
@@ -810,40 +841,15 @@ void Coro_Close(mco_coro *co) {
return; return;
} }
Buffer *buffer = main.buffer; Scratch scratch;
JumpGarbageBuffer(&main); String question = Format(scratch, "Do you want to save [%S] before closing?", main.buffer->name);
NextActiveWindowID = main.window->id; String result = UIYesNoCancel(co, main, question);
if (result == "Yes") {
RawAppendf(main.buffer, R"==( SaveBuffer(main.buffer);
Do you want to save [%S] before closing?
:Yes :No :Cancel
)==", buffer->name);
main.view->carets[0] = FindNext(main.buffer, u":Yes", MakeCaret(0));
main.view->carets[0].range.min = main.view->carets[0].range.max;
Add(&main.view->hooks, {"Yes", "enter", [](){BSet active = GetBSet(ActiveWindowID); active.view->hook_cmd = "Yes";}, ParseKeyCached("enter")});
Add(&main.view->hooks, {"No", "", [](){BSet active = GetBSet(ActiveWindowID); active.view->hook_cmd = "No";}, ParseKeyCached("")});
Add(&main.view->hooks, {"Cancel", "escape", [](){BSet active = GetBSet(ActiveWindowID); active.view->hook_cmd = "Cancel";}, ParseKeyCached("escape")});
for (;;) {
if (main.window->active_view != main.view->id || main.window->close) {
Close(main.buffer->id); Close(main.buffer->id);
return; } else if (result == "No") {
}
if (main.view->hook_cmd != "") {
break;
}
CoYield(co);
}
Close(main.buffer->id); Close(main.buffer->id);
if (main.view->hook_cmd == "Yes") { } else if (result == "Cancel") {
SaveBuffer(buffer);
Close(buffer->id);
} else if (main.view->hook_cmd == "No") {
Close(buffer->id);
} else if (main.view->hook_cmd == "Cancel") {
return; return;
} ElseInvalidCodepath(); } ElseInvalidCodepath();
} }