mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-30 12:11:15 -06:00 
			
		
		
		
	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
					
				
					 3 changed files with 51 additions and 27 deletions
				
			
		|  | @ -1641,17 +1641,7 @@ struct Plater::priv | |||
|     void split_volume(); | ||||
|     void scale_selection_to_fit_print_volume(); | ||||
| 
 | ||||
| 	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 std::string& snapshot_name); | ||||
| 	void take_snapshot(const wxString& snapshot_name) { this->take_snapshot(std::string(snapshot_name.ToUTF8().data())); } | ||||
|     int  get_active_snapshot_index(); | ||||
|     void undo(); | ||||
|  | @ -3588,6 +3578,21 @@ int Plater::priv::get_active_snapshot_index() | |||
|     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() | ||||
| { | ||||
| 	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.
 | ||||
|     ((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.
 | ||||
|     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)) { | ||||
| 		if (printer_technology_changed) { | ||||
| 			// 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(); | ||||
|         } | ||||
| 		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.
 | ||||
|     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); | ||||
| 
 | ||||
| 	bool has_undo_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); | ||||
| 	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.
 | ||||
| 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.
 | ||||
| 	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<Slic3r::GUI::GLGizmosManager, Slic3r::GUI::GLGizmosManager>(gizmos); | ||||
|     // 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; | ||||
| 	// 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.
 | ||||
| 	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.
 | ||||
| 	this->collect_garbage(); | ||||
| 	assert(this->valid()); | ||||
|  | @ -858,7 +858,7 @@ bool StackImpl::has_redo_snapshot() const | |||
| 	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()); | ||||
| 	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; | ||||
| 	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.
 | ||||
|         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.
 | ||||
| 		assert(m_snapshots.back().is_topmost()); | ||||
| 		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); } | ||||
| size_t Stack::memsize() const { return pimpl->memsize(); } | ||||
| 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) | ||||
| 	{ pimpl->take_snapshot(snapshot_name, model, selection, gizmos, 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, flags); } | ||||
| bool Stack::has_undo_snapshot() const { return pimpl->has_undo_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)  | ||||
| 	{ return pimpl->undo(model, selection, gizmos, printer_technology, 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, 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); } | ||||
| const Selection& Stack::selection_deserialized() const { return pimpl->selection_deserialized(); } | ||||
| 
 | ||||
|  |  | |||
|  | @ -24,13 +24,20 @@ namespace UndoRedo { | |||
| struct Snapshot | ||||
| { | ||||
| 	Snapshot(size_t timestamp) : timestamp(timestamp) {} | ||||
| 	Snapshot(const std::string &name, size_t timestamp, size_t model_id, Slic3r::PrinterTechnology printer_technology) : | ||||
| 		name(name), timestamp(timestamp), model_id(model_id), printer_technology(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), flags(flags) {} | ||||
| 
 | ||||
| 	// Bitmask of various binary flags to be stored with the snapshot.
 | ||||
| 	enum Flags { | ||||
| 		VARIABLE_LAYER_EDITING_ACTIVE = 1, | ||||
| 	}; | ||||
| 	 | ||||
| 	std::string 		name; | ||||
| 	size_t 				timestamp; | ||||
| 	size_t 				model_id; | ||||
| 	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; } | ||||
|  | @ -69,7 +76,7 @@ public: | |||
| 	void release_least_recently_used(); | ||||
| 
 | ||||
| 	// 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.
 | ||||
| 	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.
 | ||||
| 	// 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.
 | ||||
|     bool redo(Slic3r::Model& model, Slic3r::GUI::GLGizmosManager& gizmos, size_t time_to_load = SIZE_MAX); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 bubnikv
						bubnikv