فهرست منبع

FileManager: Show user/group names instead of UID/GID if available.

Andreas Kling 6 سال پیش
والد
کامیت
0c8242dd71
2فایلهای تغییر یافته به همراه44 افزوده شده و 10 حذف شده
  1. 35 8
      Applications/FileManager/DirectoryTableModel.cpp
  2. 9 2
      Applications/FileManager/DirectoryTableModel.h

+ 35 - 8
Applications/FileManager/DirectoryTableModel.cpp

@@ -2,6 +2,8 @@
 #include <dirent.h>
 #include <stdio.h>
 #include <unistd.h>
+#include <grp.h>
+#include <pwd.h>
 #include <AK/FileSystemPath.h>
 #include <AK/StringBuilder.h>
 
@@ -12,6 +14,16 @@ DirectoryTableModel::DirectoryTableModel()
     m_symlink_icon = GraphicsBitmap::load_from_file(GraphicsBitmap::Format::RGBA32, "/res/icons/link16.rgb", { 16, 16 });
     m_socket_icon = GraphicsBitmap::load_from_file(GraphicsBitmap::Format::RGBA32, "/res/icons/socket16.rgb", { 16, 16 });
     m_executable_icon = GraphicsBitmap::load_from_file(GraphicsBitmap::Format::RGBA32, "/res/icons/executable16.rgb", { 16, 16 });
+
+    setpwent();
+    while (auto* passwd = getpwent())
+        m_user_names.set(passwd->pw_uid, passwd->pw_name);
+    endpwent();
+
+    setgrent();
+    while (auto* group = getgrent())
+        m_group_names.set(group->gr_gid, group->gr_name);
+    endgrent();
 }
 
 DirectoryTableModel::~DirectoryTableModel()
@@ -34,8 +46,8 @@ String DirectoryTableModel::column_name(int column) const
     case Column::Icon: return "";
     case Column::Name: return "Name";
     case Column::Size: return "Size";
-    case Column::UID: return "UID";
-    case Column::GID: return "GID";
+    case Column::Owner: return "Owner";
+    case Column::Group: return "Group";
     case Column::Permissions: return "Mode";
     case Column::Inode: return "Inode";
     }
@@ -48,9 +60,9 @@ GTableModel::ColumnMetadata DirectoryTableModel::column_metadata(int column) con
     case Column::Icon: return { 16, TextAlignment::Center };
     case Column::Name: return { 120, TextAlignment::CenterLeft };
     case Column::Size: return { 80, TextAlignment::CenterRight };
-    case Column::UID: return { 80, TextAlignment::CenterRight };
-    case Column::GID: return { 80, TextAlignment::CenterRight };
-    case Column::Permissions: return { 100, TextAlignment::CenterLeft };
+    case Column::Owner: return { 50, TextAlignment::CenterLeft };
+    case Column::Group: return { 50, TextAlignment::CenterLeft };
+    case Column::Permissions: return { 80, TextAlignment::CenterLeft };
     case Column::Inode: return { 80, TextAlignment::CenterRight };
     }
     ASSERT_NOT_REACHED();
@@ -69,7 +81,6 @@ const GraphicsBitmap& DirectoryTableModel::icon_for(const Entry& entry) const
     return *m_file_icon;
 }
 
-
 static String permission_string(mode_t mode)
 {
     StringBuilder builder;
@@ -108,6 +119,22 @@ static String permission_string(mode_t mode)
     return builder.to_string();
 }
 
+String DirectoryTableModel::name_for_uid(uid_t uid) const
+{
+    auto it = m_user_names.find(uid);
+    if (it == m_user_names.end())
+        return String::format("%u", uid);
+    return (*it).value;
+}
+
+String DirectoryTableModel::name_for_gid(uid_t gid) const
+{
+    auto it = m_user_names.find(gid);
+    if (it == m_user_names.end())
+        return String::format("%u", gid);
+    return (*it).value;
+}
+
 GVariant DirectoryTableModel::data(int row, int column) const
 {
     auto& entry = this->entry(row);
@@ -115,8 +142,8 @@ GVariant DirectoryTableModel::data(int row, int column) const
     case Column::Icon: return icon_for(entry);
     case Column::Name: return entry.name;
     case Column::Size: return (int)entry.size;
-    case Column::UID: return (int)entry.uid;
-    case Column::GID: return (int)entry.gid;
+    case Column::Owner: return name_for_uid(entry.uid);
+    case Column::Group: return name_for_gid(entry.gid);
     case Column::Permissions: return permission_string(entry.mode);
     case Column::Inode: return (int)entry.inode;
     }

+ 9 - 2
Applications/FileManager/DirectoryTableModel.h

@@ -1,6 +1,7 @@
 #pragma once
 
 #include <LibGUI/GTableModel.h>
+#include <AK/HashMap.h>
 #include <sys/stat.h>
 
 class DirectoryTableModel final : public GTableModel {
@@ -12,8 +13,8 @@ public:
         Icon = 0,
         Name,
         Size,
-        UID,
-        GID,
+        Owner,
+        Group,
         Permissions,
         Inode,
         __Count,
@@ -32,6 +33,9 @@ public:
     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 };
@@ -61,4 +65,7 @@ private:
     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;
 };