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
src/slic3r/GUI

View file

@ -58,7 +58,7 @@ ObjectList::ObjectList(wxWindow* parent) :
Bind(wxEVT_CHOICE, [this](wxCommandEvent& event) { update_extruder_in_config(event.GetString()); });
GetMainWindow()->Bind(wxEVT_MOTION, [this](wxMouseEvent& event) {
set_tooltip_for_item(event.GetPosition());
set_tooltip_for_item(/*event.GetPosition()*/get_mouse_position_in_control());
event.Skip();
});
#else
@ -118,7 +118,7 @@ void ObjectList::set_tooltip_for_item(const wxPoint& pt)
if (col->GetTitle() == " " && GetSelectedItemsCount()<2)
GetMainWindow()->SetToolTip(_(L("Right button click the icon to change the object settings")));
else if (col->GetTitle() == _("Name") &&
m_objects_model->GetIcon(item).GetRefData() == m_icon_manifold_warning.GetRefData()) {
m_objects_model->GetBitmap(item).GetRefData() == m_bmp_manifold_warning.GetRefData()) {
int obj_idx = m_objects_model->GetIdByItem(item);
auto& stats = (*m_objects)[obj_idx]->volumes[0]->mesh.stl.stats;
int errors = stats.degenerate_facets + stats.edges_fixed + stats.facets_removed +
@ -214,11 +214,11 @@ void ObjectList::update_extruder_in_config(const wxString& selection)
}
void ObjectList::init_icons(){
m_icon_modifiermesh = wxBitmap(Slic3r::GUI::from_u8(Slic3r::var("lambda.png")), wxBITMAP_TYPE_PNG);//(Slic3r::var("plugin.png")), wxBITMAP_TYPE_PNG);
m_icon_solidmesh = wxBitmap(Slic3r::GUI::from_u8(Slic3r::var("object.png")), wxBITMAP_TYPE_PNG);//(Slic3r::var("package.png")), wxBITMAP_TYPE_PNG);
m_bmp_modifiermesh = wxBitmap(Slic3r::GUI::from_u8(Slic3r::var("lambda.png")), wxBITMAP_TYPE_PNG);//(Slic3r::var("plugin.png")), wxBITMAP_TYPE_PNG);
m_bmp_solidmesh = wxBitmap(Slic3r::GUI::from_u8(Slic3r::var("object.png")), wxBITMAP_TYPE_PNG);//(Slic3r::var("package.png")), wxBITMAP_TYPE_PNG);
// init icon for manifold warning
m_icon_manifold_warning = wxBitmap(Slic3r::GUI::from_u8(Slic3r::var("exclamation_mark_.png")), wxBITMAP_TYPE_PNG);//(Slic3r::var("error.png")), wxBITMAP_TYPE_PNG);
m_bmp_manifold_warning = wxBitmap(Slic3r::GUI::from_u8(Slic3r::var("exclamation_mark_.png")), wxBITMAP_TYPE_PNG);//(Slic3r::var("error.png")), wxBITMAP_TYPE_PNG);
// init bitmap for "Split to sub-objects" context menu
m_bmp_split = wxBitmap(Slic3r::GUI::from_u8(Slic3r::var("split.png")), wxBITMAP_TYPE_PNG);
@ -268,7 +268,7 @@ void ObjectList::context_menu()
show_context_menu();
else if (title == _("Name") && pt.x >15 &&
m_objects_model->GetIcon(item).GetRefData() == m_icon_manifold_warning.GetRefData())
m_objects_model->GetBitmap(item).GetRefData() == m_bmp_manifold_warning.GetRefData())
{
if (is_windows10())
/*fix_through_netfabb()*/;// #ys_FIXME
@ -325,14 +325,20 @@ void ObjectList::item_value_change(wxDataViewEvent& event)
}
}
struct draging_item_data
{
int obj_idx;
int vol_idx;
};
void ObjectList::on_begin_drag(wxDataViewEvent &event)
{
wxDataViewItem item(event.GetItem());
// only allow drags for item, not containers
if (multiple_selection() ||
m_objects_model->GetParent(item) == wxDataViewItem(0) ||
m_objects_model->IsSettingsItem(item) ) {
m_objects_model->GetParent(item) == wxDataViewItem(0) ||
m_objects_model->GetItemType(item) != itVolume ) {
event.Veto();
return;
}
@ -356,7 +362,7 @@ void ObjectList::on_drop_possible(wxDataViewEvent &event)
// only allow drags for item or background, not containers
if (item.IsOk() && m_objects_model->GetParent(item) == wxDataViewItem(0) ||
event.GetDataFormat() != wxDF_UNICODETEXT || m_objects_model->IsSettingsItem(item))
event.GetDataFormat() != wxDF_UNICODETEXT || m_objects_model->GetItemType(item) != itVolume)
event.Veto();
}
@ -366,7 +372,7 @@ void ObjectList::on_drop(wxDataViewEvent &event)
// only allow drops for item, not containers
if (item.IsOk() && m_objects_model->GetParent(item) == wxDataViewItem(0) ||
event.GetDataFormat() != wxDF_UNICODETEXT || m_objects_model->IsSettingsItem(item)) {
event.GetDataFormat() != wxDF_UNICODETEXT || m_objects_model->GetItemType(item) != itVolume) {
event.Veto();
return;
}
@ -495,7 +501,7 @@ void ObjectList::get_settings_choice(wxMenu *menu, int id, bool is_part)
// Add settings item for object
const auto item = GetSelection();
if (item) {
const auto settings_item = m_objects_model->HasSettings(item);
const auto settings_item = m_objects_model->GetSettingsItem(item);
select_item(settings_item ? settings_item :
m_objects_model->AddSettingsChild(item));
#ifndef __WXOSX__
@ -547,7 +553,7 @@ wxMenu* ObjectList::create_add_part_popupmenu()
int i = 0;
for (auto& item : menu_items) {
auto menu_item = new wxMenuItem(menu, config_id_base + i, _(item));
menu_item->SetBitmap(i == 0 ? m_icon_solidmesh : m_icon_modifiermesh);
menu_item->SetBitmap(i == 0 ? m_bmp_solidmesh : m_bmp_modifiermesh);
if (item == "Add generic")
menu_item_add_generic(menu_item, config_id_base + i);
menu->Append(menu_item);
@ -667,7 +673,7 @@ void ObjectList::load_subobject(bool is_modifier /*= false*/, bool is_lambda/* =
for (int i = 0; i < part_names.size(); ++i) {
const wxDataViewItem sel_item = m_objects_model->AddChild(item, part_names.Item(i),
is_modifier ? m_icon_modifiermesh : m_icon_solidmesh);
is_modifier ? m_bmp_modifiermesh : m_bmp_solidmesh);
if (i == part_names.size() - 1)
select_item(sel_item);
@ -817,7 +823,7 @@ void ObjectList::load_lambda(const std::string& type_name)
parts_changed(m_selected_object_id);
select_item(m_objects_model->AddChild(GetSelection(),
name, m_icon_modifiermesh));
name, m_bmp_modifiermesh));
#ifndef __WXOSX__ //#ifdef __WXMSW__ // #ys_FIXME
selection_changed();
#endif //no __WXOSX__ //__WXMSW__
@ -830,15 +836,20 @@ void ObjectList::del_subobject_item(wxDataViewItem& item)
{
if (!item) return;
int obj_idx, vol_idx;
m_objects_model->GetObjectAndVolumeIdsByItem(item, obj_idx, vol_idx);
int obj_idx, idx;
ItemType type;
if (vol_idx == -1)
m_objects_model->GetItemInfo(item, type, obj_idx, idx);
if (type == itUndef)
return;
if (vol_idx == -2)
if (type == itSettings)
del_settings_from_config();
else if (!del_subobject_from_object(obj_idx, vol_idx))
else if (type == itInstanceRoot && obj_idx != -1)
del_instances_from_object(obj_idx);
else if (idx == -1)
return;
else if (!del_subobject_from_object(obj_idx, idx, type))
return;
m_objects_model->Delete(item);
@ -859,21 +870,43 @@ void ObjectList::del_settings_from_config()
m_config->set_key_value("extruder", new ConfigOptionInt(extruder));
}
bool ObjectList::del_subobject_from_object(const int obj_idx, const int vol_idx)
void ObjectList::del_instances_from_object(const int obj_idx)
{
const auto volume = (*m_objects)[obj_idx]->volumes[vol_idx];
auto instances = (*m_objects)[obj_idx]->instances;
if (instances.size() <= 1)
return;
// if user is deleting the last solid part, throw error
int solid_cnt = 0;
for (auto vol : (*m_objects)[obj_idx]->volumes)
if (vol->is_model_part())
++solid_cnt;
if (volume->is_model_part() && solid_cnt == 1) {
Slic3r::GUI::show_error(nullptr, _(L("You can't delete the last solid part from this object.")));
return false;
while ( instances.size()> 1)
instances.pop_back();
(*m_objects)[obj_idx]->invalidate_bounding_box(); // ? #ys_FIXME
m_parts_changed = true;
parts_changed(obj_idx);
}
bool ObjectList::del_subobject_from_object(const int obj_idx, const int idx, const int type)
{
if (type == itVolume) {
const auto volume = (*m_objects)[obj_idx]->volumes[idx];
// if user is deleting the last solid part, throw error
int solid_cnt = 0;
for (auto vol : (*m_objects)[obj_idx]->volumes)
if (vol->is_model_part())
++solid_cnt;
if (volume->is_model_part() && solid_cnt == 1) {
Slic3r::GUI::show_error(nullptr, _(L("You can't delete the last solid part from this object.")));
return false;
}
(*m_objects)[obj_idx]->delete_volume(idx);
}
else if (type == itInstance)
(*m_objects)[obj_idx]->delete_instance(idx);
else
return false;
(*m_objects)[obj_idx]->delete_volume(vol_idx);
m_parts_changed = true;
parts_changed(obj_idx);
@ -902,7 +935,7 @@ void ObjectList::split(const bool split_part)
for (auto id = 0; id < model_object->volumes.size(); id++)
m_objects_model->AddChild(parent, model_object->volumes[id]->name,
model_object->volumes[id]->is_modifier() ? m_icon_modifiermesh : m_icon_solidmesh,
model_object->volumes[id]->is_modifier() ? m_bmp_modifiermesh : m_bmp_solidmesh,
model_object->volumes[id]->config.has("extruder") ?
model_object->volumes[id]->config.option<ConfigOptionInt>("extruder")->value : 0,
false);
@ -912,7 +945,7 @@ void ObjectList::split(const bool split_part)
else {
for (auto id = 0; id < model_object->volumes.size(); id++)
m_objects_model->AddChild(item, model_object->volumes[id]->name,
m_icon_solidmesh,
m_bmp_solidmesh,
model_object->volumes[id]->config.has("extruder") ?
model_object->volumes[id]->config.option<ConfigOptionInt>("extruder")->value : 0,
false);
@ -1049,7 +1082,7 @@ void ObjectList::add_object_to_list(size_t obj_idx)
stats.facets_added + stats.facets_reversed + stats.backwards_edges;
if (errors > 0) {
wxVariant variant;
variant << PrusaDataViewBitmapText(item_name, m_icon_manifold_warning);
variant << PrusaDataViewBitmapText(item_name, m_bmp_manifold_warning);
m_objects_model->SetValue(variant, item, 0);
}
@ -1057,7 +1090,7 @@ void ObjectList::add_object_to_list(size_t obj_idx)
for (auto id = 0; id < model_object->volumes.size(); id++)
m_objects_model->AddChild(item,
model_object->volumes[id]->name,
m_icon_solidmesh,
m_bmp_solidmesh,
model_object->volumes[id]->config.option<ConfigOptionInt>("extruder")->value,
false);
Expand(item);