ENH: Allow users to adjust the order of components in assemble

Change-Id: Ie4b979e4cfdf99d822801400cd6b54773f526d7a
(cherry picked from commit 2b8b32a2d2d8181d1ab0c490e1a7b4333dc34fad)
This commit is contained in:
zhimin.zeng 2023-08-01 16:05:55 +08:00 committed by lane.wei
parent 42a69e3e20
commit c330dbe27a

View file

@ -1466,6 +1466,20 @@ void ObjectList::key_event(wxKeyEvent& event)
void ObjectList::OnBeginDrag(wxDataViewEvent &event) void ObjectList::OnBeginDrag(wxDataViewEvent &event)
{ {
const bool mult_sel = multiple_selection();
if (mult_sel) {
event.Veto();
return;
}
const wxDataViewItem item(event.GetItem());
const ItemType& type = m_objects_model->GetItemType(item);
if (!(type & (itVolume | itObject))) {
event.Veto();
return;
}
if (type & itObject) {
int curr_obj_id = m_objects_model->GetIdByItem(event.GetItem()); int curr_obj_id = m_objects_model->GetIdByItem(event.GetItem());
PartPlateList& partplate_list = wxGetApp().plater()->get_partplate_list(); PartPlateList& partplate_list = wxGetApp().plater()->get_partplate_list();
int from_plate = partplate_list.find_instance(curr_obj_id, 0); int from_plate = partplate_list.find_instance(curr_obj_id, 0);
@ -1485,14 +1499,11 @@ void ObjectList::OnBeginDrag(wxDataViewEvent &event)
event.Veto(); event.Veto();
return; return;
} }
const wxDataViewItem item(event.GetItem());
const bool mult_sel = multiple_selection(); m_dragged_data.init(m_objects_model->GetIdByItem(item), type);
const ItemType& type = m_objects_model->GetItemType(item); }
if (mult_sel || (type != itObject)) { else if (type & itVolume){
//drag only allowed for single object m_dragged_data.init(m_objects_model->GetObjectIdByItem(item), m_objects_model->GetVolumeIdByItem(item), type);
event.Veto();
return;
} }
#if 0 #if 0
if ((mult_sel && !selected_instances_of_same_object()) || if ((mult_sel && !selected_instances_of_same_object()) ||
@ -1522,9 +1533,8 @@ void ObjectList::OnBeginDrag(wxDataViewEvent &event)
type&itVolume ? m_objects_model->GetVolumeIdByItem(item) : type&itVolume ? m_objects_model->GetVolumeIdByItem(item) :
m_objects_model->GetInstanceIdByItem(item), m_objects_model->GetInstanceIdByItem(item),
type); type);
#else
m_dragged_data.init(m_objects_model->GetIdByItem(item), type);
#endif #endif
/* Under MSW or OSX, DnD moves an item to the place of another selected item /* Under MSW or OSX, DnD moves an item to the place of another selected item
* But under GTK, DnD moves an item between another two items. * But under GTK, DnD moves an item between another two items.
* And as a result - call EVT_CHANGE_SELECTION to unselect all items. * And as a result - call EVT_CHANGE_SELECTION to unselect all items.
@ -1544,10 +1554,12 @@ void ObjectList::OnBeginDrag(wxDataViewEvent &event)
bool ObjectList::can_drop(const wxDataViewItem& item, int& src_obj_id, int& src_plate, int& dest_obj_id, int& dest_plate) const bool ObjectList::can_drop(const wxDataViewItem& item, int& src_obj_id, int& src_plate, int& dest_obj_id, int& dest_plate) const
{ {
#if 1 if (!item.IsOk()
if (!item.IsOk() || (m_objects_model->GetItemType(item) != m_dragged_data.type())) || (m_objects_model->GetItemType(item) != m_dragged_data.type())
|| !(m_dragged_data.type() & (itVolume|itObject)))
return false; return false;
if (m_dragged_data.type() & itObject){
int from_obj_id = m_dragged_data.obj_idx(); int from_obj_id = m_dragged_data.obj_idx();
int to_obj_id = m_objects_model->GetIdByItem(item); int to_obj_id = m_objects_model->GetIdByItem(item);
PartPlateList& partplate_list = wxGetApp().plater()->get_partplate_list(); PartPlateList& partplate_list = wxGetApp().plater()->get_partplate_list();
@ -1563,18 +1575,12 @@ bool ObjectList::can_drop(const wxDataViewItem& item, int& src_obj_id, int& src_
dest_obj_id = to_obj_id; dest_obj_id = to_obj_id;
src_plate = from_plate; src_plate = from_plate;
dest_plate = to_plate; dest_plate = to_plate;
#else
// move instance(s) or object on "empty place" of ObjectList // move instance(s) or object on "empty place" of ObjectList
if ( (m_dragged_data.type() & (itInstance | itObject)) && !item.IsOk() ) // if ( (m_dragged_data.type() & (itInstance | itObject)) && !item.IsOk() )
return true; // return true;
}
// type of moved item should be the same as a "destination" item else if (m_dragged_data.type() & itVolume) { // move volumes inside one object only
if (!item.IsOk() || !(m_dragged_data.type() & (itVolume|itObject)) ||
m_objects_model->GetItemType(item) != m_dragged_data.type() )
return false;
// move volumes inside one object only
if (m_dragged_data.type() & itVolume) {
if (m_dragged_data.obj_idx() != m_objects_model->GetObjectIdByItem(item)) if (m_dragged_data.obj_idx() != m_objects_model->GetObjectIdByItem(item))
return false; return false;
wxDataViewItem dragged_item = m_objects_model->GetItemByVolumeId(m_dragged_data.obj_idx(), m_dragged_data.sub_obj_idx()); wxDataViewItem dragged_item = m_objects_model->GetItemByVolumeId(m_dragged_data.obj_idx(), m_dragged_data.sub_obj_idx());
@ -1609,10 +1615,8 @@ bool ObjectList::can_drop(const wxDataViewItem& item, int& src_obj_id, int& src_
return false; return false;
return m_objects_model->GetVolumeIdByItem(item) != 0; return m_objects_model->GetVolumeIdByItem(item) != 0;
} }
return false; return false;
} }
#endif
return true; return true;
} }
@ -1639,9 +1643,10 @@ void ObjectList::OnDrop(wxDataViewEvent &event)
return; return;
} }
#if 1 //#if 1
take_snapshot("Object order changed"); take_snapshot("Object order changed");
if(m_dragged_data.type() & itObject){
int delta = dest_obj_id < src_obj_id ? -1 : 1; int delta = dest_obj_id < src_obj_id ? -1 : 1;
PartPlateList& partplate_list = wxGetApp().plater()->get_partplate_list(); PartPlateList& partplate_list = wxGetApp().plater()->get_partplate_list();
/*int cnt = 0, cur_id = src_obj_id, next_id, total = abs(src_obj_id - dest_obj_id); /*int cnt = 0, cur_id = src_obj_id, next_id, total = abs(src_obj_id - dest_obj_id);
@ -1669,20 +1674,8 @@ void ObjectList::OnDrop(wxDataViewEvent &event)
partplate_list.reload_all_objects(false, src_plate); partplate_list.reload_all_objects(false, src_plate);
changed_object(src_obj_id); changed_object(src_obj_id);
#else
if (m_dragged_data.type() == itInstance)
{
// BBS: remove snapshot name "Instances to Separated Objects"
Plater::TakeSnapshot snapshot(wxGetApp().plater(),"");
instances_to_separated_object(m_dragged_data.obj_idx(), m_dragged_data.inst_idxs());
m_dragged_data.clear();
return;
} }
else if (m_dragged_data.type() & itVolume) {
take_snapshot((m_dragged_data.type() == itVolume) ? "Object parts order changed" : "Object order changed");
if (m_dragged_data.type() & itVolume)
{
int from_volume_id = m_dragged_data.sub_obj_idx(); int from_volume_id = m_dragged_data.sub_obj_idx();
int to_volume_id = m_objects_model->GetVolumeIdByItem(item); int to_volume_id = m_objects_model->GetVolumeIdByItem(item);
int delta = to_volume_id < from_volume_id ? -1 : 1; int delta = to_volume_id < from_volume_id ? -1 : 1;
@ -1690,27 +1683,12 @@ void ObjectList::OnDrop(wxDataViewEvent &event)
auto &volumes = (*m_objects)[m_dragged_data.obj_idx()]->volumes; auto &volumes = (*m_objects)[m_dragged_data.obj_idx()]->volumes;
int cnt = 0; int cnt = 0;
for (int id = from_volume_id; cnt < abs(from_volume_id - to_volume_id); id += delta, cnt++) for (int id = from_volume_id; cnt < abs(from_volume_id - to_volume_id); id += delta, cnt++) std::swap(volumes[id], volumes[id + delta]);
std::swap(volumes[id], volumes[id + delta]);
select_item(m_objects_model->ReorganizeChildren(from_volume_id, to_volume_id, m_objects_model->GetParent(item))); select_item(m_objects_model->ReorganizeChildren(from_volume_id, to_volume_id, m_objects_model->GetParent(item)));
}
else if (m_dragged_data.type() & itObject)
{
int from_obj_id = m_dragged_data.obj_idx();
int to_obj_id = item.IsOk() ? m_objects_model->GetIdByItem(item) : ((int)m_objects->size()-1);
int delta = to_obj_id < from_obj_id ? -1 : 1;
int cnt = 0;
for (int id = from_obj_id; cnt < abs(from_obj_id - to_obj_id); id += delta, cnt++)
std::swap((*m_objects)[id], (*m_objects)[id + delta]);
select_item(m_objects_model->ReorganizeObjects(from_obj_id, to_obj_id));
}
changed_object(m_dragged_data.obj_idx()); changed_object(m_dragged_data.obj_idx());
#endif }
m_dragged_data.clear(); m_dragged_data.clear();