From 8b9568797a5b7015185bf451c0cb98cf254ab1d9 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Wed, 10 Apr 2019 15:55:32 +0200 Subject: [PATCH] Copy and paste -> prototype of copy and paste for objects --- src/slic3r/GUI/GUI_ObjectList.cpp | 19 ++++++++++++++++++- src/slic3r/GUI/GUI_ObjectList.hpp | 2 +- src/slic3r/GUI/Selection.cpp | 28 +++++++++++++++++++++------- src/slic3r/GUI/Selection.hpp | 4 +++- 4 files changed, 43 insertions(+), 10 deletions(-) diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index c36b8b288..4d205fa5f 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -469,8 +469,25 @@ void ObjectList::paste_volumes_into_list(int obj_idx, const ModelVolumePtrs& vol #endif //no __WXOSX__ //__WXMSW__ } -void ObjectList::paste_object_into_list(const ModelObject& object) +void ObjectList::paste_objects_into_list(const std::vector& object_idxs) { + if (object_idxs.empty()) + return; + + wxDataViewItemArray items; + for (const size_t object : object_idxs) + { + add_object_to_list(object); + m_parts_changed = true; + parts_changed(object); + + items.Add(m_objects_model->GetItemById(object)); + } + + select_items(items); +#ifndef __WXOSX__ //#ifdef __WXMSW__ // #ys_FIXME + selection_changed(); +#endif //no __WXOSX__ //__WXMSW__ } void ObjectList::OnChar(wxKeyEvent& event) diff --git a/src/slic3r/GUI/GUI_ObjectList.hpp b/src/slic3r/GUI/GUI_ObjectList.hpp index c5e097af8..a0343100a 100644 --- a/src/slic3r/GUI/GUI_ObjectList.hpp +++ b/src/slic3r/GUI/GUI_ObjectList.hpp @@ -289,7 +289,7 @@ public: void update_item_error_icon(const int obj_idx, int vol_idx) const ; void paste_volumes_into_list(int obj_idx, const ModelVolumePtrs& volumes); - void paste_object_into_list(const ModelObject& object); + void paste_objects_into_list(const std::vector& object_idxs); private: void OnChar(wxKeyEvent& event); diff --git a/src/slic3r/GUI/Selection.cpp b/src/slic3r/GUI/Selection.cpp index 9179fce42..cb5add462 100644 --- a/src/slic3r/GUI/Selection.cpp +++ b/src/slic3r/GUI/Selection.cpp @@ -1033,6 +1033,9 @@ void Selection::copy_to_clipboard() { ModelObject* src_object = m_model->objects[object.first]; ModelObject* dst_object = m_clipboard.add_object(); + dst_object->name = src_object->name; + dst_object->input_file = src_object->input_file; + dst_object->config = src_object->config; for (int i : object.second) { @@ -1044,13 +1047,16 @@ void Selection::copy_to_clipboard() const GLVolume* volume = (*m_volumes)[i]; if (volume->object_idx() == object.first) { - ModelVolume* src_volume = src_object->volumes[i]; - ModelVolume* dst_volume = dst_object->add_volume(*src_volume); - dst_volume->set_new_unique_id(); - dst_volume->config = src_volume->config; + int volume_idx = volume->volume_idx(); + if ((0 <= volume_idx) && (volume_idx < (int)src_object->volumes.size())) + { + ModelVolume* src_volume = src_object->volumes[volume->volume_idx()]; + ModelVolume* dst_volume = dst_object->add_volume(*src_volume); + dst_volume->set_new_unique_id(); + dst_volume->config = src_volume->config; + } } } - dst_object->config = src_object->config; } m_clipboard.set_mode(m_mode); @@ -1064,7 +1070,7 @@ void Selection::paste_from_clipboard() if ((m_clipboard.get_mode() == Volume) && is_from_single_instance()) paste_volumes_from_clipboard(); else - paste_object_from_clipboard(); + paste_objects_from_clipboard(); } bool Selection::is_clipboard_empty() @@ -1770,8 +1776,16 @@ void Selection::paste_volumes_from_clipboard() } } -void Selection::paste_object_from_clipboard() +void Selection::paste_objects_from_clipboard() { + std::vector object_idxs; + const ModelObjectPtrs& src_objects = m_clipboard.get_objects(); + for (const ModelObject* src_object : src_objects) + { + ModelObject* dst_object = m_model->add_object(*src_object); + object_idxs.push_back(m_model->objects.size() - 1); + } + wxGetApp().obj_list()->paste_objects_into_list(object_idxs); } } // namespace GUI diff --git a/src/slic3r/GUI/Selection.hpp b/src/slic3r/GUI/Selection.hpp index e04c37356..9fa9f1869 100644 --- a/src/slic3r/GUI/Selection.hpp +++ b/src/slic3r/GUI/Selection.hpp @@ -162,6 +162,7 @@ private: ModelObject* add_object() { return m_model.add_object(); } ModelObject* get_object(unsigned int id) { return (id < (unsigned int)m_model.objects.size()) ? m_model.objects[id] : nullptr; } + const ModelObjectPtrs& get_objects() const { return m_model.objects; } Selection::EMode get_mode() const { return m_mode; } void set_mode(Selection::EMode mode) { m_mode = mode; } @@ -322,8 +323,9 @@ private: void synchronize_unselected_volumes(); void ensure_on_bed(); bool is_from_fully_selected_instance(unsigned int volume_idx) const; + void paste_volumes_from_clipboard(); - void paste_object_from_clipboard(); + void paste_objects_from_clipboard(); }; } // namespace GUI