From a57ff1c221b43094bfb33d2e00b4b080f7cc545b Mon Sep 17 00:00:00 2001 From: YuSanka <yusanka@gmail.com> Date: Wed, 12 Dec 2018 08:40:10 +0100 Subject: [PATCH] Fixed DnD under all platforms + try to fix the work of Backspase in ObjectList (using EVT_KEY_DOWN instead of EVT_CHAR) --- src/slic3r/GUI/GUI_ObjectList.cpp | 53 +++++++++++++------------------ src/slic3r/GUI/GUI_ObjectList.hpp | 21 ++++++++++++ src/slic3r/GUI/wxExtensions.cpp | 7 +++- src/slic3r/GUI/wxExtensions.hpp | 3 +- 4 files changed, 51 insertions(+), 33 deletions(-) diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index ba98573bf..e3e53a5e9 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -78,6 +78,10 @@ ObjectList::ObjectList(wxWindow* parent) : Bind(wxEVT_DATAVIEW_ITEM_VALUE_CHANGED, &ObjectList::ItemValueChanged, this); Bind(wxCUSTOMEVT_LAST_VOLUME_IS_DELETED, [this](wxCommandEvent& e) { last_volume_is_deleted(e.GetInt()); }); + +#ifdef __WXOSX__ + Bind(wxEVT_KEY_DOWN, &ObjectList::OnChar, this); +#endif //__WXOSX__ } ObjectList::~ObjectList() @@ -93,10 +97,6 @@ void ObjectList::create_objects_ctrl() // 2. change it to the normal min value (200) after first whole App updating/layouting SetMinSize(wxSize(-1, 1500)); // #ys_FIXME -#ifdef __WXOSX__ - Connect(wxEVT_CHAR, wxKeyEventHandler(ObjectList::OnChar), NULL, this); -#endif //__WXOSX__ - m_sizer = new wxBoxSizer(wxVERTICAL); m_sizer->Add(this, 1, wxGROW | wxLEFT, 20); @@ -337,14 +337,15 @@ void ObjectList::selection_changed() void ObjectList::OnChar(wxKeyEvent& event) { - if (event.GetKeyCode() == WXK_DELETE && event.GetKeyCode() == WXK_BACK){ + printf("KeyDown event\n"); + if (event.GetKeyCode() == WXK_BACK){ printf("WXK_BACK\n"); remove(); } else if (wxGetKeyState(wxKeyCode('A')) && wxGetKeyState(WXK_SHIFT)) select_item_all_children(); - else - event.Skip(); + + event.Skip(); } void ObjectList::OnContextMenu(wxDataViewEvent&) @@ -424,12 +425,6 @@ void ObjectList::key_event(wxKeyEvent& event) event.Skip(); } -struct draging_item_data -{ - int obj_idx; - int vol_idx; -}; - void ObjectList::OnBeginDrag(wxDataViewEvent &event) { wxDataViewItem item(event.GetItem()); @@ -449,10 +444,10 @@ void ObjectList::OnBeginDrag(wxDataViewEvent &event) **/ m_prevent_list_events = true;//it's needed for GTK - wxTextDataObject *obj = new wxTextDataObject; - obj->SetText(wxString::Format("%d", m_objects_model->GetVolumeIdByItem(item))); - event.SetDataObject(obj); - event.SetDragFlags(/*wxDrag_AllowMove*/wxDrag_DefaultMove); // allows both copy and move; + m_dragged_data.init(m_objects_model->GetObjectIdByItem(item), m_objects_model->GetVolumeIdByItem(item)); + + event.SetDataObject(new wxTextDataObject); + event.SetDragFlags(wxDrag_DefaultMove); // allows both copy and move; } void ObjectList::OnDropPossible(wxDataViewEvent &event) @@ -460,8 +455,10 @@ void ObjectList::OnDropPossible(wxDataViewEvent &event) wxDataViewItem item(event.GetItem()); // only allow drags for item or background, not containers - if (event.GetDataFormat() != wxDF_UNICODETEXT || item.IsOk() && - (m_objects_model->GetParent(item) == wxDataViewItem(0) || m_objects_model->GetItemType(item) != itVolume)) + if (item.IsOk() && + (m_objects_model->GetParent(item) == wxDataViewItem(0) || + m_objects_model->GetItemType(item) != itVolume || + m_dragged_data.obj_idx() != m_objects_model->GetObjectIdByItem(item))) event.Veto(); } @@ -469,20 +466,16 @@ void ObjectList::OnDrop(wxDataViewEvent &event) { wxDataViewItem item(event.GetItem()); - if (m_selected_object_id < 0 || event.GetDataFormat() != wxDF_UNICODETEXT || - item.IsOk() && ( m_objects_model->GetParent(item) == wxDataViewItem(0) || - m_objects_model->GetItemType(item) != itVolume) ) { + if (item.IsOk() && ( m_objects_model->GetParent(item) == wxDataViewItem(0) || + m_objects_model->GetItemType(item) != itVolume) || + m_dragged_data.obj_idx() != m_objects_model->GetObjectIdByItem(item)) { event.Veto(); + m_dragged_data.clear(); return; } - wxTextDataObject obj; - obj.SetData(wxDF_UNICODETEXT, event.GetDataSize(), event.GetDataBuffer()); - printf("Drop\n"); - - int from_volume_id = std::stoi(obj.GetText().ToStdString()); + const int from_volume_id = m_dragged_data.vol_idx(); int to_volume_id = m_objects_model->GetVolumeIdByItem(item); - printf("from %d to %d\n", from_volume_id, to_volume_id); #ifdef __WXGTK__ /* Under GTK, DnD moves an item between another two items. @@ -497,16 +490,14 @@ void ObjectList::OnDrop(wxDataViewEvent &event) 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]); - printf("Volumes are swapped\n"); select_item(m_objects_model->ReorganizeChildren(from_volume_id, to_volume_id, m_objects_model->GetParent(item))); - printf("ItemChildren are Reorganized\n"); m_parts_changed = true; parts_changed(m_selected_object_id); - printf("DropCompleted\n"); + m_dragged_data.clear(); // m_prevent_list_events = false; } diff --git a/src/slic3r/GUI/GUI_ObjectList.hpp b/src/slic3r/GUI/GUI_ObjectList.hpp index 5cb76b8aa..33e3894fe 100644 --- a/src/slic3r/GUI/GUI_ObjectList.hpp +++ b/src/slic3r/GUI/GUI_ObjectList.hpp @@ -53,6 +53,27 @@ struct ItemForDelete class ObjectList : public wxDataViewCtrl { + + struct dragged_item_data + { + void init(const int obj_idx, const int vol_idx) { + m_obj_idx = obj_idx; + m_vol_idx = vol_idx; + } + + void clear() { + m_obj_idx = -1; + m_vol_idx = -1; + } + + int obj_idx() const { return m_obj_idx; } + int vol_idx() const { return m_vol_idx; } + + private: + int m_obj_idx = -1; + int m_vol_idx = -1; + } m_dragged_data; + wxBoxSizer *m_sizer {nullptr}; DynamicPrintConfig *m_default_config {nullptr}; diff --git a/src/slic3r/GUI/wxExtensions.cpp b/src/slic3r/GUI/wxExtensions.cpp index 98a246f10..57828ea9a 100644 --- a/src/slic3r/GUI/wxExtensions.cpp +++ b/src/slic3r/GUI/wxExtensions.cpp @@ -891,7 +891,7 @@ wxDataViewItem PrusaObjectDataViewModel::GetItemByInstanceId(int obj_idx, int in return wxDataViewItem(0); } -int PrusaObjectDataViewModel::GetIdByItem(const wxDataViewItem& item) +int PrusaObjectDataViewModel::GetIdByItem(const wxDataViewItem& item) const { wxASSERT(item.IsOk()); @@ -913,6 +913,11 @@ int PrusaObjectDataViewModel::GetIdByItemAndType(const wxDataViewItem& item, con return node->GetIdx(); } +int PrusaObjectDataViewModel::GetObjectIdByItem(const wxDataViewItem& item) const +{ + return GetIdByItem(GetTopParent(item)); +} + int PrusaObjectDataViewModel::GetVolumeIdByItem(const wxDataViewItem& item) const { return GetIdByItemAndType(item, itVolume); diff --git a/src/slic3r/GUI/wxExtensions.hpp b/src/slic3r/GUI/wxExtensions.hpp index 6f87579e2..866317e25 100644 --- a/src/slic3r/GUI/wxExtensions.hpp +++ b/src/slic3r/GUI/wxExtensions.hpp @@ -457,8 +457,9 @@ public: wxDataViewItem GetItemById(int obj_idx); wxDataViewItem GetItemByVolumeId(int obj_idx, int volume_idx); wxDataViewItem GetItemByInstanceId(int obj_idx, int inst_idx); - int GetIdByItem(const wxDataViewItem& item); + int GetIdByItem(const wxDataViewItem& item) const; int GetIdByItemAndType(const wxDataViewItem& item, const ItemType type) const; + int GetObjectIdByItem(const wxDataViewItem& item) const; int GetVolumeIdByItem(const wxDataViewItem& item) const; int GetInstanceIdByItem(const wxDataViewItem& item) const; void GetItemInfo(const wxDataViewItem& item, ItemType& type, int& obj_idx, int& idx);