| 
									
										
										
										
											2019-08-10 10:29:46 +02:00
										 |  |  | #pragma once
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <AK/JsonArray.h>
 | 
					
						
							| 
									
										
										
										
											2019-08-10 15:06:29 +02:00
										 |  |  | #include <AK/JsonObject.h>
 | 
					
						
							| 
									
										
										
										
											2019-08-10 10:29:46 +02:00
										 |  |  | #include <LibGUI/GModel.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class GJsonArrayModel final : public GModel { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |     struct FieldSpec { | 
					
						
							| 
									
										
										
										
											2019-08-12 11:54:18 +02:00
										 |  |  |         FieldSpec(const String& a_column_name, TextAlignment a_text_alignment, Function<GVariant(const JsonObject&)>&& a_massage_for_display, Function<GVariant(const JsonObject&)>&& a_massage_for_sort = {}) | 
					
						
							| 
									
										
										
										
											2019-08-10 15:06:29 +02:00
										 |  |  |             : column_name(a_column_name) | 
					
						
							|  |  |  |             , text_alignment(a_text_alignment) | 
					
						
							|  |  |  |             , massage_for_display(move(a_massage_for_display)) | 
					
						
							| 
									
										
										
										
											2019-08-12 11:54:18 +02:00
										 |  |  |             , massage_for_sort(move(a_massage_for_sort)) | 
					
						
							| 
									
										
										
										
											2019-08-10 15:06:29 +02:00
										 |  |  |         { | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         FieldSpec(const String& a_json_field_name, const String& a_column_name, TextAlignment a_text_alignment) | 
					
						
							| 
									
										
										
										
											2019-08-10 11:06:29 +02:00
										 |  |  |             : json_field_name(a_json_field_name) | 
					
						
							|  |  |  |             , column_name(a_column_name) | 
					
						
							|  |  |  |             , text_alignment(a_text_alignment) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-10 10:29:46 +02:00
										 |  |  |         String json_field_name; | 
					
						
							|  |  |  |         String column_name; | 
					
						
							|  |  |  |         TextAlignment text_alignment; | 
					
						
							| 
									
										
										
										
											2019-08-10 15:06:29 +02:00
										 |  |  |         Function<GVariant(const JsonObject&)> massage_for_display; | 
					
						
							| 
									
										
										
										
											2019-08-12 11:54:18 +02:00
										 |  |  |         Function<GVariant(const JsonObject&)> massage_for_sort; | 
					
						
							| 
									
										
										
										
											2019-08-10 10:29:46 +02:00
										 |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     static NonnullRefPtr<GJsonArrayModel> create(const String& json_path, Vector<FieldSpec>&& fields) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return adopt(*new GJsonArrayModel(json_path, move(fields))); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     virtual ~GJsonArrayModel() override {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     virtual int row_count(const GModelIndex& = GModelIndex()) const override { return m_array.size(); } | 
					
						
							|  |  |  |     virtual int column_count(const GModelIndex& = GModelIndex()) const override { return m_fields.size(); } | 
					
						
							|  |  |  |     virtual String column_name(int column) const override { return m_fields[column].column_name; } | 
					
						
							|  |  |  |     virtual ColumnMetadata column_metadata(int) const override; | 
					
						
							|  |  |  |     virtual GVariant data(const GModelIndex&, Role = Role::Display) const override; | 
					
						
							|  |  |  |     virtual void update() override; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-10 11:06:29 +02:00
										 |  |  |     const String& json_path() const { return m_json_path; } | 
					
						
							|  |  |  |     void set_json_path(const String& json_path); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-10 10:29:46 +02:00
										 |  |  | private: | 
					
						
							|  |  |  |     GJsonArrayModel(const String& json_path, Vector<FieldSpec>&& fields) | 
					
						
							|  |  |  |         : m_json_path(json_path) | 
					
						
							|  |  |  |         , m_fields(move(fields)) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     String m_json_path; | 
					
						
							|  |  |  |     Vector<FieldSpec> m_fields; | 
					
						
							|  |  |  |     JsonArray m_array; | 
					
						
							|  |  |  | }; |