mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-31 04:31:15 -06:00 
			
		
		
		
	Drag & Drop for sub-objects (parts of the object)
This commit is contained in:
		
							parent
							
								
									73ba96381e
								
							
						
					
					
						commit
						13388f1caa
					
				
					 3 changed files with 51 additions and 22 deletions
				
			
		|  | @ -306,6 +306,7 @@ wxBoxSizer* content_objects_list(wxWindow *win) | |||
| 
 | ||||
|     m_objects_ctrl->GetMainWindow()->Bind(wxEVT_MOTION, [](wxMouseEvent& event) { | ||||
|          set_tooltip_for_item(event.GetPosition()); | ||||
|          event.Skip(); | ||||
|     }); | ||||
| #else | ||||
|     m_objects_ctrl->Bind(wxEVT_DATAVIEW_ITEM_VALUE_CHANGED, [](wxDataViewEvent& event) | ||||
|  | @ -1536,17 +1537,15 @@ void on_begin_drag(wxDataViewEvent &event) | |||
|     wxDataViewItem item(event.GetItem()); | ||||
| 
 | ||||
|     // only allow drags for item, not containers
 | ||||
|     if (m_objects_model->GetParent(item) == wxDataViewItem(0)) | ||||
|     { | ||||
|     if (m_objects_model->GetParent(item) == wxDataViewItem(0)) { | ||||
|         event.Veto(); | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     PrusaObjectDataViewModelNode *node = (PrusaObjectDataViewModelNode*)item.GetID(); | ||||
|     wxTextDataObject *obj = new wxTextDataObject; | ||||
|     obj->SetText(node->m_name); | ||||
|     obj->SetText(wxString::Format("%d", m_objects_model->GetVolumeIdByItem(item))); | ||||
|     event.SetDataObject(obj); | ||||
|     event.SetDragFlags(wxDrag_AllowMove); // allows both copy and move;
 | ||||
|     event.SetDragFlags(/*wxDrag_AllowMove*/wxDrag_DefaultMove); // allows both copy and move;
 | ||||
| } | ||||
| 
 | ||||
| void on_drop_possible(wxDataViewEvent &event) | ||||
|  | @ -1554,10 +1553,8 @@ void on_drop_possible(wxDataViewEvent &event) | |||
|     wxDataViewItem item(event.GetItem()); | ||||
| 
 | ||||
|     // only allow drags for item or background, not containers
 | ||||
|     if (item.IsOk() && m_objects_model->GetParent(item) == wxDataViewItem(0)) | ||||
|         event.Veto(); | ||||
| 
 | ||||
|     if (event.GetDataFormat() != wxDF_UNICODETEXT) | ||||
|     if (item.IsOk() && m_objects_model->GetParent(item) == wxDataViewItem(0) || | ||||
|         event.GetDataFormat() != wxDF_UNICODETEXT) | ||||
|         event.Veto(); | ||||
| } | ||||
| 
 | ||||
|  | @ -1566,25 +1563,26 @@ void on_drop(wxDataViewEvent &event) | |||
|     wxDataViewItem item(event.GetItem()); | ||||
| 
 | ||||
|     // only allow drops for item, not containers
 | ||||
|     if (item.IsOk() && m_objects_model->GetParent(item) == wxDataViewItem(0)) | ||||
|     { | ||||
|     if (item.IsOk() && m_objects_model->GetParent(item) == wxDataViewItem(0) || | ||||
|         event.GetDataFormat() != wxDF_UNICODETEXT) { | ||||
|         event.Veto(); | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     if (event.GetDataFormat() != wxDF_UNICODETEXT) | ||||
|     { | ||||
|         event.Veto(); | ||||
|         return; | ||||
|     } | ||||
|     }     | ||||
| 
 | ||||
|     wxTextDataObject obj; | ||||
|     obj.SetData(wxDF_UNICODETEXT, event.GetDataSize(), event.GetDataBuffer()); | ||||
| 
 | ||||
|     if (item.IsOk()) | ||||
|         wxMessageBox(wxString::Format("Text dropped on item %s: %s", m_objects_model->GetName(item), obj.GetText())); | ||||
|     else | ||||
|         wxMessageBox(wxString::Format("Text dropped on background: %s", obj.GetText())); | ||||
|     int from_volume_id = std::stoi(obj.GetText().ToStdString()); | ||||
|     int to_volume_id = m_objects_model->GetVolumeIdByItem(item); | ||||
| 
 | ||||
|     m_objects_ctrl->Select(m_objects_model->ReorganizeChildren(from_volume_id, to_volume_id, | ||||
|                                                                m_objects_model->GetParent(item))); | ||||
| 
 | ||||
|     auto& volumes = (*m_objects)[m_selected_object_id]->volumes; | ||||
|     auto delta = to_volume_id < from_volume_id ? -1 : 1; | ||||
|     int cnt = 0; | ||||
|     for (int id = from_volume_id; cnt < abs(from_volume_id - to_volume_id); id+=delta, cnt++) | ||||
|         std::swap(volumes[id], volumes[id +delta]); | ||||
| } | ||||
| 
 | ||||
| } //namespace GUI
 | ||||
|  |  | |||
|  | @ -664,6 +664,32 @@ wxDataViewItem PrusaObjectDataViewModel::MoveChildDown(const wxDataViewItem &ite | |||
| 	return ret_item; | ||||
| } | ||||
| 
 | ||||
| wxDataViewItem PrusaObjectDataViewModel::ReorganizeChildren(int current_volume_id, int new_volume_id, const wxDataViewItem &parent) | ||||
| { | ||||
|     auto ret_item = wxDataViewItem(0); | ||||
|     if (current_volume_id == new_volume_id) | ||||
|         return ret_item; | ||||
|     wxASSERT(parent.IsOk()); | ||||
|     PrusaObjectDataViewModelNode *node_parent = (PrusaObjectDataViewModelNode*)parent.GetID(); | ||||
|     if (!node_parent)      // happens if item.IsOk()==false
 | ||||
|         return ret_item; | ||||
| 
 | ||||
|     PrusaObjectDataViewModelNode *deleted_node = node_parent->GetNthChild(current_volume_id); | ||||
|     node_parent->GetChildren().Remove(deleted_node); | ||||
|     ItemDeleted(parent, wxDataViewItem(deleted_node)); | ||||
|     node_parent->Insert(deleted_node, new_volume_id); | ||||
|     ItemAdded(parent, wxDataViewItem(deleted_node)); | ||||
| 
 | ||||
|     //update volume_id value for child-nodes
 | ||||
|     auto children = node_parent->GetChildren(); | ||||
|     int id_frst = current_volume_id < new_volume_id ? current_volume_id : new_volume_id; | ||||
|     int id_last = current_volume_id > new_volume_id ? current_volume_id : new_volume_id; | ||||
|     for (int id = id_frst; id <= id_last; ++id) | ||||
|         children[id]->SetVolumeId(id); | ||||
| 
 | ||||
|     return wxDataViewItem(node_parent->GetNthChild(new_volume_id)); | ||||
| } | ||||
| 
 | ||||
| // bool MyObjectTreeModel::IsEnabled(const wxDataViewItem &item, unsigned int col) const
 | ||||
| // {
 | ||||
| // 
 | ||||
|  |  | |||
|  | @ -381,6 +381,11 @@ public: | |||
| 
 | ||||
| 	wxDataViewItem MoveChildUp(const wxDataViewItem &item); | ||||
| 	wxDataViewItem MoveChildDown(const wxDataViewItem &item); | ||||
|     // For parent move child from cur_volume_id place to new_volume_id 
 | ||||
|     // Remaining items will moved up/down accordingly
 | ||||
|     wxDataViewItem ReorganizeChildren(int cur_volume_id,  | ||||
|                                       int new_volume_id, | ||||
|                                       const wxDataViewItem &parent); | ||||
| 
 | ||||
| // 	virtual bool IsEnabled(const wxDataViewItem &item,
 | ||||
| // 		unsigned int col) const override;
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 YuSanka
						YuSanka