Forráskód Böngészése

GFileSystemModel: Add a "DirectoriesOnly" mode.

Andreas Kling 6 éve
szülő
commit
6b72c62c5f

+ 1 - 1
Applications/FileManager/main.cpp

@@ -54,7 +54,7 @@ int main(int argc, char** argv)
     auto* splitter = new GWidget(widget);
     splitter->set_layout(make<GBoxLayout>(Orientation::Horizontal));
     auto* tree_view = new GTreeView(splitter);
-    tree_view->set_model(GFileSystemModel::create("/"));
+    tree_view->set_model(GFileSystemModel::create("/", GFileSystemModel::Mode::DirectoriesOnly));
     tree_view->set_size_policy(SizePolicy::Fixed, SizePolicy::Fill);
     tree_view->set_preferred_size({ 200, 0 });
     auto* directory_view = new DirectoryView(splitter);

+ 4 - 2
LibGUI/GFileSystemModel.cpp

@@ -51,7 +51,6 @@ struct GFileSystemModel::Node {
 
         auto full_path = this->full_path(model);
         DIR* dirp = opendir(full_path.characters());
-        dbgprintf("traverse if needed: %s (%p)\n", full_path.characters(), dirp);
         if (!dirp)
             return;
 
@@ -64,6 +63,8 @@ struct GFileSystemModel::Node {
                 perror("lstat");
                 continue;
             }
+            if (model.m_mode == DirectoriesOnly && !S_ISDIR(st.st_mode))
+                continue;
             auto* child = new Node;
             child->name = de->d_name;
             child->type = S_ISDIR(st.st_mode) ? Node::Type::Directory : Node::Type::File;
@@ -91,8 +92,9 @@ struct GFileSystemModel::Node {
     }
 };
 
-GFileSystemModel::GFileSystemModel(const String& root_path)
+GFileSystemModel::GFileSystemModel(const String& root_path, Mode mode)
     : m_root_path(FileSystemPath(root_path).string())
+    , m_mode(mode)
 {
     update();
 }

+ 6 - 3
LibGUI/GFileSystemModel.h

@@ -5,9 +5,11 @@
 class GFileSystemModel : public GModel {
     friend class Node;
 public:
-    static Retained<GFileSystemModel> create(const String& root_path = "/")
+    enum Mode { Invalid, DirectoriesOnly, FilesAndDirectories };
+
+    static Retained<GFileSystemModel> create(const String& root_path = "/", Mode mode = Mode::FilesAndDirectories)
     {
-        return adopt(*new GFileSystemModel(root_path));
+        return adopt(*new GFileSystemModel(root_path, mode));
     }
     virtual ~GFileSystemModel() override;
 
@@ -22,9 +24,10 @@ public:
     virtual void activate(const GModelIndex&) override;
 
 private:
-    explicit GFileSystemModel(const String& root_path);
+    GFileSystemModel(const String& root_path, Mode);
 
     String m_root_path;
+    Mode m_mode { Invalid };
 
     struct Node;
     Node* m_root { nullptr };