mirror of
				https://github.com/subsurface/subsurface.git
				synced 2025-02-19 22:16:15 +00:00 
			
		
		
		
	undo: split out EventBase class
All event-based commands will work on a dive computer and need to replot the profile, etc. Therefore, in analogy to the dive-list commands create a base class with two virtual functions undoit() and redoit() that must be defined in the derived classes that do the actual work. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
		
							parent
							
								
									1971cfad54
								
							
						
					
					
						commit
						f9fe6d759f
					
				
					 2 changed files with 37 additions and 13 deletions
				
			
		|  | @ -8,8 +8,27 @@ | |||
| 
 | ||||
| namespace Command { | ||||
| 
 | ||||
| AddEventBase::AddEventBase(struct dive *dIn, int dcNrIn, struct event *ev) : | ||||
| 	d(dIn), dcNr(dcNrIn), eventToAdd(ev) | ||||
| EventBase::EventBase(struct dive *dIn, int dcNrIn) : | ||||
| 	d(dIn), dcNr(dcNrIn) | ||||
| { | ||||
| } | ||||
| 
 | ||||
| void EventBase::redo() | ||||
| { | ||||
| 	redoit(); // Call actual function in base class
 | ||||
| 	invalidate_dive_cache(d); | ||||
| 	emit diveListNotifier.eventsChanged(d); | ||||
| } | ||||
| 
 | ||||
| void EventBase::undo() | ||||
| { | ||||
| 	undoit(); // Call actual function in base class
 | ||||
| 	invalidate_dive_cache(d); | ||||
| 	emit diveListNotifier.eventsChanged(d); | ||||
| } | ||||
| 
 | ||||
| AddEventBase::AddEventBase(struct dive *d, int dcNr, struct event *ev) : EventBase(d, dcNr), | ||||
| 	eventToAdd(ev) | ||||
| { | ||||
| } | ||||
| 
 | ||||
|  | @ -18,23 +37,19 @@ bool AddEventBase::workToBeDone() | |||
| 	return true; | ||||
| } | ||||
| 
 | ||||
| void AddEventBase::redo() | ||||
| void AddEventBase::redoit() | ||||
| { | ||||
| 	struct divecomputer *dc = get_dive_dc(d, dcNr); | ||||
| 	eventToRemove = eventToAdd.get(); | ||||
| 	add_event_to_dc(dc, eventToAdd.release()); // return ownership to backend
 | ||||
| 	invalidate_dive_cache(d); | ||||
| 	emit diveListNotifier.eventsChanged(d); | ||||
| } | ||||
| 
 | ||||
| void AddEventBase::undo() | ||||
| void AddEventBase::undoit() | ||||
| { | ||||
| 	struct divecomputer *dc = get_dive_dc(d, dcNr); | ||||
| 	remove_event_from_dc(dc, eventToRemove); | ||||
| 	eventToAdd.reset(eventToRemove); // take ownership of event
 | ||||
| 	eventToRemove = nullptr; | ||||
| 	invalidate_dive_cache(d); | ||||
| 	emit diveListNotifier.eventsChanged(d); | ||||
| } | ||||
| 
 | ||||
| AddEventBookmark::AddEventBookmark(struct dive *d, int dcNr, int seconds) : | ||||
|  |  | |||
|  | @ -16,19 +16,28 @@ namespace Command { | |||
| // Therefore, the undo commands work on events as they do with dives: using
 | ||||
| // owning pointers. See comments in command_base.h
 | ||||
| 
 | ||||
| class AddEventBase : public Base { | ||||
| public: | ||||
| 	AddEventBase(struct dive *d, int dcNr, struct event *ev); // Takes ownership of event!
 | ||||
| private: | ||||
| 	bool workToBeDone() override; | ||||
| class EventBase : public Base { | ||||
| protected: | ||||
| 	EventBase(struct dive *d, int dcNr); | ||||
| 	void undo() override; | ||||
| 	void redo() override; | ||||
| 	virtual void redoit() = 0; | ||||
| 	virtual void undoit() = 0; | ||||
| 
 | ||||
| 	// Note: we store dive and the divecomputer-number instead of a pointer to the divecomputer.
 | ||||
| 	// Since one divecomputer is integrated into the dive structure, pointers to divecomputers
 | ||||
| 	// are probably not stable.
 | ||||
| 	struct dive *d; | ||||
| 	int dcNr; | ||||
| }; | ||||
| 
 | ||||
| class AddEventBase : public EventBase { | ||||
| public: | ||||
| 	AddEventBase(struct dive *d, int dcNr, struct event *ev); // Takes ownership of event!
 | ||||
| private: | ||||
| 	bool workToBeDone() override; | ||||
| 	void undoit() override; | ||||
| 	void redoit() override; | ||||
| 
 | ||||
| 	OwningEventPtr eventToAdd;	// for redo
 | ||||
| 	event *eventToRemove;		// for undo
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue