Completed setting of the item focus in ObjectList after undo/redo

This commit is contained in:
YuSanka 2019-07-23 18:17:57 +02:00
parent 804e1b1939
commit 0592ae65ee
5 changed files with 82 additions and 20 deletions

View file

@ -2633,12 +2633,28 @@ bool ObjectList::is_selected(const ItemType type) const
return false; 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() void ObjectList::update_selections()
{ {
const Selection& selection = wxGetApp().plater()->canvas3D()->get_selection(); const Selection& selection = wxGetApp().plater()->canvas3D()->get_selection();
wxDataViewItemArray sels; wxDataViewItemArray sels;
if (m_selection_mode & smSettings == 0) if ( ( m_selection_mode & (smSettings|smLayer|smLayerRoot) ) == 0)
m_selection_mode = smInstance; m_selection_mode = smInstance;
// We doesn't update selection if SettingsItem for the current object/part is selected // 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()) else if (selection.is_single_full_object() || selection.is_multiple_full_object())
{ {
const Selection::ObjectIdxsToInstanceIdxsMap& objects_content = selection.get_content(); 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); auto obj_idx = objects_content.begin()->first;
sels.Add(m_objects_model->GetSettingsItem(obj_item)); 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 { else {
for (const auto& object : objects_content) { for (const auto& object : objects_content) {
@ -3550,8 +3577,6 @@ void ObjectList::update_after_undo_redo()
unselect_objects();//this->UnselectAll(); unselect_objects();//this->UnselectAll();
m_objects_model->DeleteAll(); m_objects_model->DeleteAll();
// m_prevent_list_events = true;
size_t obj_idx = 0; size_t obj_idx = 0;
while (obj_idx < m_objects->size()) { while (obj_idx < m_objects->size()) {
add_object_to_list(obj_idx, false); add_object_to_list(obj_idx, false);
@ -3559,13 +3584,12 @@ void ObjectList::update_after_undo_redo()
} }
#ifndef __WXOSX__ #ifndef __WXOSX__
selection_changed(); // selection_changed();
#endif /* __WXOSX__ */ #endif /* __WXOSX__ */
update_selections(); update_selections();
m_prevent_canvas_selection_update = false; m_prevent_canvas_selection_update = false;
// m_prevent_list_events = false;
} }
ModelObject* ObjectList::object(const int obj_idx) const ModelObject* ObjectList::object(const int obj_idx) const

View file

@ -73,10 +73,14 @@ public:
smVolume = 1, smVolume = 1,
smInstance = 2, smInstance = 2,
smLayer = 4, smLayer = 4,
smSettings = 8, // used for undo/redo smSettings = 8, // used for undo/redo
} m_selection_mode {smUndef}; smLayerRoot = 16, // used for undo/redo
};
private: private:
SELECTION_MODE m_selection_mode {smUndef};
t_layer_height_range m_selected_layers_range;
struct dragged_item_data struct dragged_item_data
{ {
void init(const int obj_idx, const int subobj_idx, const ItemType type) { void init(const int obj_idx, const int subobj_idx, const ItemType type) {
@ -305,6 +309,8 @@ public:
void init_objects(); void init_objects();
bool multiple_selection() const ; bool multiple_selection() const ;
bool is_selected(const ItemType type) 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 set_selection_mode(SELECTION_MODE mode) { m_selection_mode = mode; }
void update_selections(); void update_selections();
void update_selections_on_canvas(); void update_selections_on_canvas();

View file

@ -3729,8 +3729,16 @@ void Plater::priv::take_snapshot(const std::string& snapshot_name)
snapshot_data.printer_technology = this->printer_technology; snapshot_data.printer_technology = this->printer_technology;
if (this->view3D->is_layers_editing_enabled()) if (this->view3D->is_layers_editing_enabled())
snapshot_data.flags |= UndoRedo::SnapshotData::VARIABLE_LAYER_EDITING_ACTIVE; snapshot_data.flags |= UndoRedo::SnapshotData::VARIABLE_LAYER_EDITING_ACTIVE;
if (this->sidebar->obj_list()->is_selected(itSettings)) if (this->sidebar->obj_list()->is_selected(itSettings)) {
snapshot_data.flags |= UndoRedo::SnapshotData::SETTINGS_SELECTED_ON_SIDEBAR; 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. //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. // 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) { if (this->printer_technology == ptFFF) {
@ -3797,10 +3805,22 @@ void Plater::priv::undo_redo_to(std::vector<UndoRedo::Snapshot>::const_iterator
top_snapshot_data.printer_technology = this->printer_technology; top_snapshot_data.printer_technology = this->printer_technology;
if (this->view3D->is_layers_editing_enabled()) if (this->view3D->is_layers_editing_enabled())
top_snapshot_data.flags |= UndoRedo::SnapshotData::VARIABLE_LAYER_EDITING_ACTIVE; top_snapshot_data.flags |= UndoRedo::SnapshotData::VARIABLE_LAYER_EDITING_ACTIVE;
if (this->sidebar->obj_list()->is_selected(itSettings)) if (this->sidebar->obj_list()->is_selected(itSettings)) {
top_snapshot_data.flags |= UndoRedo::SnapshotData::SETTINGS_SELECTED_ON_SIDEBAR; 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_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. // Disable layer editing before the Undo / Redo jump.
if (!new_variable_layer_editing_active && view3D->is_layers_editing_enabled()) 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")); 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<UndoRedo::Snapshot>::const_iterator
tab_print->update_dirty(); tab_print->update_dirty();
} }
} }
// set settings mode for ObjectList on sidebar // set selection mode for ObjectList on sidebar
if (new_settings_selected_on_sidebar) this->sidebar->obj_list()->set_selection_mode(new_selected_settings_on_sidebar ? ObjectList::SELECTION_MODE::smSettings :
this->sidebar->obj_list()->set_selection_mode(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); this->update_after_undo_redo(temp_snapshot_was_taken);
// Enable layer editing after the Undo / Redo jump. // Enable layer editing after the Undo / Redo jump.
if (! view3D->is_layers_editing_enabled() && this->layers_height_allowed() && new_variable_layer_editing_active) if (! view3D->is_layers_editing_enabled() && this->layers_height_allowed() && new_variable_layer_editing_active)

View file

@ -36,7 +36,7 @@
namespace Slic3r { namespace Slic3r {
namespace UndoRedo { namespace UndoRedo {
SnapshotData::SnapshotData() : printer_technology(ptUnknown), flags(0) SnapshotData::SnapshotData() : printer_technology(ptUnknown), flags(0), layer_range({0.0, 0.0})
{ {
} }

View file

@ -9,6 +9,9 @@
#include <libslic3r/ObjectID.hpp> #include <libslic3r/ObjectID.hpp>
typedef double coordf_t;
typedef std::pair<coordf_t, coordf_t> t_layer_height_range;
namespace Slic3r { namespace Slic3r {
class Model; class Model;
@ -38,8 +41,12 @@ struct SnapshotData
// Bitmask of various binary flags to be stored with the snapshot. // Bitmask of various binary flags to be stored with the snapshot.
enum Flags { enum Flags {
VARIABLE_LAYER_EDITING_ACTIVE = 1, 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 struct Snapshot