mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-05-30 01:54:40 +08:00
Drag & Drop for sub-objects (parts of the object)
This commit is contained in:
parent
73ba96381e
commit
13388f1caa
@ -306,6 +306,7 @@ wxBoxSizer* content_objects_list(wxWindow *win)
|
|||||||
|
|
||||||
m_objects_ctrl->GetMainWindow()->Bind(wxEVT_MOTION, [](wxMouseEvent& event) {
|
m_objects_ctrl->GetMainWindow()->Bind(wxEVT_MOTION, [](wxMouseEvent& event) {
|
||||||
set_tooltip_for_item(event.GetPosition());
|
set_tooltip_for_item(event.GetPosition());
|
||||||
|
event.Skip();
|
||||||
});
|
});
|
||||||
#else
|
#else
|
||||||
m_objects_ctrl->Bind(wxEVT_DATAVIEW_ITEM_VALUE_CHANGED, [](wxDataViewEvent& event)
|
m_objects_ctrl->Bind(wxEVT_DATAVIEW_ITEM_VALUE_CHANGED, [](wxDataViewEvent& event)
|
||||||
@ -1536,17 +1537,15 @@ void on_begin_drag(wxDataViewEvent &event)
|
|||||||
wxDataViewItem item(event.GetItem());
|
wxDataViewItem item(event.GetItem());
|
||||||
|
|
||||||
// only allow drags for item, not containers
|
// only allow drags for item, not containers
|
||||||
if (m_objects_model->GetParent(item) == wxDataViewItem(0))
|
if (m_objects_model->GetParent(item) == wxDataViewItem(0)) {
|
||||||
{
|
|
||||||
event.Veto();
|
event.Veto();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
PrusaObjectDataViewModelNode *node = (PrusaObjectDataViewModelNode*)item.GetID();
|
|
||||||
wxTextDataObject *obj = new wxTextDataObject;
|
wxTextDataObject *obj = new wxTextDataObject;
|
||||||
obj->SetText(node->m_name);
|
obj->SetText(wxString::Format("%d", m_objects_model->GetVolumeIdByItem(item)));
|
||||||
event.SetDataObject(obj);
|
event.SetDataObject(obj);
|
||||||
event.SetDragFlags(wxDrag_AllowMove); // allows both copy and move;
|
event.SetDragFlags(/*wxDrag_AllowMove*/wxDrag_DefaultMove); // allows both copy and move;
|
||||||
}
|
}
|
||||||
|
|
||||||
void on_drop_possible(wxDataViewEvent &event)
|
void on_drop_possible(wxDataViewEvent &event)
|
||||||
@ -1554,10 +1553,8 @@ void on_drop_possible(wxDataViewEvent &event)
|
|||||||
wxDataViewItem item(event.GetItem());
|
wxDataViewItem item(event.GetItem());
|
||||||
|
|
||||||
// only allow drags for item or background, not containers
|
// only allow drags for item or background, not containers
|
||||||
if (item.IsOk() && m_objects_model->GetParent(item) == wxDataViewItem(0))
|
if (item.IsOk() && m_objects_model->GetParent(item) == wxDataViewItem(0) ||
|
||||||
event.Veto();
|
event.GetDataFormat() != wxDF_UNICODETEXT)
|
||||||
|
|
||||||
if (event.GetDataFormat() != wxDF_UNICODETEXT)
|
|
||||||
event.Veto();
|
event.Veto();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1566,25 +1563,26 @@ void on_drop(wxDataViewEvent &event)
|
|||||||
wxDataViewItem item(event.GetItem());
|
wxDataViewItem item(event.GetItem());
|
||||||
|
|
||||||
// only allow drops for item, not containers
|
// only allow drops for item, not containers
|
||||||
if (item.IsOk() && m_objects_model->GetParent(item) == wxDataViewItem(0))
|
if (item.IsOk() && m_objects_model->GetParent(item) == wxDataViewItem(0) ||
|
||||||
{
|
event.GetDataFormat() != wxDF_UNICODETEXT) {
|
||||||
event.Veto();
|
event.Veto();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (event.GetDataFormat() != wxDF_UNICODETEXT)
|
|
||||||
{
|
|
||||||
event.Veto();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
wxTextDataObject obj;
|
wxTextDataObject obj;
|
||||||
obj.SetData(wxDF_UNICODETEXT, event.GetDataSize(), event.GetDataBuffer());
|
obj.SetData(wxDF_UNICODETEXT, event.GetDataSize(), event.GetDataBuffer());
|
||||||
|
|
||||||
if (item.IsOk())
|
int from_volume_id = std::stoi(obj.GetText().ToStdString());
|
||||||
wxMessageBox(wxString::Format("Text dropped on item %s: %s", m_objects_model->GetName(item), obj.GetText()));
|
int to_volume_id = m_objects_model->GetVolumeIdByItem(item);
|
||||||
else
|
|
||||||
wxMessageBox(wxString::Format("Text dropped on background: %s", obj.GetText()));
|
m_objects_ctrl->Select(m_objects_model->ReorganizeChildren(from_volume_id, to_volume_id,
|
||||||
|
m_objects_model->GetParent(item)));
|
||||||
|
|
||||||
|
auto& volumes = (*m_objects)[m_selected_object_id]->volumes;
|
||||||
|
auto delta = to_volume_id < from_volume_id ? -1 : 1;
|
||||||
|
int cnt = 0;
|
||||||
|
for (int id = from_volume_id; cnt < abs(from_volume_id - to_volume_id); id+=delta, cnt++)
|
||||||
|
std::swap(volumes[id], volumes[id +delta]);
|
||||||
}
|
}
|
||||||
|
|
||||||
} //namespace GUI
|
} //namespace GUI
|
||||||
|
@ -664,6 +664,32 @@ wxDataViewItem PrusaObjectDataViewModel::MoveChildDown(const wxDataViewItem &ite
|
|||||||
return ret_item;
|
return ret_item;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wxDataViewItem PrusaObjectDataViewModel::ReorganizeChildren(int current_volume_id, int new_volume_id, const wxDataViewItem &parent)
|
||||||
|
{
|
||||||
|
auto ret_item = wxDataViewItem(0);
|
||||||
|
if (current_volume_id == new_volume_id)
|
||||||
|
return ret_item;
|
||||||
|
wxASSERT(parent.IsOk());
|
||||||
|
PrusaObjectDataViewModelNode *node_parent = (PrusaObjectDataViewModelNode*)parent.GetID();
|
||||||
|
if (!node_parent) // happens if item.IsOk()==false
|
||||||
|
return ret_item;
|
||||||
|
|
||||||
|
PrusaObjectDataViewModelNode *deleted_node = node_parent->GetNthChild(current_volume_id);
|
||||||
|
node_parent->GetChildren().Remove(deleted_node);
|
||||||
|
ItemDeleted(parent, wxDataViewItem(deleted_node));
|
||||||
|
node_parent->Insert(deleted_node, new_volume_id);
|
||||||
|
ItemAdded(parent, wxDataViewItem(deleted_node));
|
||||||
|
|
||||||
|
//update volume_id value for child-nodes
|
||||||
|
auto children = node_parent->GetChildren();
|
||||||
|
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]->SetVolumeId(id);
|
||||||
|
|
||||||
|
return wxDataViewItem(node_parent->GetNthChild(new_volume_id));
|
||||||
|
}
|
||||||
|
|
||||||
// bool MyObjectTreeModel::IsEnabled(const wxDataViewItem &item, unsigned int col) const
|
// bool MyObjectTreeModel::IsEnabled(const wxDataViewItem &item, unsigned int col) const
|
||||||
// {
|
// {
|
||||||
//
|
//
|
||||||
|
@ -381,6 +381,11 @@ public:
|
|||||||
|
|
||||||
wxDataViewItem MoveChildUp(const wxDataViewItem &item);
|
wxDataViewItem MoveChildUp(const wxDataViewItem &item);
|
||||||
wxDataViewItem MoveChildDown(const wxDataViewItem &item);
|
wxDataViewItem MoveChildDown(const wxDataViewItem &item);
|
||||||
|
// For parent move child from cur_volume_id place to new_volume_id
|
||||||
|
// Remaining items will moved up/down accordingly
|
||||||
|
wxDataViewItem ReorganizeChildren(int cur_volume_id,
|
||||||
|
int new_volume_id,
|
||||||
|
const wxDataViewItem &parent);
|
||||||
|
|
||||||
// virtual bool IsEnabled(const wxDataViewItem &item,
|
// virtual bool IsEnabled(const wxDataViewItem &item,
|
||||||
// unsigned int col) const override;
|
// unsigned int col) const override;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user