| 
									
										
										
										
											2019-03-01 13:54:28 +01:00
										 |  |  | #pragma once
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-02 02:05:49 +01:00
										 |  |  | #include <AK/HashMap.h>
 | 
					
						
							| 
									
										
										
										
											2019-07-22 20:08:25 +02:00
										 |  |  | #include <LibCore/CNotifier.h>
 | 
					
						
							| 
									
										
										
										
											2019-05-28 11:53:16 +02:00
										 |  |  | #include <LibGUI/GModel.h>
 | 
					
						
							| 
									
										
										
										
											2019-03-01 13:54:28 +01:00
										 |  |  | #include <sys/stat.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-09 01:24:37 +02:00
										 |  |  | class GDirectoryModel final : public GModel { | 
					
						
							| 
									
										
										
										
											2019-03-24 02:59:09 +01:00
										 |  |  |     friend int thumbnail_thread(void*); | 
					
						
							| 
									
										
										
										
											2019-05-28 11:53:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-01 13:54:28 +01:00
										 |  |  | public: | 
					
						
							| 
									
										
										
										
											2019-06-21 18:37:47 +02:00
										 |  |  |     static NonnullRefPtr<GDirectoryModel> create() { return adopt(*new GDirectoryModel); } | 
					
						
							| 
									
										
										
										
											2019-05-09 01:24:37 +02:00
										 |  |  |     virtual ~GDirectoryModel() override; | 
					
						
							| 
									
										
										
										
											2019-03-01 13:54:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-07 17:13:23 +02:00
										 |  |  |     enum Column { | 
					
						
							| 
									
										
										
										
											2019-03-01 13:54:28 +01:00
										 |  |  |         Icon = 0, | 
					
						
							|  |  |  |         Name, | 
					
						
							|  |  |  |         Size, | 
					
						
							| 
									
										
										
										
											2019-03-02 02:05:49 +01:00
										 |  |  |         Owner, | 
					
						
							|  |  |  |         Group, | 
					
						
							| 
									
										
										
										
											2019-03-01 13:54:28 +01:00
										 |  |  |         Permissions, | 
					
						
							|  |  |  |         Inode, | 
					
						
							|  |  |  |         __Count, | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-29 03:27:03 +01:00
										 |  |  |     virtual int row_count(const GModelIndex& = GModelIndex()) const override; | 
					
						
							|  |  |  |     virtual int column_count(const GModelIndex& = GModelIndex()) const override; | 
					
						
							| 
									
										
										
										
											2019-03-01 13:54:28 +01:00
										 |  |  |     virtual String column_name(int column) const override; | 
					
						
							|  |  |  |     virtual ColumnMetadata column_metadata(int column) const override; | 
					
						
							| 
									
										
										
										
											2019-03-09 14:24:34 +01:00
										 |  |  |     virtual GVariant data(const GModelIndex&, Role = Role::Display) const override; | 
					
						
							| 
									
										
										
										
											2019-03-01 13:54:28 +01:00
										 |  |  |     virtual void update() override; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     String path() const { return m_path; } | 
					
						
							| 
									
										
										
										
											2019-06-02 14:58:02 +02:00
										 |  |  |     void open(const StringView& path); | 
					
						
							| 
									
										
										
										
											2019-03-01 13:54:28 +01:00
										 |  |  |     size_t bytes_in_files() const { return m_bytes_in_files; } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-25 04:25:25 +01:00
										 |  |  |     Function<void(int done, int total)> on_thumbnail_progress; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-01 13:54:28 +01:00
										 |  |  |     struct Entry { | 
					
						
							|  |  |  |         String name; | 
					
						
							|  |  |  |         size_t size { 0 }; | 
					
						
							|  |  |  |         mode_t mode { 0 }; | 
					
						
							|  |  |  |         uid_t uid { 0 }; | 
					
						
							|  |  |  |         uid_t gid { 0 }; | 
					
						
							|  |  |  |         ino_t inode { 0 }; | 
					
						
							| 
									
										
										
										
											2019-06-21 18:37:47 +02:00
										 |  |  |         mutable RefPtr<GraphicsBitmap> thumbnail; | 
					
						
							| 
									
										
										
										
											2019-03-01 13:54:28 +01:00
										 |  |  |         bool is_directory() const { return S_ISDIR(mode); } | 
					
						
							| 
									
										
										
										
											2019-03-01 14:57:42 +01:00
										 |  |  |         bool is_executable() const { return mode & S_IXUSR; } | 
					
						
							| 
									
										
										
										
											2019-05-09 01:24:37 +02:00
										 |  |  |         String full_path(const GDirectoryModel& model) const { return String::format("%s/%s", model.path().characters(), name.characters()); } | 
					
						
							| 
									
										
										
										
											2019-03-01 13:54:28 +01:00
										 |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const Entry& entry(int index) const | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (index < m_directories.size()) | 
					
						
							|  |  |  |             return m_directories[index]; | 
					
						
							|  |  |  |         return m_files[index - m_directories.size()]; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-05-09 04:56:52 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  |     GDirectoryModel(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     String name_for_uid(uid_t) const; | 
					
						
							|  |  |  |     String name_for_gid(gid_t) const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-24 04:28:36 +01:00
										 |  |  |     GIcon icon_for(const Entry& entry) const; | 
					
						
							| 
									
										
										
										
											2019-03-01 13:54:28 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     String m_path; | 
					
						
							|  |  |  |     Vector<Entry> m_files; | 
					
						
							|  |  |  |     Vector<Entry> m_directories; | 
					
						
							|  |  |  |     size_t m_bytes_in_files; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-24 04:28:36 +01:00
										 |  |  |     GIcon m_directory_icon; | 
					
						
							|  |  |  |     GIcon m_file_icon; | 
					
						
							|  |  |  |     GIcon m_symlink_icon; | 
					
						
							|  |  |  |     GIcon m_socket_icon; | 
					
						
							|  |  |  |     GIcon m_executable_icon; | 
					
						
							|  |  |  |     GIcon m_filetype_image_icon; | 
					
						
							| 
									
										
										
										
											2019-03-02 02:05:49 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     HashMap<uid_t, String> m_user_names; | 
					
						
							|  |  |  |     HashMap<gid_t, String> m_group_names; | 
					
						
							| 
									
										
										
										
											2019-07-22 20:08:25 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     OwnPtr<CNotifier> m_notifier; | 
					
						
							| 
									
										
										
										
											2019-03-01 13:54:28 +01:00
										 |  |  | }; |