[studio] Make deleting a directory close files in that directory

This commit is contained in:
Gary Talent 2025-05-07 20:10:34 -05:00
parent 7f0dcdd280
commit bb99c99f01
4 changed files with 21 additions and 1 deletions

View File

@ -478,6 +478,18 @@ ox::Error StudioUI::handleMoveFile(ox::StringViewCR oldPath, ox::StringViewCR ne
return m_projectExplorer.refreshProjectTreeModel(); 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 { ox::Error StudioUI::handleDeleteFile(ox::StringViewCR path) noexcept {
for (auto &e : m_editors) { for (auto &e : m_editors) {
if (path == e->itemPath()) { 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_newDirDialog.newDir.connect(m_sctx.project, &Project::mkdir);
m_project->dirAdded.connect(&m_projectExplorer, &ProjectExplorer::refreshProjectTreeModel); m_project->dirAdded.connect(&m_projectExplorer, &ProjectExplorer::refreshProjectTreeModel);
m_project->fileAdded.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->fileDeleted.connect(this, &StudioUI::handleDeleteFile);
m_project->fileMoved.connect(this, &StudioUI::handleMoveFile); m_project->fileMoved.connect(this, &StudioUI::handleMoveFile);
m_openFiles.clear(); m_openFiles.clear();

View File

@ -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 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 handleDeleteFile(ox::StringViewCR path) noexcept;
ox::Error createOpenProject(ox::StringViewCR path) noexcept; ox::Error createOpenProject(ox::StringViewCR path) noexcept;

View File

@ -23,6 +23,7 @@ enum class ProjectEvent {
// FileRecognized is triggered for all matching files upon a new // FileRecognized is triggered for all matching files upon a new
// subscription to a section of the project and upon the addition of a file. // subscription to a section of the project and upon the addition of a file.
FileRecognized, FileRecognized,
DirDeleted,
FileDeleted, FileDeleted,
FileUpdated, FileUpdated,
FileMoved, FileMoved,
@ -134,6 +135,7 @@ class Project: public ox::SignalHandler {
// file. // file.
ox::Signal<ox::Error(ox::StringViewCR)> fileRecognized; ox::Signal<ox::Error(ox::StringViewCR)> fileRecognized;
ox::Signal<ox::Error(ox::StringViewCR)> fileDeleted; ox::Signal<ox::Error(ox::StringViewCR)> fileDeleted;
ox::Signal<ox::Error(ox::StringViewCR)> dirDeleted;
ox::Signal<ox::Error(ox::StringViewCR path, ox::UUID const&id)> fileUpdated; ox::Signal<ox::Error(ox::StringViewCR path, ox::UUID const&id)> fileUpdated;
ox::Signal<ox::Error(ox::StringViewCR oldPath, ox::StringViewCR newPath, ox::UUID const&id)> fileMoved; ox::Signal<ox::Error(ox::StringViewCR oldPath, ox::StringViewCR newPath, ox::UUID const&id)> fileMoved;
@ -201,6 +203,9 @@ ox::Error Project::subscribe(ProjectEvent e, ox::SignalHandler *tgt, Functor &&s
connect(this, &Project::fileRecognized, tgt, slot); connect(this, &Project::fileRecognized, tgt, slot);
break; break;
} }
case ProjectEvent::DirDeleted:
connect(this, &Project::dirDeleted, tgt, slot);
break;
case ProjectEvent::FileDeleted: case ProjectEvent::FileDeleted:
connect(this, &Project::fileDeleted, tgt, slot); connect(this, &Project::fileDeleted, tgt, slot);
break; break;

View File

@ -145,7 +145,7 @@ ox::Error Project::deleteItem(ox::StringViewCR path) noexcept {
} }
auto const err = m_fs.remove(path); auto const err = m_fs.remove(path);
if (!err) { if (!err) {
fileDeleted.emit(path); dirDeleted.emit(path);
} }
return err; return err;
} else { } else {