From 5e4a0b96b791f4ed72ae84b5f672a11ac174b12e Mon Sep 17 00:00:00 2001 From: YuSanka Date: Thu, 20 Feb 2020 14:19:00 +0100 Subject: [PATCH] Linux issue: fixed Object's DnD with sub items --- src/slic3r/GUI/GUI_ObjectList.cpp | 6 ++++-- src/slic3r/GUI/ObjectDataViewModel.cpp | 28 ++++++++++++++++++++++++++ src/slic3r/GUI/ObjectDataViewModel.hpp | 5 +++-- 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 63aca7140..a5566de29 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -1561,9 +1561,11 @@ wxMenuItem* ObjectList::append_menu_item_settings(wxMenu* menu_) // Add frequently settings const ItemType item_type = m_objects_model->GetItemType(GetSelection()); - if (item_type == itUndef) + if (item_type == itUndef && !selection.is_single_full_object()) return nullptr; - const bool is_object_settings = item_type & itObject || item_type & itInstance || selection.is_single_full_object(); + const bool is_object_settings = item_type & itObject || item_type & itInstance || + // multi-selection in ObjectList, but full_object in Selection + (item_type == itUndef && selection.is_single_full_object()); create_freq_settings_popupmenu(menu, is_object_settings); if (mode == comAdvanced) diff --git a/src/slic3r/GUI/ObjectDataViewModel.cpp b/src/slic3r/GUI/ObjectDataViewModel.cpp index b49b27e33..649b3c32e 100644 --- a/src/slic3r/GUI/ObjectDataViewModel.cpp +++ b/src/slic3r/GUI/ObjectDataViewModel.cpp @@ -1185,6 +1185,26 @@ void ObjectDataViewModel::SetExtruder(const wxString& extruder, wxDataViewItem i SetValue(value, item, colExtruder); } +void ObjectDataViewModel::AddAllChildren(const wxDataViewItem& parent) +{ + ObjectDataViewModelNode* node = (ObjectDataViewModelNode*)parent.GetID(); + if (!node || node->GetChildCount() == 0) + return; + + wxDataViewItemArray array; + const size_t count = node->GetChildCount(); + for (size_t pos = 0; pos < count; pos++) { + ObjectDataViewModelNode* child = node->GetChildren().Item(pos); + array.Add(wxDataViewItem((void*)child)); + ItemAdded(parent, wxDataViewItem((void*)child)); + } + + for (const auto item : array) + AddAllChildren(item); + + m_ctrl->Expand(parent); +}; + wxDataViewItem ObjectDataViewModel::ReorganizeChildren( const int current_volume_id, const int new_volume_id, const wxDataViewItem &parent) @@ -1205,6 +1225,10 @@ wxDataViewItem ObjectDataViewModel::ReorganizeChildren( const int current_volume node_parent->Insert(deleted_node, new_volume_id+shift); ItemAdded(parent, wxDataViewItem(deleted_node)); + // If some item has a children, just to add a deleted item is not enough on Linux + // We should to add all its children separately + AddAllChildren(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; @@ -1227,6 +1251,10 @@ wxDataViewItem ObjectDataViewModel::ReorganizeObjects( const int current_id, co m_objects.emplace(m_objects.begin() + new_id, deleted_node); ItemAdded(wxDataViewItem(nullptr), wxDataViewItem(deleted_node)); + // If some item has a children, just to add a deleted item is not enough on Linux + // We should to add all its children separately + AddAllChildren(wxDataViewItem(deleted_node)); + return wxDataViewItem(deleted_node); } diff --git a/src/slic3r/GUI/ObjectDataViewModel.hpp b/src/slic3r/GUI/ObjectDataViewModel.hpp index 3d838cd43..c18484266 100644 --- a/src/slic3r/GUI/ObjectDataViewModel.hpp +++ b/src/slic3r/GUI/ObjectDataViewModel.hpp @@ -504,8 +504,9 @@ public: void UpdateExtruderBitmap(wxDataViewItem item); private: - wxDataViewItem AddRoot(const wxDataViewItem& parent_item, const ItemType root_type); - wxDataViewItem AddInstanceRoot(const wxDataViewItem& parent_item); + wxDataViewItem AddRoot(const wxDataViewItem& parent_item, const ItemType root_type); + wxDataViewItem AddInstanceRoot(const wxDataViewItem& parent_item); + void AddAllChildren(const wxDataViewItem& parent); };