mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-31 12:41:20 -06:00 
			
		
		
		
	Instance selection in object list according to the canvas selection
This commit is contained in:
		
							parent
							
								
									0810beae77
								
							
						
					
					
						commit
						95af5c7cc6
					
				
					 3 changed files with 51 additions and 10 deletions
				
			
		|  | @ -1198,11 +1198,18 @@ void ObjectList::update_selections() | ||||||
|     auto& selection = _3DScene::get_canvas(wxGetApp().canvas3D())->get_selection(); |     auto& selection = _3DScene::get_canvas(wxGetApp().canvas3D())->get_selection(); | ||||||
|     wxDataViewItemArray sels; |     wxDataViewItemArray sels; | ||||||
| 
 | 
 | ||||||
|     for (auto idx: selection.get_volume_idxs()) |     if (selection.is_single_full_object()) { | ||||||
|     { |         for (auto idx : selection.get_volume_idxs()) { | ||||||
|             const auto gl_vol = selection.get_volume(idx); |             const auto gl_vol = selection.get_volume(idx); | ||||||
|             sels.Add(m_objects_model->GetItemByVolumeId(gl_vol->object_idx(), gl_vol->volume_idx())); |             sels.Add(m_objects_model->GetItemByVolumeId(gl_vol->object_idx(), gl_vol->volume_idx())); | ||||||
|         } |         } | ||||||
|  |     } | ||||||
|  |     else if (selection.is_single_full_instance()) { | ||||||
|  |         for (auto idx : selection.get_instance_idxs()) {             | ||||||
|  |             sels.Add(m_objects_model->GetItemByInstanceId(selection.get_object_idx(), idx)); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |      | ||||||
|     select_items(sels); |     select_items(sels); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -727,7 +727,7 @@ wxDataViewItem PrusaObjectDataViewModel::GetItemById(int obj_idx) | ||||||
| 
 | 
 | ||||||
| wxDataViewItem PrusaObjectDataViewModel::GetItemByVolumeId(int obj_idx, int volume_idx) | wxDataViewItem PrusaObjectDataViewModel::GetItemByVolumeId(int obj_idx, int volume_idx) | ||||||
| { | { | ||||||
| 	if (obj_idx >= m_objects.size()) { | 	if (obj_idx >= m_objects.size() || obj_idx < 0) { | ||||||
| 		printf("Error! Out of objects range.\n"); | 		printf("Error! Out of objects range.\n"); | ||||||
| 		return wxDataViewItem(0); | 		return wxDataViewItem(0); | ||||||
| 	} | 	} | ||||||
|  | @ -749,6 +749,25 @@ wxDataViewItem PrusaObjectDataViewModel::GetItemByVolumeId(int obj_idx, int volu | ||||||
|     return wxDataViewItem(0); |     return wxDataViewItem(0); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | wxDataViewItem PrusaObjectDataViewModel::GetItemByInstanceId(int obj_idx, int inst_idx) | ||||||
|  | { | ||||||
|  |     if (obj_idx >= m_objects.size() || obj_idx < 0) { | ||||||
|  |         printf("Error! Out of objects range.\n"); | ||||||
|  |         return wxDataViewItem(0); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     auto instances_item = GetInstanceRootItem(wxDataViewItem(m_objects[obj_idx])); | ||||||
|  |     if (!instances_item) | ||||||
|  |         return wxDataViewItem(0); | ||||||
|  | 
 | ||||||
|  |     auto parent = (PrusaObjectDataViewModelNode*)instances_item.GetID();; | ||||||
|  |     for (size_t i = 0; i < parent->GetChildCount(); i++) | ||||||
|  |         if (parent->GetNthChild(i)->m_idx == inst_idx) | ||||||
|  |             return wxDataViewItem(parent->GetNthChild(i)); | ||||||
|  | 
 | ||||||
|  |     return wxDataViewItem(0); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| int PrusaObjectDataViewModel::GetIdByItem(const wxDataViewItem& item) | int PrusaObjectDataViewModel::GetIdByItem(const wxDataViewItem& item) | ||||||
| { | { | ||||||
| 	wxASSERT(item.IsOk()); | 	wxASSERT(item.IsOk()); | ||||||
|  | @ -1024,21 +1043,33 @@ ItemType PrusaObjectDataViewModel::GetItemType(const wxDataViewItem &item) const | ||||||
|     return node->m_type; |     return node->m_type; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| wxDataViewItem PrusaObjectDataViewModel::GetSettingsItem(const wxDataViewItem &item) const | wxDataViewItem PrusaObjectDataViewModel::GetItemByType(const wxDataViewItem &parent_item, ItemType type) const  | ||||||
| { | { | ||||||
|     if (!item.IsOk()) |     if (!parent_item.IsOk()) | ||||||
|         return wxDataViewItem(0); |         return wxDataViewItem(0); | ||||||
| 
 | 
 | ||||||
|     PrusaObjectDataViewModelNode *node = (PrusaObjectDataViewModelNode*)item.GetID(); |     PrusaObjectDataViewModelNode *node = (PrusaObjectDataViewModelNode*)parent_item.GetID(); | ||||||
|     if (node->GetChildCount() == 0) |     if (node->GetChildCount() == 0) | ||||||
|         return wxDataViewItem(0); |         return wxDataViewItem(0); | ||||||
| 
 | 
 | ||||||
|     if (node->GetNthChild(0)->m_type == itSettings) |     for (int i = 0; i < node->GetChildCount(); i++) { | ||||||
|         return wxDataViewItem((void*)node->GetNthChild(0)); |         if (node->GetNthChild(i)->m_type == type) | ||||||
|  |             return wxDataViewItem((void*)node->GetNthChild(i)); | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     return wxDataViewItem(0); |     return wxDataViewItem(0); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | wxDataViewItem PrusaObjectDataViewModel::GetSettingsItem(const wxDataViewItem &item) const | ||||||
|  | { | ||||||
|  |     return GetItemByType(item, itSettings); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | wxDataViewItem PrusaObjectDataViewModel::GetInstanceRootItem(const wxDataViewItem &item) const | ||||||
|  | { | ||||||
|  |     return GetItemByType(item, itInstanceRoot); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| bool PrusaObjectDataViewModel::IsSettingsItem(const wxDataViewItem &item) const | bool PrusaObjectDataViewModel::IsSettingsItem(const wxDataViewItem &item) const | ||||||
| { | { | ||||||
|     if (!item.IsOk()) |     if (!item.IsOk()) | ||||||
|  |  | ||||||
|  | @ -445,6 +445,7 @@ public: | ||||||
|     void DeleteChildren(wxDataViewItem& parent); |     void DeleteChildren(wxDataViewItem& parent); | ||||||
| 	wxDataViewItem GetItemById(int obj_idx); | 	wxDataViewItem GetItemById(int obj_idx); | ||||||
| 	wxDataViewItem GetItemByVolumeId(int obj_idx, int volume_idx); | 	wxDataViewItem GetItemByVolumeId(int obj_idx, int volume_idx); | ||||||
|  | 	wxDataViewItem GetItemByInstanceId(int obj_idx, int inst_idx); | ||||||
| 	int GetIdByItem(const wxDataViewItem& item); | 	int GetIdByItem(const wxDataViewItem& item); | ||||||
|     int GetIdByItemAndType(const wxDataViewItem& item, const ItemType type) const; |     int GetIdByItemAndType(const wxDataViewItem& item, const ItemType type) const; | ||||||
|     int GetVolumeIdByItem(const wxDataViewItem& item) const; |     int GetVolumeIdByItem(const wxDataViewItem& item) const; | ||||||
|  | @ -490,7 +491,9 @@ public: | ||||||
| 	virtual bool HasContainerColumns(const wxDataViewItem& WXUNUSED(item)) const override {	return true; } | 	virtual bool HasContainerColumns(const wxDataViewItem& WXUNUSED(item)) const override {	return true; } | ||||||
| 
 | 
 | ||||||
|     ItemType GetItemType(const wxDataViewItem &item) const ; |     ItemType GetItemType(const wxDataViewItem &item) const ; | ||||||
|  |     wxDataViewItem    GetItemByType(const wxDataViewItem &parent_item, ItemType type) const; | ||||||
|     wxDataViewItem    GetSettingsItem(const wxDataViewItem &item) const; |     wxDataViewItem    GetSettingsItem(const wxDataViewItem &item) const; | ||||||
|  |     wxDataViewItem    GetInstanceRootItem(const wxDataViewItem &item) const; | ||||||
|     bool    IsSettingsItem(const wxDataViewItem &item) const; |     bool    IsSettingsItem(const wxDataViewItem &item) const; | ||||||
|     void    UpdateSettingsDigest(const wxDataViewItem &item, const std::vector<std::string>& categories); |     void    UpdateSettingsDigest(const wxDataViewItem &item, const std::vector<std::string>& categories); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 YuSanka
						YuSanka