mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 01:22:43 +00:00 
			
		
		
		
	LibGUI: Let GModel specify the drag data type
GModel subclasses can now override drag_data_type() to specify which type GAbstractView should set for drag data. The default implementation returns a null string, which disables dragging from this widget.
This commit is contained in:
		
							parent
							
								
									d3ce7ae0e3
								
							
						
					
					
						commit
						dec95cb8b3
					
				
					 5 changed files with 14 additions and 2 deletions
				
			
		|  | @ -191,7 +191,7 @@ void GAbstractView::mousedown_event(GMouseEvent& event) | ||||||
|         m_selection.clear(); |         m_selection.clear(); | ||||||
|     } else if (event.modifiers() & Mod_Ctrl) { |     } else if (event.modifiers() & Mod_Ctrl) { | ||||||
|         m_selection.toggle(index); |         m_selection.toggle(index); | ||||||
|     } else if (event.button() == GMouseButton::Left) { |     } else if (event.button() == GMouseButton::Left && !m_model->drag_data_type().is_null()) { | ||||||
|         // We might be starting a drag, so don't throw away other selected items yet.
 |         // We might be starting a drag, so don't throw away other selected items yet.
 | ||||||
|         m_might_drag = true; |         m_might_drag = true; | ||||||
|         m_selection.add(index); |         m_selection.add(index); | ||||||
|  | @ -219,6 +219,9 @@ void GAbstractView::mousemove_event(GMouseEvent& event) | ||||||
|     if (distance_travelled_squared <= drag_distance_threshold) |     if (distance_travelled_squared <= drag_distance_threshold) | ||||||
|         return GScrollableWidget::mousemove_event(event); |         return GScrollableWidget::mousemove_event(event); | ||||||
| 
 | 
 | ||||||
|  |     auto data_type = m_model->drag_data_type(); | ||||||
|  |     ASSERT(!data_type.is_null()); | ||||||
|  | 
 | ||||||
|     dbg() << "Initiate drag!"; |     dbg() << "Initiate drag!"; | ||||||
|     auto drag_operation = GDragOperation::construct(); |     auto drag_operation = GDragOperation::construct(); | ||||||
| 
 | 
 | ||||||
|  | @ -248,7 +251,7 @@ void GAbstractView::mousemove_event(GMouseEvent& event) | ||||||
| 
 | 
 | ||||||
|     drag_operation->set_text(text_builder.to_string()); |     drag_operation->set_text(text_builder.to_string()); | ||||||
|     drag_operation->set_bitmap(bitmap); |     drag_operation->set_bitmap(bitmap); | ||||||
|     drag_operation->set_data("url-list", data_builder.to_string()); |     drag_operation->set_data(data_type, data_builder.to_string()); | ||||||
| 
 | 
 | ||||||
|     auto outcome = drag_operation->exec(); |     auto outcome = drag_operation->exec(); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -117,6 +117,7 @@ public: | ||||||
|     virtual void update() override; |     virtual void update() override; | ||||||
|     virtual GModelIndex parent_index(const GModelIndex&) const override; |     virtual GModelIndex parent_index(const GModelIndex&) const override; | ||||||
|     virtual GModelIndex index(int row, int column = 0, const GModelIndex& parent = GModelIndex()) const override; |     virtual GModelIndex index(int row, int column = 0, const GModelIndex& parent = GModelIndex()) const override; | ||||||
|  |     virtual StringView drag_data_type() const override { return "url-list"; } | ||||||
| 
 | 
 | ||||||
|     static String timestamp_string(time_t timestamp) |     static String timestamp_string(time_t timestamp) | ||||||
|     { |     { | ||||||
|  |  | ||||||
|  | @ -94,6 +94,8 @@ public: | ||||||
|     virtual GSortOrder sort_order() const { return GSortOrder::None; } |     virtual GSortOrder sort_order() const { return GSortOrder::None; } | ||||||
|     virtual void set_key_column_and_sort_order(int, GSortOrder) {} |     virtual void set_key_column_and_sort_order(int, GSortOrder) {} | ||||||
| 
 | 
 | ||||||
|  |     virtual StringView drag_data_type() const { return {}; } | ||||||
|  | 
 | ||||||
|     void register_view(Badge<GAbstractView>, GAbstractView&); |     void register_view(Badge<GAbstractView>, GAbstractView&); | ||||||
|     void unregister_view(Badge<GAbstractView>, GAbstractView&); |     void unregister_view(Badge<GAbstractView>, GAbstractView&); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -87,6 +87,11 @@ void GSortingProxyModel::update() | ||||||
|     target().update(); |     target().update(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | StringView GSortingProxyModel::drag_data_type() const | ||||||
|  | { | ||||||
|  |     return target().drag_data_type(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void GSortingProxyModel::set_key_column_and_sort_order(int column, GSortOrder sort_order) | void GSortingProxyModel::set_key_column_and_sort_order(int column, GSortOrder sort_order) | ||||||
| { | { | ||||||
|     if (column == m_key_column && sort_order == m_sort_order) |     if (column == m_key_column && sort_order == m_sort_order) | ||||||
|  |  | ||||||
|  | @ -40,6 +40,7 @@ public: | ||||||
|     virtual ColumnMetadata column_metadata(int) const override; |     virtual ColumnMetadata column_metadata(int) const override; | ||||||
|     virtual GVariant data(const GModelIndex&, Role = Role::Display) const override; |     virtual GVariant data(const GModelIndex&, Role = Role::Display) const override; | ||||||
|     virtual void update() override; |     virtual void update() override; | ||||||
|  |     virtual StringView drag_data_type() const override; | ||||||
| 
 | 
 | ||||||
|     virtual int key_column() const override { return m_key_column; } |     virtual int key_column() const override { return m_key_column; } | ||||||
|     virtual GSortOrder sort_order() const override { return m_sort_order; } |     virtual GSortOrder sort_order() const override { return m_sort_order; } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Sergey Bugaev
						Sergey Bugaev