From 73ba96381e3c7fbaf45dec9ed624733ca1bf4c6e Mon Sep 17 00:00:00 2001 From: YuSanka Date: Mon, 13 Aug 2018 10:30:36 +0200 Subject: [PATCH] Drag&Drop test on Linux and OSX --- xs/src/slic3r/GUI/GUI_ObjectParts.cpp | 59 +++++++++++++++++++++++++++ xs/src/slic3r/GUI/GUI_ObjectParts.hpp | 5 +++ 2 files changed, 64 insertions(+) diff --git a/xs/src/slic3r/GUI/GUI_ObjectParts.cpp b/xs/src/slic3r/GUI/GUI_ObjectParts.cpp index bcd1846fb9..90fc615658 100644 --- a/xs/src/slic3r/GUI/GUI_ObjectParts.cpp +++ b/xs/src/slic3r/GUI/GUI_ObjectParts.cpp @@ -323,6 +323,9 @@ wxBoxSizer* content_objects_list(wxWindow *win) }); #endif //__WXMSW__ + m_objects_ctrl->Bind(wxEVT_DATAVIEW_ITEM_BEGIN_DRAG, [](wxDataViewEvent& e) {on_begin_drag(e);}); + m_objects_ctrl->Bind(wxEVT_DATAVIEW_ITEM_DROP_POSSIBLE, [](wxDataViewEvent& e) {on_drop_possible(e); }); + m_objects_ctrl->Bind(wxEVT_DATAVIEW_ITEM_DROP, [](wxDataViewEvent& e) {on_drop(e);}); return objects_sz; } @@ -1528,5 +1531,61 @@ void update_rotation_value(const double angle, const std::string& axis) og->set_value("rotation_"+axis, deg); } +void on_begin_drag(wxDataViewEvent &event) +{ + wxDataViewItem item(event.GetItem()); + + // only allow drags for item, not containers + if (m_objects_model->GetParent(item) == wxDataViewItem(0)) + { + event.Veto(); + return; + } + + PrusaObjectDataViewModelNode *node = (PrusaObjectDataViewModelNode*)item.GetID(); + wxTextDataObject *obj = new wxTextDataObject; + obj->SetText(node->m_name); + event.SetDataObject(obj); + event.SetDragFlags(wxDrag_AllowMove); // allows both copy and move; +} + +void on_drop_possible(wxDataViewEvent &event) +{ + wxDataViewItem item(event.GetItem()); + + // only allow drags for item or background, not containers + if (item.IsOk() && m_objects_model->GetParent(item) == wxDataViewItem(0)) + event.Veto(); + + if (event.GetDataFormat() != wxDF_UNICODETEXT) + event.Veto(); +} + +void on_drop(wxDataViewEvent &event) +{ + wxDataViewItem item(event.GetItem()); + + // only allow drops for item, not containers + if (item.IsOk() && m_objects_model->GetParent(item) == wxDataViewItem(0)) + { + event.Veto(); + return; + } + + if (event.GetDataFormat() != wxDF_UNICODETEXT) + { + event.Veto(); + return; + } + + wxTextDataObject obj; + obj.SetData(wxDF_UNICODETEXT, event.GetDataSize(), event.GetDataBuffer()); + + if (item.IsOk()) + wxMessageBox(wxString::Format("Text dropped on item %s: %s", m_objects_model->GetName(item), obj.GetText())); + else + wxMessageBox(wxString::Format("Text dropped on background: %s", obj.GetText())); +} + } //namespace GUI } //namespace Slic3r \ No newline at end of file diff --git a/xs/src/slic3r/GUI/GUI_ObjectParts.hpp b/xs/src/slic3r/GUI/GUI_ObjectParts.hpp index 17c99f65c5..8c35bea35f 100644 --- a/xs/src/slic3r/GUI/GUI_ObjectParts.hpp +++ b/xs/src/slic3r/GUI/GUI_ObjectParts.hpp @@ -7,6 +7,7 @@ class wxBoxSizer; class wxString; class wxArrayString; class wxMenu; +class wxDataViewEvent; namespace Slic3r { class ModelObject; @@ -109,6 +110,10 @@ void update_rotation_values(); // update rotation value after "gizmos" void update_rotation_value(const double angle, const std::string& axis); +void on_begin_drag(wxDataViewEvent &event); +void on_drop_possible(wxDataViewEvent &event); +void on_drop(wxDataViewEvent &event); + } //namespace GUI } //namespace Slic3r #endif //slic3r_GUI_ObjectParts_hpp_ \ No newline at end of file