diff --git a/DevTools/HackStudio/Project.cpp b/DevTools/HackStudio/Project.cpp index b02ffd870d..dd9d213d59 100644 --- a/DevTools/HackStudio/Project.cpp +++ b/DevTools/HackStudio/Project.cpp @@ -1,12 +1,13 @@ #include "Project.h" #include +#include #include #include #include #include #include -struct Project::ProjectTreeNode { +struct Project::ProjectTreeNode : public RefCounted { enum class Type { Invalid, Project, @@ -20,7 +21,7 @@ struct Project::ProjectTreeNode { if (child->type == Type::Directory && child->name == name) return *child; } - auto new_child = make(); + auto new_child = adopt(*new ProjectTreeNode); new_child->type = Type::Directory; new_child->name = name; new_child->parent = this; @@ -29,9 +30,21 @@ struct Project::ProjectTreeNode { return *ptr; } + void sort() + { + if (type == Type::File) + return; + quick_sort(children.begin(), children.end(), [](auto& a, auto& b) { + return a->name < b->name; + }); + for (auto& child : children) + child->sort(); + } + Type type { Type::Invalid }; String name; - Vector> children; + String path; + Vector> children; ProjectTreeNode* parent { nullptr }; }; @@ -59,10 +72,10 @@ public: { auto* node = static_cast(index.internal_data()); if (role == Role::Display) { - return FileSystemPath(node->name).basename(); + return node->name; } if (role == Role::Custom) { - return node->name; + return node->path; } if (role == Role::Icon) { if (node->type == Project::ProjectTreeNode::Type::Project) @@ -196,7 +209,7 @@ ProjectFile* Project::get_file(const String& filename) void Project::rebuild_tree() { - auto root = make(); + auto root = adopt(*new ProjectTreeNode); root->type = ProjectTreeNode::Type::Project; for (auto& file : m_files) { @@ -220,8 +233,9 @@ void Project::rebuild_tree() current = ¤t->find_or_create_subdirectory(part); continue; } - auto file_node = make(); - file_node->name = file.name(); + auto file_node = adopt(*new ProjectTreeNode); + file_node->name = part; + file_node->path = path.string(); file_node->type = Project::ProjectTreeNode::Type::File; file_node->parent = current; current->children.append(move(file_node)); @@ -229,6 +243,9 @@ void Project::rebuild_tree() } } + root->sort(); + +#if 0 Function dump_tree = [&](ProjectTreeNode& node, int indent) { for (int i = 0; i < indent; ++i) printf(" "); @@ -241,9 +258,8 @@ void Project::rebuild_tree() } }; - printf("begin tree dump\n"); dump_tree(*root, 0); - printf("end tree dump\n"); +#endif m_root_node = move(root); m_model->update(); diff --git a/DevTools/HackStudio/Project.h b/DevTools/HackStudio/Project.h index 1bab7e2793..dcf95f7f62 100644 --- a/DevTools/HackStudio/Project.h +++ b/DevTools/HackStudio/Project.h @@ -40,7 +40,7 @@ private: String m_path; RefPtr m_model; NonnullRefPtrVector m_files; - OwnPtr m_root_node; + RefPtr m_root_node; GIcon m_directory_icon; GIcon m_file_icon;