mirror of
				https://github.com/subsurface/subsurface.git
				synced 2025-02-19 22:16:15 +00:00 
			
		
		
		
	undo: autogenerate trivial set() and data() functions by a template
Some dive-editing undo commands have trivial setter and getter functions: they simply read and write a struct dive member. Autogenerate these in a template to which we pass a pointer to member as template argument. For the invalid-flag we have to turn the edit command from int to bool, since that is how the flag is store in the dive struct. Sadly, quite a number of the setters do funky things and we cannot autogenerate them. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
		
							parent
							
								
									ad540ce5e8
								
							
						
					
					
						commit
						ea813938a8
					
				
					 2 changed files with 38 additions and 99 deletions
				
			
		|  | @ -26,6 +26,18 @@ DiveField EditTagsTemplate<ID>::fieldId() const | |||
| 	return ID; | ||||
| } | ||||
| 
 | ||||
| template <typename T, DiveField::Flags ID, T dive::*PTR> | ||||
| void EditDefaultSetter<T, ID, PTR>::set(struct dive *d, T v) const | ||||
| { | ||||
| 	d->*PTR = v; | ||||
| } | ||||
| 
 | ||||
| template <typename T, DiveField::Flags ID, T dive::*PTR> | ||||
| T EditDefaultSetter<T, ID, PTR>::data(struct dive *d) const | ||||
| { | ||||
| 	return d->*PTR; | ||||
| } | ||||
| 
 | ||||
| static std::vector<dive *> getDives(bool currentDiveOnly) | ||||
| { | ||||
| 	if (currentDiveOnly) | ||||
|  | @ -147,6 +159,8 @@ EditBase<QString>::EditBase(QString newValue, bool currentDiveOnly); | |||
| template | ||||
| EditBase<int>::EditBase(int newValue, bool currentDiveOnly); | ||||
| template | ||||
| EditBase<bool>::EditBase(bool newValue, bool currentDiveOnly); | ||||
| template | ||||
| EditBase<struct dive_site *>::EditBase(struct dive_site *newValue, bool currentDiveOnly); | ||||
| 
 | ||||
| // Undo and redo do the same as just the stored value is exchanged
 | ||||
|  | @ -196,96 +210,36 @@ QString EditSuit::fieldName() const | |||
| } | ||||
| 
 | ||||
| // ***** Rating *****
 | ||||
| void EditRating::set(struct dive *d, int value) const | ||||
| { | ||||
| 	d->rating = value; | ||||
| } | ||||
| 
 | ||||
| int EditRating::data(struct dive *d) const | ||||
| { | ||||
| 	return d->rating; | ||||
| } | ||||
| 
 | ||||
| QString EditRating::fieldName() const | ||||
| { | ||||
| 	return Command::Base::tr("rating"); | ||||
| } | ||||
| 
 | ||||
| // ***** Visibility *****
 | ||||
| void EditVisibility::set(struct dive *d, int value) const | ||||
| { | ||||
| 	d->visibility = value; | ||||
| } | ||||
| 
 | ||||
| int EditVisibility::data(struct dive *d) const | ||||
| { | ||||
| 	return d->visibility; | ||||
| } | ||||
| 
 | ||||
| QString EditVisibility::fieldName() const | ||||
| { | ||||
| 	return Command::Base::tr("visibility"); | ||||
| } | ||||
| 
 | ||||
| // ***** WaveSize *****
 | ||||
| void EditWaveSize::set(struct dive *d, int value) const | ||||
| { | ||||
| 	d->wavesize = value; | ||||
| } | ||||
| 
 | ||||
| int EditWaveSize::data(struct dive *d) const | ||||
| { | ||||
| 	return d->wavesize; | ||||
| } | ||||
| 
 | ||||
| QString EditWaveSize::fieldName() const | ||||
| { | ||||
| 	return Command::Base::tr("wavesize"); | ||||
| } | ||||
| 
 | ||||
| // ***** Current *****
 | ||||
| void EditCurrent::set(struct dive *d, int value) const | ||||
| { | ||||
| 	d->current = value; | ||||
| } | ||||
| 
 | ||||
| int EditCurrent::data(struct dive *d) const | ||||
| { | ||||
| 	return d->current; | ||||
| } | ||||
| 
 | ||||
| QString EditCurrent::fieldName() const | ||||
| { | ||||
| 	return Command::Base::tr("current"); | ||||
| } | ||||
| 
 | ||||
| // ***** Surge *****
 | ||||
| void EditSurge::set(struct dive *d, int value) const | ||||
| { | ||||
| 	d->surge = value; | ||||
| } | ||||
| 
 | ||||
| int EditSurge::data(struct dive *d) const | ||||
| { | ||||
| 	return d->surge; | ||||
| } | ||||
| 
 | ||||
| QString EditSurge::fieldName() const | ||||
| { | ||||
| 	return Command::Base::tr("surge"); | ||||
| } | ||||
| 
 | ||||
| // ***** Chill *****
 | ||||
| void EditChill::set(struct dive *d, int value) const | ||||
| { | ||||
| 	d->chill = value; | ||||
| } | ||||
| 
 | ||||
| int EditChill::data(struct dive *d) const | ||||
| { | ||||
| 	return d->chill; | ||||
| } | ||||
| 
 | ||||
| QString EditChill::fieldName() const | ||||
| { | ||||
| 	return Command::Base::tr("chill"); | ||||
|  | @ -507,16 +461,6 @@ QString EditMode::fieldName() const | |||
| } | ||||
| 
 | ||||
| // ***** Invalid *****
 | ||||
| void EditInvalid::set(struct dive *d, int invalid) const | ||||
| { | ||||
| 	d->invalid = invalid; | ||||
| } | ||||
| 
 | ||||
| int EditInvalid::data(struct dive *d) const | ||||
| { | ||||
| 	return d->invalid; | ||||
| } | ||||
| 
 | ||||
| QString EditInvalid::fieldName() const | ||||
| { | ||||
| 	return Command::Base::tr("invalid"); | ||||
|  |  | |||
|  | @ -74,6 +74,16 @@ private: | |||
| 	DiveField fieldId() const override final;	// final prevents further overriding - then just don't use this template
 | ||||
| }; | ||||
| 
 | ||||
| // Automatically generate getter and setter in the case of simple assignments.
 | ||||
| // The third parameter is a pointer to a member of the dive structure.
 | ||||
| template <typename T, DiveField::Flags ID, T dive::*PTR> | ||||
| class EditDefaultSetter : public EditTemplate<T, ID> { | ||||
| private: | ||||
| 	using EditTemplate<T, ID>::EditTemplate; | ||||
| 	void set(struct dive *d, T) const override final;	// final prevents further overriding - then just don't use this template
 | ||||
| 	T data(struct dive *d) const override final;	// final prevents further overriding - then just don't use this template
 | ||||
| }; | ||||
| 
 | ||||
| class EditNotes : public EditTemplate<QString, DiveField::NOTES> { | ||||
| public: | ||||
| 	using EditTemplate::EditTemplate;	// Use constructor of base class.
 | ||||
|  | @ -90,52 +100,39 @@ public: | |||
| 	QString fieldName() const override; | ||||
| }; | ||||
| 
 | ||||
| class EditRating : public EditTemplate<int, DiveField::RATING> { | ||||
| class EditRating : public EditDefaultSetter<int, DiveField::RATING, &dive::rating> { | ||||
| public: | ||||
| 	using EditTemplate::EditTemplate;	// Use constructor of base class.
 | ||||
| 	void set(struct dive *d, int value) const override; | ||||
| 	int data(struct dive *d) const override; | ||||
| 	using EditDefaultSetter::EditDefaultSetter;	// Use constructor of base class.
 | ||||
| 	QString fieldName() const override; | ||||
| }; | ||||
| 
 | ||||
| class EditVisibility : public EditTemplate<int, DiveField::VISIBILITY> { | ||||
| class EditVisibility : public EditDefaultSetter<int, DiveField::VISIBILITY, &dive::visibility> { | ||||
| public: | ||||
| 	using EditTemplate::EditTemplate;	// Use constructor of base class.
 | ||||
| 	void set(struct dive *d, int value) const override; | ||||
| 	int data(struct dive *d) const override; | ||||
| 	using EditDefaultSetter::EditDefaultSetter;	// Use constructor of base class.
 | ||||
| 	QString fieldName() const override; | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| class EditWaveSize : public EditTemplate<int, DiveField::WAVESIZE> { | ||||
| class EditWaveSize : public EditDefaultSetter<int, DiveField::WAVESIZE, &dive::wavesize> { | ||||
| public: | ||||
| 	using EditTemplate::EditTemplate;	// Use constructor of base class.
 | ||||
| 	void set(struct dive *d, int value) const override; | ||||
| 	int data(struct dive *d) const override; | ||||
| 	using EditDefaultSetter::EditDefaultSetter;	// Use constructor of base class.
 | ||||
| 	QString fieldName() const override; | ||||
| }; | ||||
| 
 | ||||
| class EditCurrent : public EditTemplate<int, DiveField::CURRENT> { | ||||
| class EditCurrent : public EditDefaultSetter<int, DiveField::CURRENT, &dive::current> { | ||||
| public: | ||||
| 	using EditTemplate::EditTemplate;	// Use constructor of base class.
 | ||||
| 	void set(struct dive *d, int value) const override; | ||||
| 	int data(struct dive *d) const override; | ||||
| 	using EditDefaultSetter::EditDefaultSetter;	// Use constructor of base class.
 | ||||
| 	QString fieldName() const override; | ||||
| }; | ||||
| 
 | ||||
| class EditSurge : public EditTemplate<int, DiveField::SURGE> { | ||||
| class EditSurge : public EditDefaultSetter<int, DiveField::SURGE, &dive::surge> { | ||||
| public: | ||||
| 	using EditTemplate::EditTemplate;	// Use constructor of base class.
 | ||||
| 	void set(struct dive *d, int value) const override; | ||||
| 	int data(struct dive *d) const override; | ||||
| 	using EditDefaultSetter::EditDefaultSetter;	// Use constructor of base class.
 | ||||
| 	QString fieldName() const override; | ||||
| }; | ||||
| 
 | ||||
| class EditChill : public EditTemplate<int, DiveField::CHILL> { | ||||
| class EditChill : public EditDefaultSetter<int, DiveField::CHILL, &dive::chill> { | ||||
| public: | ||||
| 	using EditTemplate::EditTemplate;	// Use constructor of base class.
 | ||||
| 	void set(struct dive *d, int value) const override; | ||||
| 	int data(struct dive *d) const override; | ||||
| 	using EditDefaultSetter::EditDefaultSetter;	// Use constructor of base class.
 | ||||
| 	QString fieldName() const override; | ||||
| }; | ||||
| 
 | ||||
|  | @ -219,11 +216,9 @@ public: | |||
| 	QString fieldName() const override; | ||||
| }; | ||||
| 
 | ||||
| class EditInvalid : public EditTemplate<int, DiveField::INVALID> { | ||||
| class EditInvalid : public EditDefaultSetter<bool, DiveField::INVALID, &dive::invalid> { | ||||
| public: | ||||
| 	using EditTemplate::EditTemplate;	// Use constructor of base class.
 | ||||
| 	void set(struct dive *d, int number) const override; | ||||
| 	int data(struct dive *d) const override; | ||||
| 	using EditDefaultSetter::EditDefaultSetter;	// Use constructor of base class.
 | ||||
| 	QString fieldName() const override; | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue