1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-19 18:17:40 +00:00
serenity/Applications/FileManager/DirectoryTableModel.h
Andreas Kling 46caa2663b LibGUI: Use a separate data role for the table model sorting order.
This allows data to be displayed nicely while sorting happens based on some
underlying raw data. :^)
2019-03-09 14:24:34 +01:00

71 lines
1.9 KiB
C++

#pragma once
#include <LibGUI/GTableModel.h>
#include <AK/HashMap.h>
#include <sys/stat.h>
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<Entry> m_files;
Vector<Entry> m_directories;
size_t m_bytes_in_files;
RetainPtr<GraphicsBitmap> m_directory_icon;
RetainPtr<GraphicsBitmap> m_file_icon;
RetainPtr<GraphicsBitmap> m_symlink_icon;
RetainPtr<GraphicsBitmap> m_socket_icon;
RetainPtr<GraphicsBitmap> m_executable_icon;
HashMap<uid_t, String> m_user_names;
HashMap<gid_t, String> m_group_names;
};