GDirectoryModel.h 2.6 KB

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