Changed logic of the PrusaObjectDataViewModelNode:

now each node has:
          * name,
          * type,
          * id (-1, if type == itSettings OR itInstanceRoot),
          * bmp,
          * action_bmp
          * extruder
This commit is contained in:
YuSanka 2018-10-16 11:08:37 +02:00
parent fb6c1a885c
commit 37a320c79e
5 changed files with 169 additions and 110 deletions

View file

@ -362,12 +362,13 @@ void PrusaObjectDataViewModelNode::set_part_action_icon() {
Slic3r::GUI::BitmapCache *m_bitmap_cache = nullptr;
bool PrusaObjectDataViewModelNode::update_settings_digest(const std::vector<std::string>& categories)
{
if (m_type != "settings" || m_opt_categories == categories)
if (m_type != itSettings || m_opt_categories == categories)
return false;
m_opt_categories = categories;
m_name = wxEmptyString;
m_icon = m_empty_icon;
// m_icon = m_empty_icon;
m_bmp = m_empty_bmp;
std::map<std::string, wxBitmap>& categories_icon = Slic3r::GUI::wxGetApp().obj_list()->CATEGORY_ICON;//Slic3r::GUI::get_category_icon();
@ -440,7 +441,7 @@ wxDataViewItem PrusaObjectDataViewModel::AddChild( const wxDataViewItem &parent_
const wxString extruder_str = extruder == 0 ? "default" : wxString::Format("%d", extruder);
if (create_frst_child && (root->GetChildren().Count() == 0 ||
(root->GetChildren().Count() == 1 && root->GetNthChild(0)->m_type == "settings")))
(root->GetChildren().Count() == 1 && root->GetNthChild(0)->m_type == itSettings)))
{
const auto icon_solid_mesh = wxIcon(Slic3r::GUI::from_u8(Slic3r::var("object.png")), wxBITMAP_TYPE_PNG);
const auto node = new PrusaObjectDataViewModelNode(root, root->m_name, icon_solid_mesh, extruder_str, 0);
@ -450,7 +451,7 @@ wxDataViewItem PrusaObjectDataViewModel::AddChild( const wxDataViewItem &parent_
ItemAdded(parent_item, child);
}
const auto volume_id = root->GetChildCount() > 0 && root->GetNthChild(0)->m_type == "settings" ?
const auto volume_id = root->GetChildCount() > 0 && root->GetNthChild(0)->m_type == itSettings ?
root->GetChildCount() - 1 : root->GetChildCount();
const auto node = new PrusaObjectDataViewModelNode(root, name, icon, extruder_str, volume_id);
@ -489,20 +490,20 @@ wxDataViewItem PrusaObjectDataViewModel::Delete(const wxDataViewItem &item)
// thus removing the node from it doesn't result in freeing it
if (node_parent){
auto id = node_parent->GetChildren().Index(node);
auto v_id = node->GetVolumeId();
auto idx = node->GetIdx();
node_parent->GetChildren().Remove(node);
if (id > 0){
if(id == node_parent->GetChildCount()) id--;
ret_item = wxDataViewItem(node_parent->GetChildren().Item(id));
}
//update volume_id value for remaining child-nodes
//update idx value for remaining child-nodes
auto children = node_parent->GetChildren();
for (size_t i = 0; i < node_parent->GetChildCount() && v_id>=0; i++)
for (size_t i = 0; i < node_parent->GetChildCount() && idx>=0; i++)
{
auto volume_id = children[i]->GetVolumeId();
if (volume_id > v_id)
children[i]->SetVolumeId(volume_id-1);
auto cur_idx = children[i]->GetIdx();
if (cur_idx > idx)
children[i]->SetIdx(cur_idx-1);
}
}
else
@ -592,7 +593,7 @@ wxDataViewItem PrusaObjectDataViewModel::GetItemByVolumeId(int obj_idx, int volu
auto parent = m_objects[obj_idx];
if (parent->GetChildCount() == 0 ||
(parent->GetChildCount() == 1 && parent->GetNthChild(0)->m_volume_id == -2)) {
(parent->GetChildCount() == 1 && parent->GetNthChild(0)->GetType() & itSettings )) {
if (volume_idx == 0)
return GetItemById(obj_idx);
@ -601,13 +602,13 @@ wxDataViewItem PrusaObjectDataViewModel::GetItemByVolumeId(int obj_idx, int volu
}
for (size_t i = 0; i < parent->GetChildCount(); i++)
if (parent->GetNthChild(i)->m_volume_id == volume_idx)
if (parent->GetNthChild(i)->m_idx == volume_idx && parent->GetNthChild(0)->GetType() & itVolume)
return wxDataViewItem(parent->GetNthChild(i));
return wxDataViewItem(0);
}
int PrusaObjectDataViewModel::GetIdByItem(wxDataViewItem& item)
int PrusaObjectDataViewModel::GetIdByItem(const wxDataViewItem& item)
{
wxASSERT(item.IsOk());
@ -624,22 +625,27 @@ int PrusaObjectDataViewModel::GetVolumeIdByItem(const wxDataViewItem& item)
wxASSERT(item.IsOk());
PrusaObjectDataViewModelNode *node = (PrusaObjectDataViewModelNode*)item.GetID();
if (!node) // happens if item.IsOk()==false
if (!node || node->m_type != itVolume)
return -1;
return node->GetVolumeId();
return node->GetIdx();
}
void PrusaObjectDataViewModel::GetObjectAndVolumeIdsByItem(const wxDataViewItem& item, int& obj_idx, int& vol_idx)
void PrusaObjectDataViewModel::GetItemInfo(const wxDataViewItem& item, ItemType& type, int& obj_idx, int& idx)
{
wxASSERT(item.IsOk());
obj_idx = vol_idx = -1;
type = itUndef;
PrusaObjectDataViewModelNode *node = (PrusaObjectDataViewModelNode*)item.GetID();
if (!node) return;
vol_idx = node->GetVolumeId();
type = node->GetType();
idx = node->GetIdx();
PrusaObjectDataViewModelNode *parent_node = node->GetParent();
if (!parent_node) return;
if (type == itInstance)
parent_node = node->GetParent()->GetParent();
if (!parent_node) return;
auto it = find(m_objects.begin(), m_objects.end(), parent_node);
if (it != m_objects.end())
@ -664,11 +670,11 @@ wxString PrusaObjectDataViewModel::GetCopy(const wxDataViewItem &item) const
return node->m_copy;
}
wxIcon& PrusaObjectDataViewModel::GetIcon(const wxDataViewItem &item) const
{
PrusaObjectDataViewModelNode *node = (PrusaObjectDataViewModelNode*)item.GetID();
return node->m_icon;
}
// wxIcon& PrusaObjectDataViewModel::GetIcon(const wxDataViewItem &item) const
// {
// PrusaObjectDataViewModelNode *node = (PrusaObjectDataViewModelNode*)item.GetID();
// return node->m_icon;
// }
wxBitmap& PrusaObjectDataViewModel::GetBitmap(const wxDataViewItem &item) const
{
@ -715,7 +721,7 @@ bool PrusaObjectDataViewModel::SetValue(const wxVariant &variant, const int item
return m_objects[item_idx]->SetValue(variant, col);
}
/*
wxDataViewItem PrusaObjectDataViewModel::MoveChildUp(const wxDataViewItem &item)
{
auto ret_item = wxDataViewItem(0);
@ -763,7 +769,7 @@ wxDataViewItem PrusaObjectDataViewModel::MoveChildDown(const wxDataViewItem &ite
ret_item = wxDataViewItem(node_parent->GetNthChild(node_parent->GetChildCount()-1));
return ret_item;
}
*/
wxDataViewItem PrusaObjectDataViewModel::ReorganizeChildren(int current_volume_id, int new_volume_id, const wxDataViewItem &parent)
{
auto ret_item = wxDataViewItem(0);
@ -774,14 +780,14 @@ wxDataViewItem PrusaObjectDataViewModel::ReorganizeChildren(int current_volume_i
if (!node_parent) // happens if item.IsOk()==false
return ret_item;
const size_t shift = node_parent->GetChildren().Item(0)->m_type == "settings" ? 1 : 0;
const size_t shift = node_parent->GetChildren().Item(0)->m_type == itSettings ? 1 : 0;
PrusaObjectDataViewModelNode *deleted_node = node_parent->GetNthChild(current_volume_id+shift);
node_parent->GetChildren().Remove(deleted_node);
ItemDeleted(parent, wxDataViewItem(deleted_node));
node_parent->Insert(deleted_node, new_volume_id+shift);
ItemAdded(parent, wxDataViewItem(deleted_node));
const auto settings_item = HasSettings(wxDataViewItem(deleted_node));
const auto settings_item = GetSettingsItem(wxDataViewItem(deleted_node));
if (settings_item)
ItemAdded(wxDataViewItem(deleted_node), settings_item);
@ -790,7 +796,7 @@ wxDataViewItem PrusaObjectDataViewModel::ReorganizeChildren(int current_volume_i
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+shift]->SetVolumeId(id);
children[id+shift]->SetIdx(id);
return wxDataViewItem(node_parent->GetNthChild(new_volume_id+shift));
}
@ -854,7 +860,15 @@ unsigned int PrusaObjectDataViewModel::GetChildren(const wxDataViewItem &parent,
return count;
}
wxDataViewItem PrusaObjectDataViewModel::HasSettings(const wxDataViewItem &item) const
ItemType PrusaObjectDataViewModel::GetItemType(const wxDataViewItem &item) const
{
if (!item.IsOk())
return itUndef;
PrusaObjectDataViewModelNode *node = (PrusaObjectDataViewModelNode*)item.GetID();
return node->m_type;
}
wxDataViewItem PrusaObjectDataViewModel::GetSettingsItem(const wxDataViewItem &item) const
{
if (!item.IsOk())
return wxDataViewItem(0);
@ -863,9 +877,8 @@ wxDataViewItem PrusaObjectDataViewModel::HasSettings(const wxDataViewItem &item)
if (node->GetChildCount() == 0)
return wxDataViewItem(0);
auto& children = node->GetChildren();
if (children[0]->m_type == "settings")
return wxDataViewItem((void*)children[0]);;
if (node->GetNthChild(0)->m_type == itSettings)
return wxDataViewItem((void*)node->GetNthChild(0));
return wxDataViewItem(0);
}
@ -875,7 +888,7 @@ bool PrusaObjectDataViewModel::IsSettingsItem(const wxDataViewItem &item) const
if (!item.IsOk())
return false;
PrusaObjectDataViewModelNode *node = (PrusaObjectDataViewModelNode*)item.GetID();
return node->m_type == "settings";
return node->m_type == itSettings;
}