Copy and paste -> Clipboard refactored to accept more than one object

This commit is contained in:
Enrico Turri 2019-04-10 14:03:40 +02:00
parent a80978f84a
commit 7a1fab09d4
3 changed files with 38 additions and 61 deletions

View file

@ -2167,6 +2167,7 @@ void ObjectList::update_selections_on_canvas()
add_to_selection(item, selection, instance_idx, false); add_to_selection(item, selection, instance_idx, false);
wxGetApp().plater()->canvas3D()->update_gizmos_on_off_state(); wxGetApp().plater()->canvas3D()->update_gizmos_on_off_state();
wxGetApp().plater()->canvas3D()->render();
} }
void ObjectList::select_item(const wxDataViewItem& item) void ObjectList::select_item(const wxDataViewItem& item)

View file

@ -47,23 +47,6 @@ Selection::VolumeCache::VolumeCache(const Geometry::Transformation& volume_trans
{ {
} }
Selection::Clipboard::Clipboard()
: m_object(nullptr)
{
m_object = m_model.add_object();
}
void Selection::Clipboard::add_volume(const ModelVolume& volume)
{
ModelVolume* v = m_object->add_volume(volume);
v->config = volume.config;
}
const ModelVolume* Selection::Clipboard::get_volume(unsigned int id) const
{
return (id < (unsigned int)m_object->volumes.size()) ? m_object->volumes[id] : nullptr;
}
Selection::Selection() Selection::Selection()
: m_volumes(nullptr) : m_volumes(nullptr)
, m_model(nullptr) , m_model(nullptr)
@ -1046,33 +1029,36 @@ void Selection::copy_to_clipboard()
m_clipboard.reset(); m_clipboard.reset();
for (const ObjectIdxsToInstanceIdxsMap::value_type& object : m_cache.content)
{
ModelObject* src_object = m_model->objects[object.first];
ModelObject* dst_object = m_clipboard.add_object();
for (int i : object.second)
{
dst_object->add_instance(*src_object->instances[i]);
}
for (unsigned int i : m_list) for (unsigned int i : m_list)
{ {
const GLVolume* volume = (*m_volumes)[i]; const GLVolume* volume = (*m_volumes)[i];
int obj_idx = volume->object_idx(); if (volume->object_idx() == object.first)
if ((0 <= obj_idx) && (obj_idx < (int)m_model->objects.size()))
{ {
const ModelObject* model_object = m_model->objects[obj_idx]; ModelVolume* src_volume = src_object->volumes[i];
int vol_idx = volume->volume_idx(); ModelVolume* dst_volume = dst_object->add_volume(*src_volume);
if ((0 <= vol_idx) && (vol_idx < (int)model_object->volumes.size())) dst_volume->set_new_unique_id();
m_clipboard.add_volume(*model_object->volumes[vol_idx]); dst_volume->config = src_volume->config;
} }
} }
dst_object->config = src_object->config;
int obj_idx = get_object_idx(); }
if ((0 <= obj_idx) && (obj_idx < (int)m_model->objects.size()))
m_clipboard.get_object()->config = m_model->objects[obj_idx]->config;
m_clipboard.set_mode(m_mode); m_clipboard.set_mode(m_mode);
m_clipboard.set_type(m_type);
} }
void Selection::paste_from_clipboard() void Selection::paste_from_clipboard()
{ {
if (!m_valid) if (!m_valid || m_clipboard.is_empty())
return;
if (m_clipboard.is_empty())
return; return;
if ((m_clipboard.get_mode() == Volume) && is_from_single_instance()) if ((m_clipboard.get_mode() == Volume) && is_from_single_instance())
@ -1767,26 +1753,25 @@ void Selection::paste_volumes_from_clipboard()
if ((obj_idx < 0) || ((int)m_model->objects.size() <= obj_idx)) if ((obj_idx < 0) || ((int)m_model->objects.size() <= obj_idx))
return; return;
ModelObject& model_object = *m_model->objects[obj_idx]; ModelObject* src_object = m_clipboard.get_object(0);
unsigned int count = m_clipboard.get_volumes_count(); if (src_object != nullptr)
ModelVolumePtrs volumes;
for (unsigned int i = 0; i < count; ++i)
{ {
const ModelVolume* volume = m_clipboard.get_volume(i); ModelObject* dst_object = m_model->objects[obj_idx];
ModelVolume* new_volume = model_object.add_volume(*volume);
new_volume->config = volume->config; ModelVolumePtrs volumes;
new_volume->set_new_unique_id(); for (ModelVolume* src_volume : src_object->volumes)
volumes.push_back(new_volume); {
ModelVolume* dst_volume = dst_object->add_volume(*src_volume);
dst_volume->config = src_volume->config;
dst_volume->set_new_unique_id();
volumes.push_back(dst_volume);
} }
wxGetApp().obj_list()->paste_volumes_into_list(obj_idx, volumes); wxGetApp().obj_list()->paste_volumes_into_list(obj_idx, volumes);
int a = 0; }
} }
void Selection::paste_object_from_clipboard() void Selection::paste_object_from_clipboard()
{ {
ModelObject* model_object = m_clipboard.get_object();
if (model_object != nullptr)
wxGetApp().obj_list()->paste_object_into_list(*model_object);
} }
} // namespace GUI } // namespace GUI

View file

@ -154,26 +154,17 @@ private:
class Clipboard class Clipboard
{ {
Model m_model; Model m_model;
ModelObject* m_object;
Selection::EMode m_mode; Selection::EMode m_mode;
Selection::EType m_type;
public: public:
Clipboard(); void reset() { m_model.clear_objects(); }
bool is_empty() const { return m_model.objects.empty(); }
void reset() { if (m_object != nullptr) m_object->clear_volumes(); } ModelObject* add_object() { return m_model.add_object(); }
void add_volume(const ModelVolume& volume); ModelObject* get_object(unsigned int id) { return (id < (unsigned int)m_model.objects.size()) ? m_model.objects[id] : nullptr; }
const ModelVolume* get_volume(unsigned int id) const;
ModelObject* get_object() { return m_object; }
const ModelObject* get_object() const { return m_object; }
const unsigned int get_volumes_count() const { return (unsigned int)m_object->volumes.size(); }
bool is_empty() const { return (m_object == nullptr) || m_object->volumes.empty(); }
Selection::EMode get_mode() const { return m_mode; } Selection::EMode get_mode() const { return m_mode; }
void set_mode(Selection::EMode mode) { m_mode = mode; } void set_mode(Selection::EMode mode) { m_mode = mode; }
Selection::EType get_type() const { return m_type; }
void set_type(Selection::EType type) { m_type = type; }
}; };
// Volumes owned by GLCanvas3D. // Volumes owned by GLCanvas3D.