Adding a generic bitmap "flags" attrib to the Undo / Redo snapshot.
using this new "flags" attrib to store & recover the "Layers editing active" flag and restoring the "Layers editing" tool state.
This commit is contained in:
parent
4049f33609
commit
d9c325c7f0
@ -1641,17 +1641,7 @@ struct Plater::priv
|
|||||||
void split_volume();
|
void split_volume();
|
||||||
void scale_selection_to_fit_print_volume();
|
void scale_selection_to_fit_print_volume();
|
||||||
|
|
||||||
void take_snapshot(const std::string& snapshot_name)
|
void take_snapshot(const std::string& snapshot_name);
|
||||||
{
|
|
||||||
if (this->m_prevent_snapshots > 0)
|
|
||||||
return;
|
|
||||||
assert(this->m_prevent_snapshots >= 0);
|
|
||||||
this->undo_redo_stack.take_snapshot(snapshot_name, model, view3D->get_canvas3d()->get_selection(), view3D->get_canvas3d()->get_gizmos_manager(), this->printer_technology);
|
|
||||||
this->undo_redo_stack.release_least_recently_used();
|
|
||||||
// Save the last active preset name of a particular printer technology.
|
|
||||||
((this->printer_technology == ptFFF) ? m_last_fff_printer_profile_name : m_last_sla_printer_profile_name) = wxGetApp().preset_bundle->printers.get_selected_preset_name();
|
|
||||||
BOOST_LOG_TRIVIAL(info) << "Undo / Redo snapshot taken: " << snapshot_name << ", Undo / Redo stack memory: " << Slic3r::format_memsize_MB(this->undo_redo_stack.memsize()) << log_memory_info();
|
|
||||||
}
|
|
||||||
void take_snapshot(const wxString& snapshot_name) { this->take_snapshot(std::string(snapshot_name.ToUTF8().data())); }
|
void take_snapshot(const wxString& snapshot_name) { this->take_snapshot(std::string(snapshot_name.ToUTF8().data())); }
|
||||||
int get_active_snapshot_index();
|
int get_active_snapshot_index();
|
||||||
void undo();
|
void undo();
|
||||||
@ -3588,6 +3578,21 @@ int Plater::priv::get_active_snapshot_index()
|
|||||||
return it - ss_stack.begin();
|
return it - ss_stack.begin();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Plater::priv::take_snapshot(const std::string& snapshot_name)
|
||||||
|
{
|
||||||
|
if (this->m_prevent_snapshots > 0)
|
||||||
|
return;
|
||||||
|
assert(this->m_prevent_snapshots >= 0);
|
||||||
|
unsigned int flags = 0;
|
||||||
|
if (this->view3D->is_layers_editing_enabled())
|
||||||
|
flags |= UndoRedo::Snapshot::VARIABLE_LAYER_EDITING_ACTIVE;
|
||||||
|
this->undo_redo_stack.take_snapshot(snapshot_name, model, view3D->get_canvas3d()->get_selection(), view3D->get_canvas3d()->get_gizmos_manager(), this->printer_technology, flags);
|
||||||
|
this->undo_redo_stack.release_least_recently_used();
|
||||||
|
// Save the last active preset name of a particular printer technology.
|
||||||
|
((this->printer_technology == ptFFF) ? m_last_fff_printer_profile_name : m_last_sla_printer_profile_name) = wxGetApp().preset_bundle->printers.get_selected_preset_name();
|
||||||
|
BOOST_LOG_TRIVIAL(info) << "Undo / Redo snapshot taken: " << snapshot_name << ", Undo / Redo stack memory: " << Slic3r::format_memsize_MB(this->undo_redo_stack.memsize()) << log_memory_info();
|
||||||
|
}
|
||||||
|
|
||||||
void Plater::priv::undo()
|
void Plater::priv::undo()
|
||||||
{
|
{
|
||||||
const std::vector<UndoRedo::Snapshot> &snapshots = this->undo_redo_stack.snapshots();
|
const std::vector<UndoRedo::Snapshot> &snapshots = this->undo_redo_stack.snapshots();
|
||||||
@ -3627,9 +3632,18 @@ void Plater::priv::undo_redo_to(std::vector<UndoRedo::Snapshot>::const_iterator
|
|||||||
}
|
}
|
||||||
// Save the last active preset name of a particular printer technology.
|
// Save the last active preset name of a particular printer technology.
|
||||||
((this->printer_technology == ptFFF) ? m_last_fff_printer_profile_name : m_last_sla_printer_profile_name) = wxGetApp().preset_bundle->printers.get_selected_preset_name();
|
((this->printer_technology == ptFFF) ? m_last_fff_printer_profile_name : m_last_sla_printer_profile_name) = wxGetApp().preset_bundle->printers.get_selected_preset_name();
|
||||||
|
// Flags made of Snapshot::Flags enum values.
|
||||||
|
unsigned int new_flags = it_snapshot->flags;
|
||||||
|
unsigned int top_snapshot_flags = 0;
|
||||||
|
if (this->view3D->is_layers_editing_enabled())
|
||||||
|
top_snapshot_flags |= UndoRedo::Snapshot::VARIABLE_LAYER_EDITING_ACTIVE;
|
||||||
|
bool new_variable_layer_editing_active = (new_flags & UndoRedo::Snapshot::VARIABLE_LAYER_EDITING_ACTIVE) != 0;
|
||||||
|
// Disable layer editing before the Undo / Redo jump.
|
||||||
|
if (! new_variable_layer_editing_active && view3D->is_layers_editing_enabled())
|
||||||
|
view3D->enable_layers_editing(false);
|
||||||
// Do the jump in time.
|
// Do the jump in time.
|
||||||
if (it_snapshot->timestamp < this->undo_redo_stack.active_snapshot_time() ?
|
if (it_snapshot->timestamp < this->undo_redo_stack.active_snapshot_time() ?
|
||||||
this->undo_redo_stack.undo(model, this->view3D->get_canvas3d()->get_selection(), this->view3D->get_canvas3d()->get_gizmos_manager(), this->printer_technology, it_snapshot->timestamp) :
|
this->undo_redo_stack.undo(model, this->view3D->get_canvas3d()->get_selection(), this->view3D->get_canvas3d()->get_gizmos_manager(), this->printer_technology, top_snapshot_flags, it_snapshot->timestamp) :
|
||||||
this->undo_redo_stack.redo(model, this->view3D->get_canvas3d()->get_gizmos_manager(), it_snapshot->timestamp)) {
|
this->undo_redo_stack.redo(model, this->view3D->get_canvas3d()->get_gizmos_manager(), it_snapshot->timestamp)) {
|
||||||
if (printer_technology_changed) {
|
if (printer_technology_changed) {
|
||||||
// Switch to the other printer technology. Switch to the last printer active for that particular technology.
|
// Switch to the other printer technology. Switch to the last printer active for that particular technology.
|
||||||
@ -3641,6 +3655,9 @@ void Plater::priv::undo_redo_to(std::vector<UndoRedo::Snapshot>::const_iterator
|
|||||||
wxGetApp().load_current_presets();
|
wxGetApp().load_current_presets();
|
||||||
}
|
}
|
||||||
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.
|
||||||
|
if (! view3D->is_layers_editing_enabled() && this->layers_height_allowed() && new_variable_layer_editing_active)
|
||||||
|
view3D->enable_layers_editing(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -495,12 +495,12 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Store the current application state onto the Undo / Redo stack, remove all snapshots after m_active_snapshot_time.
|
// Store the current application state onto the Undo / Redo stack, remove all snapshots after m_active_snapshot_time.
|
||||||
void take_snapshot(const std::string& snapshot_name, const Slic3r::Model& model, const Slic3r::GUI::Selection& selection, const Slic3r::GUI::GLGizmosManager& gizmos, Slic3r::PrinterTechnology printer_technology);
|
void take_snapshot(const std::string& snapshot_name, const Slic3r::Model& model, const Slic3r::GUI::Selection& selection, const Slic3r::GUI::GLGizmosManager& gizmos, Slic3r::PrinterTechnology printer_technology, unsigned int flags);
|
||||||
void load_snapshot(size_t timestamp, Slic3r::Model& model, Slic3r::GUI::GLGizmosManager& gizmos);
|
void load_snapshot(size_t timestamp, Slic3r::Model& model, Slic3r::GUI::GLGizmosManager& gizmos);
|
||||||
|
|
||||||
bool has_undo_snapshot() const;
|
bool has_undo_snapshot() const;
|
||||||
bool has_redo_snapshot() const;
|
bool has_redo_snapshot() const;
|
||||||
bool undo(Slic3r::Model &model, const Slic3r::GUI::Selection &selection, Slic3r::GUI::GLGizmosManager &gizmos, PrinterTechnology printer_technology, size_t jump_to_time);
|
bool undo(Slic3r::Model &model, const Slic3r::GUI::Selection &selection, Slic3r::GUI::GLGizmosManager &gizmos, PrinterTechnology printer_technology, unsigned int flags, size_t jump_to_time);
|
||||||
bool redo(Slic3r::Model &model, Slic3r::GUI::GLGizmosManager &gizmos, size_t jump_to_time);
|
bool redo(Slic3r::Model &model, Slic3r::GUI::GLGizmosManager &gizmos, size_t jump_to_time);
|
||||||
void release_least_recently_used();
|
void release_least_recently_used();
|
||||||
|
|
||||||
@ -788,7 +788,7 @@ template<typename T, typename T_AS> void StackImpl::load_mutable_object(const Sl
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Store the current application state onto the Undo / Redo stack, remove all snapshots after m_active_snapshot_time.
|
// Store the current application state onto the Undo / Redo stack, remove all snapshots after m_active_snapshot_time.
|
||||||
void StackImpl::take_snapshot(const std::string& snapshot_name, const Slic3r::Model& model, const Slic3r::GUI::Selection& selection, const Slic3r::GUI::GLGizmosManager& gizmos, Slic3r::PrinterTechnology printer_technology)
|
void StackImpl::take_snapshot(const std::string& snapshot_name, const Slic3r::Model& model, const Slic3r::GUI::Selection& selection, const Slic3r::GUI::GLGizmosManager& gizmos, Slic3r::PrinterTechnology printer_technology, unsigned int flags)
|
||||||
{
|
{
|
||||||
// Release old snapshot data.
|
// Release old snapshot data.
|
||||||
assert(m_active_snapshot_time <= m_current_time);
|
assert(m_active_snapshot_time <= m_current_time);
|
||||||
@ -808,11 +808,11 @@ void StackImpl::take_snapshot(const std::string& snapshot_name, const Slic3r::Mo
|
|||||||
this->save_mutable_object<Selection, Selection>(m_selection);
|
this->save_mutable_object<Selection, Selection>(m_selection);
|
||||||
this->save_mutable_object<Slic3r::GUI::GLGizmosManager, Slic3r::GUI::GLGizmosManager>(gizmos);
|
this->save_mutable_object<Slic3r::GUI::GLGizmosManager, Slic3r::GUI::GLGizmosManager>(gizmos);
|
||||||
// Save the snapshot info.
|
// Save the snapshot info.
|
||||||
m_snapshots.emplace_back(snapshot_name, m_current_time ++, model.id().id, printer_technology);
|
m_snapshots.emplace_back(snapshot_name, m_current_time ++, model.id().id, printer_technology, flags);
|
||||||
m_active_snapshot_time = m_current_time;
|
m_active_snapshot_time = m_current_time;
|
||||||
// Save snapshot info of the last "current" aka "top most" state, that is only being serialized
|
// Save snapshot info of the last "current" aka "top most" state, that is only being serialized
|
||||||
// if undoing an action. Such a snapshot has an invalid Model ID assigned if it was not taken yet.
|
// if undoing an action. Such a snapshot has an invalid Model ID assigned if it was not taken yet.
|
||||||
m_snapshots.emplace_back(topmost_snapshot_name, m_active_snapshot_time, 0, printer_technology);
|
m_snapshots.emplace_back(topmost_snapshot_name, m_active_snapshot_time, 0, printer_technology, flags);
|
||||||
// Release empty objects from the history.
|
// Release empty objects from the history.
|
||||||
this->collect_garbage();
|
this->collect_garbage();
|
||||||
assert(this->valid());
|
assert(this->valid());
|
||||||
@ -858,7 +858,7 @@ bool StackImpl::has_redo_snapshot() const
|
|||||||
return ++ it != m_snapshots.end();
|
return ++ it != m_snapshots.end();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool StackImpl::undo(Slic3r::Model &model, const Slic3r::GUI::Selection &selection, Slic3r::GUI::GLGizmosManager &gizmos, PrinterTechnology printer_technology, size_t time_to_load)
|
bool StackImpl::undo(Slic3r::Model &model, const Slic3r::GUI::Selection &selection, Slic3r::GUI::GLGizmosManager &gizmos, PrinterTechnology printer_technology, unsigned int flags, size_t time_to_load)
|
||||||
{
|
{
|
||||||
assert(this->valid());
|
assert(this->valid());
|
||||||
if (time_to_load == SIZE_MAX) {
|
if (time_to_load == SIZE_MAX) {
|
||||||
@ -872,7 +872,7 @@ bool StackImpl::undo(Slic3r::Model &model, const Slic3r::GUI::Selection &selecti
|
|||||||
bool new_snapshot_taken = false;
|
bool new_snapshot_taken = false;
|
||||||
if (m_active_snapshot_time == m_snapshots.back().timestamp && ! m_snapshots.back().is_topmost_captured()) {
|
if (m_active_snapshot_time == m_snapshots.back().timestamp && ! m_snapshots.back().is_topmost_captured()) {
|
||||||
// The current state is temporary. The current state needs to be captured to be redoable.
|
// The current state is temporary. The current state needs to be captured to be redoable.
|
||||||
this->take_snapshot(topmost_snapshot_name, model, selection, gizmos, printer_technology);
|
this->take_snapshot(topmost_snapshot_name, model, selection, gizmos, printer_technology, flags);
|
||||||
// The line above entered another topmost_snapshot_name.
|
// The line above entered another topmost_snapshot_name.
|
||||||
assert(m_snapshots.back().is_topmost());
|
assert(m_snapshots.back().is_topmost());
|
||||||
assert(! m_snapshots.back().is_topmost_captured());
|
assert(! m_snapshots.back().is_topmost_captured());
|
||||||
@ -1020,12 +1020,12 @@ Stack::~Stack() {}
|
|||||||
void Stack::set_memory_limit(size_t memsize) { pimpl->set_memory_limit(memsize); }
|
void Stack::set_memory_limit(size_t memsize) { pimpl->set_memory_limit(memsize); }
|
||||||
size_t Stack::memsize() const { return pimpl->memsize(); }
|
size_t Stack::memsize() const { return pimpl->memsize(); }
|
||||||
void Stack::release_least_recently_used() { pimpl->release_least_recently_used(); }
|
void Stack::release_least_recently_used() { pimpl->release_least_recently_used(); }
|
||||||
void Stack::take_snapshot(const std::string& snapshot_name, const Slic3r::Model& model, const Slic3r::GUI::Selection& selection, const Slic3r::GUI::GLGizmosManager& gizmos, Slic3r::PrinterTechnology printer_technology)
|
void Stack::take_snapshot(const std::string& snapshot_name, const Slic3r::Model& model, const Slic3r::GUI::Selection& selection, const Slic3r::GUI::GLGizmosManager& gizmos, Slic3r::PrinterTechnology printer_technology, unsigned int flags)
|
||||||
{ pimpl->take_snapshot(snapshot_name, model, selection, gizmos, printer_technology); }
|
{ pimpl->take_snapshot(snapshot_name, model, selection, gizmos, printer_technology, flags); }
|
||||||
bool Stack::has_undo_snapshot() const { return pimpl->has_undo_snapshot(); }
|
bool Stack::has_undo_snapshot() const { return pimpl->has_undo_snapshot(); }
|
||||||
bool Stack::has_redo_snapshot() const { return pimpl->has_redo_snapshot(); }
|
bool Stack::has_redo_snapshot() const { return pimpl->has_redo_snapshot(); }
|
||||||
bool Stack::undo(Slic3r::Model& model, const Slic3r::GUI::Selection& selection, Slic3r::GUI::GLGizmosManager& gizmos, PrinterTechnology printer_technology, size_t time_to_load)
|
bool Stack::undo(Slic3r::Model& model, const Slic3r::GUI::Selection& selection, Slic3r::GUI::GLGizmosManager& gizmos, PrinterTechnology printer_technology, unsigned int flags, size_t time_to_load)
|
||||||
{ return pimpl->undo(model, selection, gizmos, printer_technology, time_to_load); }
|
{ return pimpl->undo(model, selection, gizmos, printer_technology, flags, time_to_load); }
|
||||||
bool Stack::redo(Slic3r::Model& model, Slic3r::GUI::GLGizmosManager& gizmos, size_t time_to_load) { return pimpl->redo(model, gizmos, time_to_load); }
|
bool Stack::redo(Slic3r::Model& model, Slic3r::GUI::GLGizmosManager& gizmos, size_t time_to_load) { return pimpl->redo(model, gizmos, time_to_load); }
|
||||||
const Selection& Stack::selection_deserialized() const { return pimpl->selection_deserialized(); }
|
const Selection& Stack::selection_deserialized() const { return pimpl->selection_deserialized(); }
|
||||||
|
|
||||||
|
@ -24,13 +24,20 @@ namespace UndoRedo {
|
|||||||
struct Snapshot
|
struct Snapshot
|
||||||
{
|
{
|
||||||
Snapshot(size_t timestamp) : timestamp(timestamp) {}
|
Snapshot(size_t timestamp) : timestamp(timestamp) {}
|
||||||
Snapshot(const std::string &name, size_t timestamp, size_t model_id, Slic3r::PrinterTechnology printer_technology) :
|
Snapshot(const std::string &name, size_t timestamp, size_t model_id, Slic3r::PrinterTechnology printer_technology, unsigned int flags) :
|
||||||
name(name), timestamp(timestamp), model_id(model_id), printer_technology(printer_technology) {}
|
name(name), timestamp(timestamp), model_id(model_id), printer_technology(printer_technology), flags(flags) {}
|
||||||
|
|
||||||
|
// Bitmask of various binary flags to be stored with the snapshot.
|
||||||
|
enum Flags {
|
||||||
|
VARIABLE_LAYER_EDITING_ACTIVE = 1,
|
||||||
|
};
|
||||||
|
|
||||||
std::string name;
|
std::string name;
|
||||||
size_t timestamp;
|
size_t timestamp;
|
||||||
size_t model_id;
|
size_t model_id;
|
||||||
PrinterTechnology printer_technology;
|
PrinterTechnology printer_technology;
|
||||||
|
// Bitmap of Flags (see the Flags enum).
|
||||||
|
unsigned int flags;
|
||||||
|
|
||||||
bool operator< (const Snapshot &rhs) const { return this->timestamp < rhs.timestamp; }
|
bool operator< (const Snapshot &rhs) const { return this->timestamp < rhs.timestamp; }
|
||||||
bool operator==(const Snapshot &rhs) const { return this->timestamp == rhs.timestamp; }
|
bool operator==(const Snapshot &rhs) const { return this->timestamp == rhs.timestamp; }
|
||||||
@ -69,7 +76,7 @@ public:
|
|||||||
void release_least_recently_used();
|
void release_least_recently_used();
|
||||||
|
|
||||||
// Store the current application state onto the Undo / Redo stack, remove all snapshots after m_active_snapshot_time.
|
// Store the current application state onto the Undo / Redo stack, remove all snapshots after m_active_snapshot_time.
|
||||||
void take_snapshot(const std::string& snapshot_name, const Slic3r::Model& model, const Slic3r::GUI::Selection& selection, const Slic3r::GUI::GLGizmosManager& gizmos, Slic3r::PrinterTechnology printer_technology);
|
void take_snapshot(const std::string& snapshot_name, const Slic3r::Model& model, const Slic3r::GUI::Selection& selection, const Slic3r::GUI::GLGizmosManager& gizmos, Slic3r::PrinterTechnology printer_technology, unsigned int flags);
|
||||||
|
|
||||||
// To be queried to enable / disable the Undo / Redo buttons at the UI.
|
// To be queried to enable / disable the Undo / Redo buttons at the UI.
|
||||||
bool has_undo_snapshot() const;
|
bool has_undo_snapshot() const;
|
||||||
@ -77,7 +84,7 @@ public:
|
|||||||
|
|
||||||
// Roll back the time. If time_to_load is SIZE_MAX, the previous snapshot is activated.
|
// Roll back the time. If time_to_load is SIZE_MAX, the previous snapshot is activated.
|
||||||
// Undoing an action may need to take a snapshot of the current application state, so that redo to the current state is possible.
|
// Undoing an action may need to take a snapshot of the current application state, so that redo to the current state is possible.
|
||||||
bool undo(Slic3r::Model& model, const Slic3r::GUI::Selection& selection, Slic3r::GUI::GLGizmosManager& gizmos, PrinterTechnology printer_technology, size_t time_to_load = SIZE_MAX);
|
bool undo(Slic3r::Model& model, const Slic3r::GUI::Selection& selection, Slic3r::GUI::GLGizmosManager& gizmos, PrinterTechnology printer_technology, unsigned int flags, size_t time_to_load = SIZE_MAX);
|
||||||
|
|
||||||
// Jump forward in time. If time_to_load is SIZE_MAX, the next snapshot is activated.
|
// Jump forward in time. If time_to_load is SIZE_MAX, the next snapshot is activated.
|
||||||
bool redo(Slic3r::Model& model, Slic3r::GUI::GLGizmosManager& gizmos, size_t time_to_load = SIZE_MAX);
|
bool redo(Slic3r::Model& model, Slic3r::GUI::GLGizmosManager& gizmos, size_t time_to_load = SIZE_MAX);
|
||||||
|
Loading…
Reference in New Issue
Block a user