filedialog: add open mode (no overwrite prompt) and use it for 'o'

The picker is built for saving, so it asks 'file exists — overwrite?' on
confirm. That's wrong when opening a script (you want an existing file). Add a
confirm_overwrite flag (default true; FileDialogState + OpenFileDialog param);
ConfirmFileDialog only prompts when it's set. The dashboard 'o' shortcut now
opens the dialog with confirm_overwrite=false. save/export keep the guard.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-03 18:52:53 +02:00
parent 527a48145b
commit c70e767cf1
3 changed files with 11 additions and 4 deletions

View File

@@ -54,11 +54,13 @@ void Tui::OpenFileDialog(std::string title,
std::string persist_key, std::string persist_key,
std::string default_filename, std::string default_filename,
std::vector<FilenameFilter> filters, std::vector<FilenameFilter> filters,
std::function<void(const std::string &)> on_confirm) { std::function<void(const std::string &)> on_confirm,
bool confirm_overwrite) {
file_dialog.title = std::move(title); file_dialog.title = std::move(title);
file_dialog.persist_key = std::move(persist_key); file_dialog.persist_key = std::move(persist_key);
file_dialog.on_confirm = std::move(on_confirm); file_dialog.on_confirm = std::move(on_confirm);
file_dialog.filters = std::move(filters); file_dialog.filters = std::move(filters);
file_dialog.confirm_overwrite = confirm_overwrite;
file_dialog.filter_labels.clear(); file_dialog.filter_labels.clear();
for (const auto &f : file_dialog.filters) for (const auto &f : file_dialog.filters)
file_dialog.filter_labels.push_back(f.label); file_dialog.filter_labels.push_back(f.label);
@@ -122,7 +124,7 @@ void Tui::ConfirmFileDialog() {
// Overwrite guard: if the file already exists, ask before letting // Overwrite guard: if the file already exists, ask before letting
// the action proceed. Esc / No cancels; Yes runs the action. // the action proceed. Esc / No cancels; Yes runs the action.
std::error_code ec; std::error_code ec;
if (fs::exists(full, ec) && !ec) { if (file_dialog.confirm_overwrite && fs::exists(full, ec) && !ec) {
ShowConfirm("File '" + full.string() + "' already exists.\n" ShowConfirm("File '" + full.string() + "' already exists.\n"
"Overwrite?", "Overwrite?",
invoke); invoke);

View File

@@ -106,7 +106,8 @@ void Tui::Run() {
"dashboard.source", "", {}, "dashboard.source", "", {},
[this](const std::string &path) { [this](const std::string &path) {
Dispatch("source " + path); Dispatch("source " + path);
}); },
/*confirm_overwrite=*/false); // opening, not saving
return true; return true;
} }
if (e == Event::Character("s")) { // save the system snapshot if (e == Event::Character("s")) { // save the system snapshot

View File

@@ -149,6 +149,7 @@ private:
std::vector<std::string> filter_labels; ///< parallel to `filters` std::vector<std::string> filter_labels; ///< parallel to `filters`
int filter_idx = 0; int filter_idx = 0;
std::function<void(const std::string &)> on_confirm; std::function<void(const std::string &)> on_confirm;
bool confirm_overwrite = true; ///< false in "open" mode — skip the overwrite prompt.
}; };
FileDialogState file_dialog; FileDialogState file_dialog;
@@ -272,11 +273,14 @@ private:
// dir + filename are stored (one tiny file per key under the user // dir + filename are stored (one tiny file per key under the user
// data directory). `on_confirm` runs when the user presses Enter on // data directory). `on_confirm` runs when the user presses Enter on
// the action button — it receives the absolute path the user picked. // the action button — it receives the absolute path the user picked.
// `confirm_overwrite = false` puts the dialog in "open" mode: it skips the
// "file exists — overwrite?" prompt (you *want* an existing file to open).
void OpenFileDialog(std::string title, void OpenFileDialog(std::string title,
std::string persist_key, std::string persist_key,
std::string default_filename, std::string default_filename,
std::vector<FilenameFilter> filters, std::vector<FilenameFilter> filters,
std::function<void(const std::string &)> on_confirm); std::function<void(const std::string &)> on_confirm,
bool confirm_overwrite = true);
void ConfirmFileDialog(); void ConfirmFileDialog();
ftxui::Component BuildSignalTypeModal(); ftxui::Component BuildSignalTypeModal();
ftxui::Component BuildPaletteModal(); ftxui::Component BuildPaletteModal();