From bb99c99f0104b239dd88bb4e369093e8dcb50ecd Mon Sep 17 00:00:00 2001 From: Gary Talent Date: Wed, 7 May 2025 20:10:34 -0500 Subject: [PATCH] [studio] Make deleting a directory close files in that directory --- src/olympic/studio/applib/src/studioui.cpp | 13 +++++++++++++ src/olympic/studio/applib/src/studioui.hpp | 2 ++ .../studio/modlib/include/studio/project.hpp | 5 +++++ src/olympic/studio/modlib/src/project.cpp | 2 +- 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/olympic/studio/applib/src/studioui.cpp b/src/olympic/studio/applib/src/studioui.cpp index 1782fa64..5eebbeb6 100644 --- a/src/olympic/studio/applib/src/studioui.cpp +++ b/src/olympic/studio/applib/src/studioui.cpp @@ -478,6 +478,18 @@ ox::Error StudioUI::handleMoveFile(ox::StringViewCR oldPath, ox::StringViewCR ne return m_projectExplorer.refreshProjectTreeModel(); } +ox::Error StudioUI::handleDeleteDir(ox::StringViewCR path) noexcept { + auto const p = sfmt("{}/", path); + for (auto &e : m_editors) { + if (beginsWith(e->itemPath(), p)) { + oxLogError(closeFile(path)); + m_closeActiveTab = true; + break; + } + } + return m_projectExplorer.refreshProjectTreeModel(); +} + ox::Error StudioUI::handleDeleteFile(ox::StringViewCR path) noexcept { for (auto &e : m_editors) { if (path == e->itemPath()) { @@ -523,6 +535,7 @@ ox::Error StudioUI::openProjectPath(ox::StringParam path) noexcept { m_newDirDialog.newDir.connect(m_sctx.project, &Project::mkdir); m_project->dirAdded.connect(&m_projectExplorer, &ProjectExplorer::refreshProjectTreeModel); m_project->fileAdded.connect(&m_projectExplorer, &ProjectExplorer::refreshProjectTreeModel); + m_project->dirDeleted.connect(this, &StudioUI::handleDeleteDir); m_project->fileDeleted.connect(this, &StudioUI::handleDeleteFile); m_project->fileMoved.connect(this, &StudioUI::handleMoveFile); m_openFiles.clear(); diff --git a/src/olympic/studio/applib/src/studioui.hpp b/src/olympic/studio/applib/src/studioui.hpp index 811dac27..81b7ef4d 100644 --- a/src/olympic/studio/applib/src/studioui.hpp +++ b/src/olympic/studio/applib/src/studioui.hpp @@ -126,6 +126,8 @@ class StudioUI: public ox::SignalHandler { ox::Error handleMoveFile(ox::StringViewCR oldPath, ox::StringViewCR newPath, ox::UUID const&id) noexcept; + ox::Error handleDeleteDir(ox::StringViewCR path) noexcept; + ox::Error handleDeleteFile(ox::StringViewCR path) noexcept; ox::Error createOpenProject(ox::StringViewCR path) noexcept; diff --git a/src/olympic/studio/modlib/include/studio/project.hpp b/src/olympic/studio/modlib/include/studio/project.hpp index 73b0e2b7..204f67e9 100644 --- a/src/olympic/studio/modlib/include/studio/project.hpp +++ b/src/olympic/studio/modlib/include/studio/project.hpp @@ -23,6 +23,7 @@ enum class ProjectEvent { // FileRecognized is triggered for all matching files upon a new // subscription to a section of the project and upon the addition of a file. FileRecognized, + DirDeleted, FileDeleted, FileUpdated, FileMoved, @@ -134,6 +135,7 @@ class Project: public ox::SignalHandler { // file. ox::Signal fileRecognized; ox::Signal fileDeleted; + ox::Signal dirDeleted; ox::Signal fileUpdated; ox::Signal fileMoved; @@ -201,6 +203,9 @@ ox::Error Project::subscribe(ProjectEvent e, ox::SignalHandler *tgt, Functor &&s connect(this, &Project::fileRecognized, tgt, slot); break; } + case ProjectEvent::DirDeleted: + connect(this, &Project::dirDeleted, tgt, slot); + break; case ProjectEvent::FileDeleted: connect(this, &Project::fileDeleted, tgt, slot); break; diff --git a/src/olympic/studio/modlib/src/project.cpp b/src/olympic/studio/modlib/src/project.cpp index 9220d742..f5801b31 100644 --- a/src/olympic/studio/modlib/src/project.cpp +++ b/src/olympic/studio/modlib/src/project.cpp @@ -145,7 +145,7 @@ ox::Error Project::deleteItem(ox::StringViewCR path) noexcept { } auto const err = m_fs.remove(path); if (!err) { - fileDeleted.emit(path); + dirDeleted.emit(path); } return err; } else {