DirectoryModel.h 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #pragma once
  2. #include <LibGUI/GModel.h>
  3. #include <AK/HashMap.h>
  4. #include <sys/stat.h>
  5. class DirectoryModel final : public GModel {
  6. friend int thumbnail_thread(void*);
  7. public:
  8. static Retained<DirectoryModel> create() { return adopt(*new DirectoryModel); }
  9. virtual ~DirectoryModel() override;
  10. enum Column {
  11. Icon = 0,
  12. Name,
  13. Size,
  14. Owner,
  15. Group,
  16. Permissions,
  17. Inode,
  18. __Count,
  19. };
  20. virtual int row_count(const GModelIndex& = GModelIndex()) const override;
  21. virtual int column_count(const GModelIndex& = GModelIndex()) const override;
  22. virtual String column_name(int column) const override;
  23. virtual ColumnMetadata column_metadata(int column) const override;
  24. virtual GVariant data(const GModelIndex&, Role = Role::Display) const override;
  25. virtual void update() override;
  26. virtual void activate(const GModelIndex&) override;
  27. String path() const { return m_path; }
  28. void open(const String& path);
  29. size_t bytes_in_files() const { return m_bytes_in_files; }
  30. Function<void(int done, int total)> on_thumbnail_progress;
  31. private:
  32. DirectoryModel();
  33. String name_for_uid(uid_t) const;
  34. String name_for_gid(gid_t) const;
  35. struct Entry {
  36. String name;
  37. size_t size { 0 };
  38. mode_t mode { 0 };
  39. uid_t uid { 0 };
  40. uid_t gid { 0 };
  41. ino_t inode { 0 };
  42. mutable RetainPtr<GraphicsBitmap> thumbnail;
  43. bool is_directory() const { return S_ISDIR(mode); }
  44. bool is_executable() const { return mode & S_IXUSR; }
  45. String full_path(const DirectoryModel& model) const { return String::format("%s/%s", model.path().characters(), name.characters()); }
  46. };
  47. const Entry& entry(int index) const
  48. {
  49. if (index < m_directories.size())
  50. return m_directories[index];
  51. return m_files[index - m_directories.size()];
  52. }
  53. GIcon icon_for(const Entry& entry) const;
  54. String m_path;
  55. Vector<Entry> m_files;
  56. Vector<Entry> m_directories;
  57. size_t m_bytes_in_files;
  58. GIcon m_directory_icon;
  59. GIcon m_file_icon;
  60. GIcon m_symlink_icon;
  61. GIcon m_socket_icon;
  62. GIcon m_executable_icon;
  63. GIcon m_filetype_image_icon;
  64. HashMap<uid_t, String> m_user_names;
  65. HashMap<gid_t, String> m_group_names;
  66. };