#pragma once #include #include #include class DirectoryTableModel final : public GTableModel { public: DirectoryTableModel(); virtual ~DirectoryTableModel() override; enum Column { Icon = 0, Name, Size, Owner, Group, Permissions, Inode, __Count, }; virtual int row_count() const override; virtual int column_count() const override; virtual String column_name(int column) const override; virtual ColumnMetadata column_metadata(int column) const override; virtual GVariant data(const GModelIndex&, Role = Role::Display) const override; virtual void update() override; virtual void activate(const GModelIndex&) override; String path() const { return m_path; } void open(const String& path); size_t bytes_in_files() const { return m_bytes_in_files; } private: String name_for_uid(uid_t) const; String name_for_gid(gid_t) const; struct Entry { String name; size_t size { 0 }; mode_t mode { 0 }; uid_t uid { 0 }; uid_t gid { 0 }; ino_t inode { 0 }; bool is_directory() const { return S_ISDIR(mode); } bool is_executable() const { return mode & S_IXUSR; } }; const Entry& entry(int index) const { if (index < m_directories.size()) return m_directories[index]; return m_files[index - m_directories.size()]; } const GraphicsBitmap& icon_for(const Entry& entry) const; String m_path; Vector m_files; Vector m_directories; size_t m_bytes_in_files; RetainPtr m_directory_icon; RetainPtr m_file_icon; RetainPtr m_symlink_icon; RetainPtr m_socket_icon; RetainPtr m_executable_icon; HashMap m_user_names; HashMap m_group_names; };