mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-11 08:47:52 -06:00
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:
parent
fb6c1a885c
commit
37a320c79e
5 changed files with 169 additions and 110 deletions
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue