From 0592ae65eeff51038aac647c68b009b1314c765c Mon Sep 17 00:00:00 2001 From: YuSanka Date: Tue, 23 Jul 2019 18:17:57 +0200 Subject: [PATCH] Completed setting of the item focus in ObjectList after undo/redo --- src/slic3r/GUI/GUI_ObjectList.cpp | 40 ++++++++++++++++++++++++------ src/slic3r/GUI/GUI_ObjectList.hpp | 10 ++++++-- src/slic3r/GUI/Plater.cpp | 41 +++++++++++++++++++++++++------ src/slic3r/Utils/UndoRedo.cpp | 2 +- src/slic3r/Utils/UndoRedo.hpp | 9 ++++++- 5 files changed, 82 insertions(+), 20 deletions(-) diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 047b7e8ed6..14c6db6541 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -2633,12 +2633,28 @@ bool ObjectList::is_selected(const ItemType type) const return false; } +t_layer_height_range ObjectList::get_selected_layers_range() const +{ + t_layer_height_range layer_range = { 0.0, 0.0 }; + const wxDataViewItem& item = GetSelection(); + if (!item) + return layer_range; + + const ItemType type = m_objects_model->GetItemType(item); + if (type & itSettings && m_objects_model->GetItemType(m_objects_model->GetParent(item)) != itLayer) + return layer_range; + + return type & itLayer ? m_objects_model->GetLayerRangeByItem(item) : + type & itSettings ? m_objects_model->GetLayerRangeByItem(m_objects_model->GetParent(item)) : + layer_range; +} + void ObjectList::update_selections() { const Selection& selection = wxGetApp().plater()->canvas3D()->get_selection(); wxDataViewItemArray sels; - if (m_selection_mode & smSettings == 0) + if ( ( m_selection_mode & (smSettings|smLayer|smLayerRoot) ) == 0) m_selection_mode = smInstance; // We doesn't update selection if SettingsItem for the current object/part is selected @@ -2665,10 +2681,21 @@ void ObjectList::update_selections() else if (selection.is_single_full_object() || selection.is_multiple_full_object()) { const Selection::ObjectIdxsToInstanceIdxsMap& objects_content = selection.get_content(); - if (m_selection_mode & smSettings) + if (m_selection_mode & (smSettings | smLayer | smLayerRoot)) { - wxDataViewItem obj_item = m_objects_model->GetItemById(objects_content.begin()->first); - sels.Add(m_objects_model->GetSettingsItem(obj_item)); + auto obj_idx = objects_content.begin()->first; + wxDataViewItem obj_item = m_objects_model->GetItemById(obj_idx); + if (m_selection_mode & smSettings) + { + if (m_selected_layers_range.first <= EPSILON && m_selected_layers_range.second <= EPSILON) + sels.Add(m_objects_model->GetSettingsItem(obj_item)); + else + sels.Add(m_objects_model->GetSettingsItem(m_objects_model->GetItemByLayerRange(obj_idx, m_selected_layers_range))); + } + else if (m_selection_mode & smLayerRoot) + sels.Add(m_objects_model->GetLayerRootItem(obj_item)); + else if (m_selection_mode & smLayer) + sels.Add(m_objects_model->GetItemByLayerRange(obj_idx, m_selected_layers_range)); } else { for (const auto& object : objects_content) { @@ -3550,8 +3577,6 @@ void ObjectList::update_after_undo_redo() unselect_objects();//this->UnselectAll(); m_objects_model->DeleteAll(); -// m_prevent_list_events = true; - size_t obj_idx = 0; while (obj_idx < m_objects->size()) { add_object_to_list(obj_idx, false); @@ -3559,13 +3584,12 @@ void ObjectList::update_after_undo_redo() } #ifndef __WXOSX__ - selection_changed(); +// selection_changed(); #endif /* __WXOSX__ */ update_selections(); m_prevent_canvas_selection_update = false; -// m_prevent_list_events = false; } ModelObject* ObjectList::object(const int obj_idx) const diff --git a/src/slic3r/GUI/GUI_ObjectList.hpp b/src/slic3r/GUI/GUI_ObjectList.hpp index c3fb5ba804..1c30a4d974 100644 --- a/src/slic3r/GUI/GUI_ObjectList.hpp +++ b/src/slic3r/GUI/GUI_ObjectList.hpp @@ -73,10 +73,14 @@ public: smVolume = 1, smInstance = 2, smLayer = 4, - smSettings = 8, // used for undo/redo - } m_selection_mode {smUndef}; + smSettings = 8, // used for undo/redo + smLayerRoot = 16, // used for undo/redo + }; private: + SELECTION_MODE m_selection_mode {smUndef}; + t_layer_height_range m_selected_layers_range; + struct dragged_item_data { void init(const int obj_idx, const int subobj_idx, const ItemType type) { @@ -305,6 +309,8 @@ public: void init_objects(); bool multiple_selection() const ; bool is_selected(const ItemType type) const; + t_layer_height_range get_selected_layers_range() const; + void set_selected_layers_range(const t_layer_height_range range) { m_selected_layers_range = range; } void set_selection_mode(SELECTION_MODE mode) { m_selection_mode = mode; } void update_selections(); void update_selections_on_canvas(); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 7653a5833a..3d1e7b97ce 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -3729,8 +3729,16 @@ void Plater::priv::take_snapshot(const std::string& snapshot_name) snapshot_data.printer_technology = this->printer_technology; if (this->view3D->is_layers_editing_enabled()) snapshot_data.flags |= UndoRedo::SnapshotData::VARIABLE_LAYER_EDITING_ACTIVE; - if (this->sidebar->obj_list()->is_selected(itSettings)) - snapshot_data.flags |= UndoRedo::SnapshotData::SETTINGS_SELECTED_ON_SIDEBAR; + if (this->sidebar->obj_list()->is_selected(itSettings)) { + snapshot_data.flags |= UndoRedo::SnapshotData::SELECTED_SETTINGS_ON_SIDEBAR; + snapshot_data.layer_range = this->sidebar->obj_list()->get_selected_layers_range(); + } + else if (this->sidebar->obj_list()->is_selected(itLayer)) { + snapshot_data.flags |= UndoRedo::SnapshotData::SELECTED_LAYER_ON_SIDEBAR; + snapshot_data.layer_range = this->sidebar->obj_list()->get_selected_layers_range(); + } + else if (this->sidebar->obj_list()->is_selected(itLayerRoot)) + snapshot_data.flags |= UndoRedo::SnapshotData::SELECTED_LAYERROOT_ON_SIDEBAR; //FIXME updating the Wipe tower config values at the ModelWipeTower from the Print config. // This is a workaround until we refactor the Wipe Tower position / orientation to live solely inside the Model, not in the Print config. if (this->printer_technology == ptFFF) { @@ -3797,10 +3805,22 @@ void Plater::priv::undo_redo_to(std::vector::const_iterator top_snapshot_data.printer_technology = this->printer_technology; if (this->view3D->is_layers_editing_enabled()) top_snapshot_data.flags |= UndoRedo::SnapshotData::VARIABLE_LAYER_EDITING_ACTIVE; - if (this->sidebar->obj_list()->is_selected(itSettings)) - top_snapshot_data.flags |= UndoRedo::SnapshotData::SETTINGS_SELECTED_ON_SIDEBAR; + if (this->sidebar->obj_list()->is_selected(itSettings)) { + top_snapshot_data.flags |= UndoRedo::SnapshotData::SELECTED_SETTINGS_ON_SIDEBAR; + top_snapshot_data.layer_range = this->sidebar->obj_list()->get_selected_layers_range(); + } + else if (this->sidebar->obj_list()->is_selected(itLayer)) { + top_snapshot_data.flags |= UndoRedo::SnapshotData::SELECTED_LAYER_ON_SIDEBAR; + top_snapshot_data.layer_range = this->sidebar->obj_list()->get_selected_layers_range(); + } + else if (this->sidebar->obj_list()->is_selected(itLayerRoot)) + top_snapshot_data.flags |= UndoRedo::SnapshotData::SELECTED_LAYERROOT_ON_SIDEBAR; bool new_variable_layer_editing_active = (new_flags & UndoRedo::SnapshotData::VARIABLE_LAYER_EDITING_ACTIVE) != 0; - bool new_settings_selected_on_sidebar = (new_flags & UndoRedo::SnapshotData::SETTINGS_SELECTED_ON_SIDEBAR) != 0; + bool new_selected_settings_on_sidebar = (new_flags & UndoRedo::SnapshotData::SELECTED_SETTINGS_ON_SIDEBAR) != 0; + bool new_selected_layer_on_sidebar = (new_flags & UndoRedo::SnapshotData::SELECTED_LAYER_ON_SIDEBAR) != 0; + bool new_selected_layerroot_on_sidebar = (new_flags & UndoRedo::SnapshotData::SELECTED_LAYERROOT_ON_SIDEBAR) != 0; + + t_layer_height_range layer_range = it_snapshot->snapshot_data.layer_range; // Disable layer editing before the Undo / Redo jump. if (!new_variable_layer_editing_active && view3D->is_layers_editing_enabled()) view3D->get_canvas3d()->force_main_toolbar_left_action(view3D->get_canvas3d()->get_main_toolbar_item_id("layersediting")); @@ -3833,9 +3853,14 @@ void Plater::priv::undo_redo_to(std::vector::const_iterator tab_print->update_dirty(); } } - // set settings mode for ObjectList on sidebar - if (new_settings_selected_on_sidebar) - this->sidebar->obj_list()->set_selection_mode(ObjectList::SELECTION_MODE::smSettings); + // set selection mode for ObjectList on sidebar + this->sidebar->obj_list()->set_selection_mode(new_selected_settings_on_sidebar ? ObjectList::SELECTION_MODE::smSettings : + new_selected_layer_on_sidebar ? ObjectList::SELECTION_MODE::smLayer : + new_selected_layerroot_on_sidebar ? ObjectList::SELECTION_MODE::smLayerRoot : + ObjectList::SELECTION_MODE::smUndef); + if (new_selected_settings_on_sidebar || new_selected_layer_on_sidebar) + this->sidebar->obj_list()->set_selected_layers_range(/*top_snapshot_data.*/layer_range); + this->update_after_undo_redo(temp_snapshot_was_taken); // Enable layer editing after the Undo / Redo jump. if (! view3D->is_layers_editing_enabled() && this->layers_height_allowed() && new_variable_layer_editing_active) diff --git a/src/slic3r/Utils/UndoRedo.cpp b/src/slic3r/Utils/UndoRedo.cpp index eba839ffb1..9b12be00eb 100644 --- a/src/slic3r/Utils/UndoRedo.cpp +++ b/src/slic3r/Utils/UndoRedo.cpp @@ -36,7 +36,7 @@ namespace Slic3r { namespace UndoRedo { -SnapshotData::SnapshotData() : printer_technology(ptUnknown), flags(0) +SnapshotData::SnapshotData() : printer_technology(ptUnknown), flags(0), layer_range({0.0, 0.0}) { } diff --git a/src/slic3r/Utils/UndoRedo.hpp b/src/slic3r/Utils/UndoRedo.hpp index a3a130efdc..85ad11b828 100644 --- a/src/slic3r/Utils/UndoRedo.hpp +++ b/src/slic3r/Utils/UndoRedo.hpp @@ -9,6 +9,9 @@ #include +typedef double coordf_t; +typedef std::pair t_layer_height_range; + namespace Slic3r { class Model; @@ -38,8 +41,12 @@ struct SnapshotData // Bitmask of various binary flags to be stored with the snapshot. enum Flags { VARIABLE_LAYER_EDITING_ACTIVE = 1, - SETTINGS_SELECTED_ON_SIDEBAR = 2, + SELECTED_SETTINGS_ON_SIDEBAR = 2, + SELECTED_LAYERROOT_ON_SIDEBAR = 4, + SELECTED_LAYER_ON_SIDEBAR = 8, }; + + t_layer_height_range layer_range; }; struct Snapshot