From 4e5c7499181904c6e0432a9d56e94c1449f06e79 Mon Sep 17 00:00:00 2001 From: Gary Talent Date: Sat, 18 Jan 2025 22:32:12 -0600 Subject: [PATCH] [studio] Add support for deleting files --- .../studio/applib/src/projectexplorer.cpp | 10 ++++++---- .../studio/applib/src/projectexplorer.hpp | 13 +++++++------ .../studio/applib/src/projecttreemodel.cpp | 18 ++++++++++++++---- .../studio/applib/src/projecttreemodel.hpp | 10 +++++++--- 4 files changed, 34 insertions(+), 17 deletions(-) diff --git a/src/olympic/studio/applib/src/projectexplorer.cpp b/src/olympic/studio/applib/src/projectexplorer.cpp index 0a058422..0266cfca 100644 --- a/src/olympic/studio/applib/src/projectexplorer.cpp +++ b/src/olympic/studio/applib/src/projectexplorer.cpp @@ -12,12 +12,12 @@ namespace studio { static ox::Result> buildProjectTreeModel( ProjectExplorer &explorer, - ox::StringView name, + ox::StringParam name, ox::StringView path, ProjectTreeModel *parent) noexcept { auto const fs = explorer.romFs(); OX_REQUIRE(stat, fs->stat(path)); - auto out = ox::make_unique(explorer, ox::String(name), parent); + auto out = ox::make_unique(explorer, std::move(name), parent); if (stat.fileType == ox::FileType::Directory) { OX_REQUIRE_M(children, fs->ls(path)); std::sort(children.begin(), children.end()); @@ -37,12 +37,14 @@ static ox::Result> buildProjectTreeModel( ProjectExplorer::ProjectExplorer(turbine::Context &ctx) noexcept: m_ctx(ctx) { } -void ProjectExplorer::draw(studio::StudioContext &ctx) noexcept { +void ProjectExplorer::draw(StudioContext &ctx) noexcept { auto const viewport = ImGui::GetContentRegionAvail(); ImGui::BeginChild("ProjectExplorer", ImVec2(300, viewport.y), true); ImGui::SetNextItemOpen(true); if (m_treeModel) { - m_treeModel->draw(ctx.tctx); + if (m_treeModel->draw(ctx.tctx)) { + oxLogError(refreshProjectTreeModel()); + } } ImGui::EndChild(); } diff --git a/src/olympic/studio/applib/src/projectexplorer.hpp b/src/olympic/studio/applib/src/projectexplorer.hpp index 8341670d..87680e36 100644 --- a/src/olympic/studio/applib/src/projectexplorer.hpp +++ b/src/olympic/studio/applib/src/projectexplorer.hpp @@ -12,27 +12,28 @@ namespace studio { -class ProjectExplorer: public studio::Widget { +class ProjectExplorer: public Widget { private: ox::UPtr m_treeModel; turbine::Context &m_ctx; + public: + // slots + ox::Signal fileChosen; + explicit ProjectExplorer(turbine::Context &ctx) noexcept; - void draw(studio::StudioContext &ctx) noexcept override; + void draw(StudioContext &ctx) noexcept override; void setModel(ox::UPtr &&model) noexcept; ox::Error refreshProjectTreeModel(ox::StringViewCR = {}) noexcept; [[nodiscard]] - inline ox::FileSystem *romFs() noexcept { + ox::FileSystem *romFs() noexcept { return rom(m_ctx); } - // slots - public: - ox::Signal fileChosen; }; } diff --git a/src/olympic/studio/applib/src/projecttreemodel.cpp b/src/olympic/studio/applib/src/projecttreemodel.cpp index 40d98dc0..48ced550 100644 --- a/src/olympic/studio/applib/src/projecttreemodel.cpp +++ b/src/olympic/studio/applib/src/projecttreemodel.cpp @@ -9,8 +9,10 @@ namespace studio { -ProjectTreeModel::ProjectTreeModel(ProjectExplorer &explorer, ox::String name, - ProjectTreeModel *parent) noexcept: +ProjectTreeModel::ProjectTreeModel( + ProjectExplorer &explorer, + ox::StringParam name, + ProjectTreeModel *parent) noexcept: m_explorer(explorer), m_parent(parent), m_name(std::move(name)) { @@ -23,12 +25,13 @@ ProjectTreeModel::ProjectTreeModel(ProjectTreeModel &&other) noexcept: m_children(std::move(other.m_children)) { } -void ProjectTreeModel::draw(turbine::Context &ctx) const noexcept { +bool ProjectTreeModel::draw(turbine::Context &ctx) const noexcept { + bool updated = false; constexpr auto dirFlags = ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_OpenOnDoubleClick; if (!m_children.empty()) { if (ImGui::TreeNodeEx(m_name.c_str(), dirFlags)) { for (auto const&child : m_children) { - child->draw(ctx); + updated = child->draw(ctx) || updated; } ImGui::TreePop(); } @@ -39,9 +42,16 @@ void ProjectTreeModel::draw(turbine::Context &ctx) const noexcept { if (ImGui::IsItemHovered() && ImGui::IsMouseDoubleClicked(0)) { m_explorer.fileChosen.emit(path); } + if (ImGui::BeginPopupContextItem("FileMenu", ImGuiPopupFlags_MouseButtonRight)) { + if (ImGui::MenuItem("Delete")) { + updated = m_explorer.romFs()->remove(path).errCode == 0 || updated; + } + ImGui::EndPopup(); + } ImGui::TreePop(); } } + return updated; } void ProjectTreeModel::setChildren(ox::Vector> children) noexcept { diff --git a/src/olympic/studio/applib/src/projecttreemodel.hpp b/src/olympic/studio/applib/src/projecttreemodel.hpp index 6e205051..2d9313d5 100644 --- a/src/olympic/studio/applib/src/projecttreemodel.hpp +++ b/src/olympic/studio/applib/src/projecttreemodel.hpp @@ -17,19 +17,23 @@ class ProjectTreeModel { ProjectTreeModel *m_parent = nullptr; ox::String m_name; ox::Vector> m_children; + public: - explicit ProjectTreeModel(class ProjectExplorer &explorer, ox::String name, - ProjectTreeModel *parent = nullptr) noexcept; + explicit ProjectTreeModel( + ProjectExplorer &explorer, ox::StringParam name, + ProjectTreeModel *parent = nullptr) noexcept; ProjectTreeModel(ProjectTreeModel &&other) noexcept; - void draw(turbine::Context &ctx) const noexcept; + [[nodiscard]] + bool draw(turbine::Context &ctx) const noexcept; void setChildren(ox::Vector> children) noexcept; private: [[nodiscard]] ox::BasicString<255> fullPath() const noexcept; + }; }