GDirectoryModel.h 2.5 KB

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