mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-11 00:37:51 -06:00
Added correct deleting of the selected objects(parts, mix)
but only in "ObjectList->Scene" direction
This commit is contained in:
parent
0bc99f3f65
commit
b7980f6b9b
7 changed files with 88 additions and 42 deletions
|
@ -115,7 +115,7 @@ void ObjectList::set_tooltip_for_item(const wxPoint& pt)
|
||||||
HitTest(pt, item, col);
|
HitTest(pt, item, col);
|
||||||
if (!item) return;
|
if (!item) return;
|
||||||
|
|
||||||
if (col->GetTitle() == " ")
|
if (col->GetTitle() == " " && GetSelectedItemsCount()<2)
|
||||||
GetMainWindow()->SetToolTip(_(L("Right button click the icon to change the object settings")));
|
GetMainWindow()->SetToolTip(_(L("Right button click the icon to change the object settings")));
|
||||||
else if (col->GetTitle() == _("Name") &&
|
else if (col->GetTitle() == _("Name") &&
|
||||||
m_objects_model->GetIcon(item).GetRefData() == m_icon_manifold_warning.GetRefData()) {
|
m_objects_model->GetIcon(item).GetRefData() == m_icon_manifold_warning.GetRefData()) {
|
||||||
|
@ -161,6 +161,15 @@ wxPoint ObjectList::get_mouse_position_in_control() {
|
||||||
return wxPoint(pt.x - /*win->*/GetScreenPosition().x, pt.y - /*win->*/GetScreenPosition().y);
|
return wxPoint(pt.x - /*win->*/GetScreenPosition().x, pt.y - /*win->*/GetScreenPosition().y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ObjectList::get_selected_obj_idx() const
|
||||||
|
{
|
||||||
|
if (GetSelectedItemsCount() == 1) {
|
||||||
|
auto item = GetSelection();
|
||||||
|
return m_objects_model->GetIdByItem(item);
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
wxDataViewColumn* ObjectList::create_objects_list_extruder_column(int extruders_count)
|
wxDataViewColumn* ObjectList::create_objects_list_extruder_column(int extruders_count)
|
||||||
{
|
{
|
||||||
wxArrayString choices;
|
wxArrayString choices;
|
||||||
|
@ -296,6 +305,8 @@ void ObjectList::key_event(wxKeyEvent& event)
|
||||||
printf("WXK_BACK\n");
|
printf("WXK_BACK\n");
|
||||||
remove();
|
remove();
|
||||||
}
|
}
|
||||||
|
else if (wxGetKeyState(wxKeyCode('A')) && wxGetKeyState(WXK_CONTROL))
|
||||||
|
select_all();
|
||||||
else
|
else
|
||||||
event.Skip();
|
event.Skip();
|
||||||
}
|
}
|
||||||
|
@ -815,21 +826,22 @@ void ObjectList::load_lambda(const std::string& type_name)
|
||||||
|
|
||||||
// Delete subobject
|
// Delete subobject
|
||||||
|
|
||||||
void ObjectList::del_subobject()
|
void ObjectList::del_subobject_item(wxDataViewItem& item)
|
||||||
{
|
{
|
||||||
auto item = GetSelection(); // #ys_FIXME_to_multi_sel
|
|
||||||
if (!item) return;
|
if (!item) return;
|
||||||
|
|
||||||
const auto volume_id = m_objects_model->GetVolumeIdByItem(item);
|
int obj_idx, vol_idx;
|
||||||
if (volume_id == -1)
|
m_objects_model->GetObjectAndVolumeIdsByItem(item, obj_idx, vol_idx);
|
||||||
|
|
||||||
|
if (vol_idx == -1)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (volume_id == -2)
|
if (vol_idx == -2)
|
||||||
del_settings_from_config();
|
del_settings_from_config();
|
||||||
else if (!del_subobject_from_object(volume_id))
|
else if (!del_subobject_from_object(obj_idx, vol_idx))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
select_item(m_objects_model->Delete(item));
|
m_objects_model->Delete(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObjectList::del_settings_from_config()
|
void ObjectList::del_settings_from_config()
|
||||||
|
@ -847,14 +859,13 @@ void ObjectList::del_settings_from_config()
|
||||||
m_config->set_key_value("extruder", new ConfigOptionInt(extruder));
|
m_config->set_key_value("extruder", new ConfigOptionInt(extruder));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ObjectList::del_subobject_from_object(const int obj_idx, const int vol_idx)
|
||||||
bool ObjectList::del_subobject_from_object(const int volume_id)
|
|
||||||
{
|
{
|
||||||
const auto volume = (*m_objects)[m_selected_object_id]->volumes[volume_id];
|
const auto volume = (*m_objects)[obj_idx]->volumes[vol_idx];
|
||||||
|
|
||||||
// if user is deleting the last solid part, throw error
|
// if user is deleting the last solid part, throw error
|
||||||
int solid_cnt = 0;
|
int solid_cnt = 0;
|
||||||
for (auto vol : (*m_objects)[m_selected_object_id]->volumes)
|
for (auto vol : (*m_objects)[obj_idx]->volumes)
|
||||||
if (vol->is_model_part())
|
if (vol->is_model_part())
|
||||||
++solid_cnt;
|
++solid_cnt;
|
||||||
if (volume->is_model_part() && solid_cnt == 1) {
|
if (volume->is_model_part() && solid_cnt == 1) {
|
||||||
|
@ -862,10 +873,10 @@ bool ObjectList::del_subobject_from_object(const int volume_id)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
(*m_objects)[m_selected_object_id]->delete_volume(volume_id);
|
(*m_objects)[obj_idx]->delete_volume(vol_idx);
|
||||||
m_parts_changed = true;
|
m_parts_changed = true;
|
||||||
|
parts_changed(obj_idx);
|
||||||
|
|
||||||
parts_changed(m_selected_object_id);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1061,12 +1072,22 @@ void ObjectList::add_object_to_list(size_t obj_idx)
|
||||||
void ObjectList::delete_object_from_list()
|
void ObjectList::delete_object_from_list()
|
||||||
{
|
{
|
||||||
auto item = GetSelection();
|
auto item = GetSelection();
|
||||||
if (!item || m_objects_model->GetParent(item) != wxDataViewItem(0))
|
if (!item)
|
||||||
return;
|
return;
|
||||||
// Select(m_objects_model->Delete(item));
|
if (m_objects_model->GetParent(item) == wxDataViewItem(0))
|
||||||
m_objects_model->Delete(item);
|
select_item(m_objects_model->Delete(item));
|
||||||
|
else
|
||||||
|
select_item(m_objects_model->Delete(m_objects_model->GetParent(item)));
|
||||||
|
}
|
||||||
|
|
||||||
part_selection_changed();
|
void ObjectList::delete_object_from_list(const size_t obj_idx)
|
||||||
|
{
|
||||||
|
select_item(m_objects_model->Delete(m_objects_model->GetItemById(obj_idx)));
|
||||||
|
}
|
||||||
|
|
||||||
|
void ObjectList::delete_volume_from_list(const size_t obj_idx, const size_t vol_idx)
|
||||||
|
{
|
||||||
|
select_item(m_objects_model->Delete(m_objects_model->GetItemByVolumeId(obj_idx, vol_idx)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObjectList::delete_all_objects_from_list()
|
void ObjectList::delete_all_objects_from_list()
|
||||||
|
@ -1118,15 +1139,19 @@ void ObjectList::select_current_volume(int idx, int vol_idx)
|
||||||
|
|
||||||
void ObjectList::remove()
|
void ObjectList::remove()
|
||||||
{
|
{
|
||||||
auto item = GetSelection(); // #ys_FIXME_to_multi_sel
|
if (GetSelectedItemsCount() == 0)
|
||||||
if (!item)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (m_objects_model->GetParent(item) == wxDataViewItem(0)) {
|
wxDataViewItemArray sels;
|
||||||
wxGetApp().plater()->remove_selected(); // #ys_TESTME
|
GetSelections(sels);
|
||||||
}
|
|
||||||
|
for (auto& item : sels)
|
||||||
|
{
|
||||||
|
if (m_objects_model->GetParent(item) == wxDataViewItem(0))
|
||||||
|
wxGetApp().plater()->remove(m_objects_model->GetIdByItem(item));
|
||||||
else
|
else
|
||||||
del_subobject();
|
del_subobject_item(item);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObjectList::init_objects()
|
void ObjectList::init_objects()
|
||||||
|
@ -1183,7 +1208,7 @@ void ObjectList::update_selections_on_canvas()
|
||||||
if (sel_cnt == 1) {
|
if (sel_cnt == 1) {
|
||||||
wxDataViewItem item = GetSelection();
|
wxDataViewItem item = GetSelection();
|
||||||
if (m_objects_model->IsSettingsItem(item))
|
if (m_objects_model->IsSettingsItem(item))
|
||||||
selection.clear();
|
add_to_selection(m_objects_model->GetParent(item), selection, true);
|
||||||
else
|
else
|
||||||
add_to_selection(item, selection, true);
|
add_to_selection(item, selection, true);
|
||||||
|
|
||||||
|
@ -1225,10 +1250,15 @@ void ObjectList::select_items(const wxDataViewItemArray& sels)
|
||||||
m_prevent_list_events = false;
|
m_prevent_list_events = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ObjectList::select_all()
|
||||||
|
{
|
||||||
|
SelectAll();
|
||||||
|
selection_changed();
|
||||||
|
}
|
||||||
|
|
||||||
void ObjectList::fix_multiselection_conflicts()
|
void ObjectList::fix_multiselection_conflicts()
|
||||||
{
|
{
|
||||||
const int sel_cnt = GetSelectedItemsCount();
|
if (GetSelectedItemsCount() <= 1)
|
||||||
if (sel_cnt <= 1)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
m_prevent_list_events = true;
|
m_prevent_list_events = true;
|
||||||
|
@ -1239,7 +1269,7 @@ void ObjectList::fix_multiselection_conflicts()
|
||||||
for (auto item : sels) {
|
for (auto item : sels) {
|
||||||
if (m_objects_model->IsSettingsItem(item))
|
if (m_objects_model->IsSettingsItem(item))
|
||||||
Unselect(item);
|
Unselect(item);
|
||||||
if (m_objects_model->GetParent(item) != wxDataViewItem(0))
|
else if (m_objects_model->GetParent(item) != wxDataViewItem(0))
|
||||||
Unselect(m_objects_model->GetParent(item));
|
Unselect(m_objects_model->GetParent(item));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -85,16 +85,16 @@ public:
|
||||||
void load_part(ModelObject* model_object, wxArrayString& part_names, const bool is_modifier);
|
void load_part(ModelObject* model_object, wxArrayString& part_names, const bool is_modifier);
|
||||||
void load_lambda(ModelObject* model_object, wxArrayString& part_names, const bool is_modifier);
|
void load_lambda(ModelObject* model_object, wxArrayString& part_names, const bool is_modifier);
|
||||||
void load_lambda(const std::string& type_name);
|
void load_lambda(const std::string& type_name);
|
||||||
void del_subobject();
|
void del_subobject_item(wxDataViewItem& item);
|
||||||
void del_settings_from_config();
|
void del_settings_from_config();
|
||||||
bool del_subobject_from_object(const int volume_id);
|
bool del_subobject_from_object(const int obj_idx, const int vol_idx);
|
||||||
void split(const bool split_part);
|
void split(const bool split_part);
|
||||||
bool get_volume_by_item(const bool split_part, const wxDataViewItem& item, ModelVolume*& volume);
|
bool get_volume_by_item(const bool split_part, const wxDataViewItem& item, ModelVolume*& volume);
|
||||||
bool is_splittable_object(const bool split_part);
|
bool is_splittable_object(const bool split_part);
|
||||||
|
|
||||||
wxPoint get_mouse_position_in_control();
|
wxPoint get_mouse_position_in_control();
|
||||||
wxBoxSizer* get_sizer(){return m_sizer;}
|
wxBoxSizer* get_sizer(){return m_sizer;}
|
||||||
int get_sel_obj_id() const { return m_selected_object_id; }
|
int get_selected_obj_idx() const;
|
||||||
bool is_parts_changed() const { return m_parts_changed; }
|
bool is_parts_changed() const { return m_parts_changed; }
|
||||||
bool is_part_settings_changed() const{ return m_part_settings_changed; }
|
bool is_part_settings_changed() const{ return m_part_settings_changed; }
|
||||||
|
|
||||||
|
@ -107,6 +107,8 @@ public:
|
||||||
void add_object_to_list(size_t obj_idx);
|
void add_object_to_list(size_t obj_idx);
|
||||||
// Delete object from the list
|
// Delete object from the list
|
||||||
void delete_object_from_list();
|
void delete_object_from_list();
|
||||||
|
void delete_object_from_list(const size_t obj_idx);
|
||||||
|
void delete_volume_from_list(const size_t obj_idx, const size_t vol_idx);
|
||||||
// Delete all objects from the list
|
// Delete all objects from the list
|
||||||
void delete_all_objects_from_list();
|
void delete_all_objects_from_list();
|
||||||
// Set count of object on c++ side
|
// Set count of object on c++ side
|
||||||
|
@ -129,6 +131,7 @@ public:
|
||||||
void update_selections_on_canvas();
|
void update_selections_on_canvas();
|
||||||
void select_item(const wxDataViewItem& item);
|
void select_item(const wxDataViewItem& item);
|
||||||
void select_items(const wxDataViewItemArray& sels);
|
void select_items(const wxDataViewItemArray& sels);
|
||||||
|
void select_all();
|
||||||
// correct current selections to avoid of the possible conflicts
|
// correct current selections to avoid of the possible conflicts
|
||||||
void fix_multiselection_conflicts();
|
void fix_multiselection_conflicts();
|
||||||
};
|
};
|
||||||
|
|
|
@ -148,7 +148,7 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent):
|
||||||
|
|
||||||
int ObjectManipulation::ol_selection()
|
int ObjectManipulation::ol_selection()
|
||||||
{
|
{
|
||||||
return wxGetApp().sidebar().get_ol_selection();
|
return wxGetApp().obj_list()->get_selected_obj_idx();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObjectManipulation::update_settings_list()
|
void ObjectManipulation::update_settings_list()
|
||||||
|
|
|
@ -614,11 +614,6 @@ void Sidebar::update_objects_list_extruder_column(int extruders_count)
|
||||||
p->object_list->update_objects_list_extruder_column(extruders_count);
|
p->object_list->update_objects_list_extruder_column(extruders_count);
|
||||||
}
|
}
|
||||||
|
|
||||||
int Sidebar::get_ol_selection()
|
|
||||||
{
|
|
||||||
return p->object_list->get_sel_obj_id();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Sidebar::show_info_sizers(const bool show)
|
void Sidebar::show_info_sizers(const bool show)
|
||||||
{
|
{
|
||||||
p->object_info->Show(show);
|
p->object_info->Show(show);
|
||||||
|
@ -1356,7 +1351,7 @@ void Plater::priv::remove(size_t obj_idx)
|
||||||
model.delete_object(obj_idx);
|
model.delete_object(obj_idx);
|
||||||
print.delete_object(obj_idx);
|
print.delete_object(obj_idx);
|
||||||
// Delete object from Sidebar list
|
// Delete object from Sidebar list
|
||||||
sidebar->obj_list()->delete_object_from_list();
|
sidebar->obj_list()->delete_object_from_list(obj_idx);
|
||||||
|
|
||||||
object_list_changed();
|
object_list_changed();
|
||||||
|
|
||||||
|
@ -1931,7 +1926,7 @@ void Plater::changed_object_settings(int obj_idx)
|
||||||
|
|
||||||
if (list->is_parts_changed()) {
|
if (list->is_parts_changed()) {
|
||||||
// recenter and re - align to Z = 0
|
// recenter and re - align to Z = 0
|
||||||
auto model_object = p->model.objects[list->get_sel_obj_id()];
|
auto model_object = p->model.objects[obj_idx];
|
||||||
model_object->center_around_origin();
|
model_object->center_around_origin();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -69,7 +69,6 @@ public:
|
||||||
ConfigOptionsGroup* og_freq_chng_params();
|
ConfigOptionsGroup* og_freq_chng_params();
|
||||||
wxButton* get_wiping_dialog_button();
|
wxButton* get_wiping_dialog_button();
|
||||||
void update_objects_list_extruder_column(int extruders_count);
|
void update_objects_list_extruder_column(int extruders_count);
|
||||||
int get_ol_selection();
|
|
||||||
void show_info_sizers(const bool show);
|
void show_info_sizers(const bool show);
|
||||||
void show_buttons(const bool show);
|
void show_buttons(const bool show);
|
||||||
void enable_buttons(bool enable);
|
void enable_buttons(bool enable);
|
||||||
|
|
|
@ -591,7 +591,8 @@ wxDataViewItem PrusaObjectDataViewModel::GetItemByVolumeId(int obj_idx, int volu
|
||||||
}
|
}
|
||||||
|
|
||||||
auto parent = m_objects[obj_idx];
|
auto parent = m_objects[obj_idx];
|
||||||
if (parent->GetChildCount() == 0) {
|
if (parent->GetChildCount() == 0 ||
|
||||||
|
(parent->GetChildCount() == 1 && parent->GetNthChild(0)->m_volume_id == -2)) {
|
||||||
if (volume_idx == 0)
|
if (volume_idx == 0)
|
||||||
return GetItemById(obj_idx);
|
return GetItemById(obj_idx);
|
||||||
|
|
||||||
|
@ -628,6 +629,23 @@ int PrusaObjectDataViewModel::GetVolumeIdByItem(const wxDataViewItem& item)
|
||||||
return node->GetVolumeId();
|
return node->GetVolumeId();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PrusaObjectDataViewModel::GetObjectAndVolumeIdsByItem(const wxDataViewItem& item, int& obj_idx, int& vol_idx)
|
||||||
|
{
|
||||||
|
wxASSERT(item.IsOk());
|
||||||
|
obj_idx = vol_idx = -1;
|
||||||
|
|
||||||
|
PrusaObjectDataViewModelNode *node = (PrusaObjectDataViewModelNode*)item.GetID();
|
||||||
|
if (!node) return;
|
||||||
|
vol_idx = node->GetVolumeId();
|
||||||
|
|
||||||
|
PrusaObjectDataViewModelNode *parent_node = node->GetParent();
|
||||||
|
if (!parent_node) return;
|
||||||
|
|
||||||
|
auto it = find(m_objects.begin(), m_objects.end(), parent_node);
|
||||||
|
if (it != m_objects.end())
|
||||||
|
obj_idx = it - m_objects.begin();
|
||||||
|
}
|
||||||
|
|
||||||
wxString PrusaObjectDataViewModel::GetName(const wxDataViewItem &item) const
|
wxString PrusaObjectDataViewModel::GetName(const wxDataViewItem &item) const
|
||||||
{
|
{
|
||||||
PrusaObjectDataViewModelNode *node = (PrusaObjectDataViewModelNode*)item.GetID();
|
PrusaObjectDataViewModelNode *node = (PrusaObjectDataViewModelNode*)item.GetID();
|
||||||
|
|
|
@ -422,6 +422,7 @@ public:
|
||||||
wxDataViewItem GetItemByVolumeId(int obj_idx, int volume_idx);
|
wxDataViewItem GetItemByVolumeId(int obj_idx, int volume_idx);
|
||||||
int GetIdByItem(wxDataViewItem& item);
|
int GetIdByItem(wxDataViewItem& item);
|
||||||
int GetVolumeIdByItem(const wxDataViewItem& item);
|
int GetVolumeIdByItem(const wxDataViewItem& item);
|
||||||
|
void GetObjectAndVolumeIdsByItem(const wxDataViewItem& item, int& obj_idx, int& vol_idx);
|
||||||
bool IsEmpty() { return m_objects.empty(); }
|
bool IsEmpty() { return m_objects.empty(); }
|
||||||
|
|
||||||
// helper method for wxLog
|
// helper method for wxLog
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue