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…
Reference in a new issue