Merge branch 'master' of https://github.com/prusa3d/PrusaSlicer into et_selection_undoredo
This commit is contained in:
commit
e5b108b26e
6 changed files with 105 additions and 14 deletions
src/slic3r/GUI
|
@ -1741,7 +1741,7 @@ void ObjectList::del_subobject_item(wxDataViewItem& item)
|
|||
ItemType type;
|
||||
|
||||
m_objects_model->GetItemInfo(item, type, obj_idx, idx);
|
||||
if (type & itUndef)
|
||||
if (type == itUndef)
|
||||
return;
|
||||
|
||||
if (type & itSettings)
|
||||
|
@ -2633,12 +2633,26 @@ bool ObjectList::is_selected(const ItemType type) const
|
|||
return false;
|
||||
}
|
||||
|
||||
int ObjectList::get_selected_layers_range_idx() const
|
||||
{
|
||||
const wxDataViewItem& item = GetSelection();
|
||||
if (!item)
|
||||
return -1;
|
||||
|
||||
const ItemType type = m_objects_model->GetItemType(item);
|
||||
if (type & itSettings && m_objects_model->GetItemType(m_objects_model->GetParent(item)) != itLayer)
|
||||
return -1;
|
||||
|
||||
return m_objects_model->GetLayerIdByItem(type & itLayer ? item : m_objects_model->GetParent(item));
|
||||
}
|
||||
|
||||
void ObjectList::update_selections()
|
||||
{
|
||||
const Selection& selection = wxGetApp().plater()->canvas3D()->get_selection();
|
||||
wxDataViewItemArray sels;
|
||||
|
||||
m_selection_mode = smInstance;
|
||||
if ( ( m_selection_mode & (smSettings|smLayer|smLayerRoot) ) == 0)
|
||||
m_selection_mode = smInstance;
|
||||
|
||||
// We doesn't update selection if SettingsItem for the current object/part is selected
|
||||
// if (GetSelectedItemsCount() == 1 && m_objects_model->GetItemType(GetSelection()) == itSettings )
|
||||
|
@ -2664,6 +2678,23 @@ void ObjectList::update_selections()
|
|||
else if (selection.is_single_full_object() || selection.is_multiple_full_object())
|
||||
{
|
||||
const Selection::ObjectIdxsToInstanceIdxsMap& objects_content = selection.get_content();
|
||||
if (m_selection_mode & (smSettings | smLayer | smLayerRoot))
|
||||
{
|
||||
auto obj_idx = objects_content.begin()->first;
|
||||
wxDataViewItem obj_item = m_objects_model->GetItemById(obj_idx);
|
||||
if (m_selection_mode & smSettings)
|
||||
{
|
||||
if (m_selected_layers_range_idx < 0)
|
||||
sels.Add(m_objects_model->GetSettingsItem(obj_item));
|
||||
else
|
||||
sels.Add(m_objects_model->GetSettingsItem(m_objects_model->GetItemByLayerId(obj_idx, m_selected_layers_range_idx)));
|
||||
}
|
||||
else if (m_selection_mode & smLayerRoot)
|
||||
sels.Add(m_objects_model->GetLayerRootItem(obj_item));
|
||||
else if (m_selection_mode & smLayer)
|
||||
sels.Add(m_objects_model->GetItemByLayerId(obj_idx, m_selected_layers_range_idx));
|
||||
}
|
||||
else {
|
||||
for (const auto& object : objects_content) {
|
||||
if (object.second.size() == 1) // object with 1 instance
|
||||
sels.Add(m_objects_model->GetItemById(object.first));
|
||||
|
@ -2688,10 +2719,23 @@ void ObjectList::update_selections()
|
|||
for (const auto& inst : instances)
|
||||
sels.Add(m_objects_model->GetItemByInstanceId(object.first, inst));
|
||||
}
|
||||
}
|
||||
} }
|
||||
}
|
||||
else if (selection.is_any_volume() || selection.is_any_modifier())
|
||||
{
|
||||
if (m_selection_mode & smSettings)
|
||||
{
|
||||
const auto idx = *selection.get_volume_idxs().begin();
|
||||
const auto gl_vol = selection.get_volume(idx);
|
||||
if (gl_vol->volume_idx() >= 0) {
|
||||
// Only add GLVolumes with non-negative volume_ids. GLVolumes with negative volume ids
|
||||
// are not associated with ModelVolumes, but they are temporarily generated by the backend
|
||||
// (for example, SLA supports or SLA pad).
|
||||
wxDataViewItem vol_item = m_objects_model->GetItemByVolumeId(gl_vol->object_idx(), gl_vol->volume_idx());
|
||||
sels.Add(m_objects_model->GetSettingsItem(vol_item));
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (auto idx : selection.get_volume_idxs()) {
|
||||
const auto gl_vol = selection.get_volume(idx);
|
||||
if (gl_vol->volume_idx() >= 0)
|
||||
|
@ -2700,7 +2744,7 @@ void ObjectList::update_selections()
|
|||
// (for example, SLA supports or SLA pad).
|
||||
sels.Add(m_objects_model->GetItemByVolumeId(gl_vol->object_idx(), gl_vol->volume_idx()));
|
||||
}
|
||||
m_selection_mode = smVolume;
|
||||
m_selection_mode = smVolume; }
|
||||
}
|
||||
else if (selection.is_single_full_instance() || selection.is_multiple_full_instance())
|
||||
{
|
||||
|
@ -2744,7 +2788,7 @@ void ObjectList::update_selections()
|
|||
}
|
||||
}
|
||||
|
||||
if (sels.size() == 0)
|
||||
if (sels.size() == 0 || m_selection_mode & smSettings)
|
||||
m_selection_mode = smUndef;
|
||||
|
||||
select_items(sels);
|
||||
|
@ -3177,7 +3221,7 @@ void ObjectList::change_part_type()
|
|||
void ObjectList::last_volume_is_deleted(const int obj_idx)
|
||||
{
|
||||
|
||||
if (obj_idx < 0 || obj_idx >= m_objects->size() || (*m_objects)[obj_idx]->volumes.empty())
|
||||
if (obj_idx < 0 || obj_idx >= m_objects->size() || (*m_objects)[obj_idx]->volumes.size() != 1)
|
||||
return;
|
||||
|
||||
auto volume = (*m_objects)[obj_idx]->volumes.front();
|
||||
|
@ -3618,13 +3662,12 @@ void ObjectList::set_extruder_for_selected_items(const int extruder) const
|
|||
|
||||
void ObjectList::update_after_undo_redo()
|
||||
{
|
||||
m_prevent_list_events = true;
|
||||
m_prevent_canvas_selection_update = true;
|
||||
|
||||
Plater::SuppressSnapshots suppress(wxGetApp().plater());
|
||||
|
||||
// Unselect all objects before deleting them, so that no change of selection is emitted during deletion.
|
||||
this->UnselectAll();
|
||||
unselect_objects();//this->UnselectAll();
|
||||
m_objects_model->DeleteAll();
|
||||
|
||||
size_t obj_idx = 0;
|
||||
|
@ -3634,13 +3677,12 @@ void ObjectList::update_after_undo_redo()
|
|||
}
|
||||
|
||||
#ifndef __WXOSX__
|
||||
selection_changed();
|
||||
// selection_changed();
|
||||
#endif /* __WXOSX__ */
|
||||
|
||||
update_selections();
|
||||
|
||||
m_prevent_canvas_selection_update = false;
|
||||
m_prevent_list_events = false;
|
||||
}
|
||||
|
||||
ModelObject* ObjectList::object(const int obj_idx) const
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue