mirror of
				https://github.com/subsurface/subsurface.git
				synced 2025-02-19 22:16:15 +00:00 
			
		
		
		
	Dive site: replace displayed_dive_site by pointer
In the dive-site-edit widget, a copy of the current dive site was used to store the old (pre-edit) data. This is not necessary, since we can simply access the data in the original dive site. Thus, replace the subobject by a simple pointer. This is part of a series to replace dive-site uuids by pointers. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
		
							parent
							
								
									a823974b70
								
							
						
					
					
						commit
						11a211fb02
					
				
					 2 changed files with 54 additions and 49 deletions
				
			
		| 
						 | 
					@ -17,9 +17,8 @@
 | 
				
			||||||
#include <QDesktopWidget>
 | 
					#include <QDesktopWidget>
 | 
				
			||||||
#include <QScrollBar>
 | 
					#include <QScrollBar>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LocationInformationWidget::LocationInformationWidget(QWidget *parent) : QGroupBox(parent), modified(false)
 | 
					LocationInformationWidget::LocationInformationWidget(QWidget *parent) : QGroupBox(parent), modified(false), diveSite(nullptr)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	memset(&displayed_dive_site, 0, sizeof(displayed_dive_site));
 | 
					 | 
				
			||||||
	memset(&taxonomy, 0, sizeof(taxonomy));
 | 
						memset(&taxonomy, 0, sizeof(taxonomy));
 | 
				
			||||||
	ui.setupUi(this);
 | 
						ui.setupUi(this);
 | 
				
			||||||
	ui.diveSiteMessage->setCloseButtonVisible(false);
 | 
						ui.diveSiteMessage->setCloseButtonVisible(false);
 | 
				
			||||||
| 
						 | 
					@ -73,6 +72,8 @@ void LocationInformationWidget::enableLocationButtons(bool enable)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void LocationInformationWidget::mergeSelectedDiveSites()
 | 
					void LocationInformationWidget::mergeSelectedDiveSites()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						if (!diveSite)
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
	if (QMessageBox::warning(MainWindow::instance(), tr("Merging dive sites"),
 | 
						if (QMessageBox::warning(MainWindow::instance(), tr("Merging dive sites"),
 | 
				
			||||||
				 tr("You are about to merge dive sites, you can't undo that action \n Are you sure you want to continue?"),
 | 
									 tr("You are about to merge dive sites, you can't undo that action \n Are you sure you want to continue?"),
 | 
				
			||||||
				 QMessageBox::Ok, QMessageBox::Cancel) != QMessageBox::Ok)
 | 
									 QMessageBox::Ok, QMessageBox::Cancel) != QMessageBox::Ok)
 | 
				
			||||||
| 
						 | 
					@ -85,7 +86,7 @@ void LocationInformationWidget::mergeSelectedDiveSites()
 | 
				
			||||||
		selected_dive_sites[i] = (uint32_t)idx.data(LocationInformationModel::UUID_ROLE).toInt();
 | 
							selected_dive_sites[i] = (uint32_t)idx.data(LocationInformationModel::UUID_ROLE).toInt();
 | 
				
			||||||
		i++;
 | 
							i++;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	merge_dive_sites(displayed_dive_site.uuid, selected_dive_sites, i);
 | 
						merge_dive_sites(diveSite->uuid, selected_dive_sites, i);
 | 
				
			||||||
	LocationInformationModel::instance()->update();
 | 
						LocationInformationModel::instance()->update();
 | 
				
			||||||
	QSortFilterProxyModel *m = (QSortFilterProxyModel *)ui.diveSiteListView->model();
 | 
						QSortFilterProxyModel *m = (QSortFilterProxyModel *)ui.diveSiteListView->model();
 | 
				
			||||||
	m->invalidate();
 | 
						m->invalidate();
 | 
				
			||||||
| 
						 | 
					@ -94,8 +95,12 @@ void LocationInformationWidget::mergeSelectedDiveSites()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void LocationInformationWidget::updateLabels()
 | 
					void LocationInformationWidget::updateLabels()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (displayed_dive_site.name)
 | 
						if (!diveSite) {
 | 
				
			||||||
		ui.diveSiteName->setText(displayed_dive_site.name);
 | 
							clearLabels();
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (diveSite->name)
 | 
				
			||||||
 | 
							ui.diveSiteName->setText(diveSite->name);
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		ui.diveSiteName->clear();
 | 
							ui.diveSiteName->clear();
 | 
				
			||||||
	const char *country = taxonomy_get_country(&taxonomy);
 | 
						const char *country = taxonomy_get_country(&taxonomy);
 | 
				
			||||||
| 
						 | 
					@ -103,16 +108,16 @@ void LocationInformationWidget::updateLabels()
 | 
				
			||||||
		ui.diveSiteCountry->setText(country);
 | 
							ui.diveSiteCountry->setText(country);
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		ui.diveSiteCountry->clear();
 | 
							ui.diveSiteCountry->clear();
 | 
				
			||||||
	if (displayed_dive_site.description)
 | 
						if (diveSite->description)
 | 
				
			||||||
		ui.diveSiteDescription->setText(displayed_dive_site.description);
 | 
							ui.diveSiteDescription->setText(diveSite->description);
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		ui.diveSiteDescription->clear();
 | 
							ui.diveSiteDescription->clear();
 | 
				
			||||||
	if (displayed_dive_site.notes)
 | 
						if (diveSite->notes)
 | 
				
			||||||
		ui.diveSiteNotes->setPlainText(displayed_dive_site.notes);
 | 
							ui.diveSiteNotes->setPlainText(diveSite->notes);
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		ui.diveSiteNotes->clear();
 | 
							ui.diveSiteNotes->clear();
 | 
				
			||||||
	if (displayed_dive_site.latitude.udeg || displayed_dive_site.longitude.udeg) {
 | 
						if (diveSite->latitude.udeg || diveSite->longitude.udeg) {
 | 
				
			||||||
		const char *coords = printGPSCoords(displayed_dive_site.latitude.udeg, displayed_dive_site.longitude.udeg);
 | 
							const char *coords = printGPSCoords(diveSite->latitude.udeg, diveSite->longitude.udeg);
 | 
				
			||||||
		ui.diveSiteCoordinates->setText(coords);
 | 
							ui.diveSiteCoordinates->setText(coords);
 | 
				
			||||||
		free((void *)coords);
 | 
							free((void *)coords);
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
| 
						 | 
					@ -158,54 +163,52 @@ bool parseGpsText(const QString &text, degrees_t &latitude, degrees_t &longitude
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void LocationInformationWidget::acceptChanges()
 | 
					void LocationInformationWidget::acceptChanges()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char *uiString;
 | 
						if (!diveSite) {
 | 
				
			||||||
	struct dive_site *currentDs;
 | 
					 | 
				
			||||||
	uiString = copy_qstring(ui.diveSiteName->text());
 | 
					 | 
				
			||||||
	if (get_dive_site_by_uuid(displayed_dive_site.uuid) != NULL) {
 | 
					 | 
				
			||||||
		currentDs = get_dive_site_by_uuid(displayed_dive_site.uuid);
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		qWarning() << "did not have valid dive site in LocationInformationWidget";
 | 
							qWarning() << "did not have valid dive site in LocationInformationWidget";
 | 
				
			||||||
		currentDs = get_dive_site_by_uuid(create_dive_site_from_current_dive(uiString));
 | 
							return;
 | 
				
			||||||
		displayed_dive.dive_site_uuid = currentDs->uuid;
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if (!same_string(uiString, currentDs->name)) {
 | 
					
 | 
				
			||||||
		emit nameChanged(QString(currentDs->name), ui.diveSiteName->text());
 | 
						char *uiString;
 | 
				
			||||||
		free(currentDs->name);
 | 
						uiString = copy_qstring(ui.diveSiteName->text());
 | 
				
			||||||
		currentDs->name = uiString;
 | 
						if (!same_string(uiString, diveSite->name)) {
 | 
				
			||||||
 | 
							emit nameChanged(QString(diveSite->name), ui.diveSiteName->text());
 | 
				
			||||||
 | 
							free(diveSite->name);
 | 
				
			||||||
 | 
							diveSite->name = uiString;
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		free(uiString);
 | 
							free(uiString);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	uiString = copy_qstring(ui.diveSiteDescription->text());
 | 
						uiString = copy_qstring(ui.diveSiteDescription->text());
 | 
				
			||||||
	if (!same_string(uiString, currentDs->description)) {
 | 
						if (!same_string(uiString, diveSite->description)) {
 | 
				
			||||||
		free(currentDs->description);
 | 
							free(diveSite->description);
 | 
				
			||||||
		currentDs->description = uiString;
 | 
							diveSite->description = uiString;
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		free(uiString);
 | 
							free(uiString);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	uiString = copy_qstring(ui.diveSiteCountry->text());
 | 
						uiString = copy_qstring(ui.diveSiteCountry->text());
 | 
				
			||||||
	// if the user entered a different country, first update the local taxonomy
 | 
						// if the user entered a different country, first update the local taxonomy
 | 
				
			||||||
	// this below will get copied into the currentDs
 | 
						// this below will get copied into the diveSite
 | 
				
			||||||
	if (!same_string(uiString, taxonomy_get_country(&taxonomy)) &&
 | 
						if (!same_string(uiString, taxonomy_get_country(&taxonomy)) &&
 | 
				
			||||||
	    !empty_string(uiString))
 | 
						    !empty_string(uiString))
 | 
				
			||||||
		taxonomy_set_country(&taxonomy, uiString, taxonomy_origin::GEOMANUAL);
 | 
							taxonomy_set_country(&taxonomy, uiString, taxonomy_origin::GEOMANUAL);
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		free(uiString);
 | 
							free(uiString);
 | 
				
			||||||
	// now update the currentDs (which we then later copy back ontop of displayed_dive_site
 | 
						// now update the diveSite
 | 
				
			||||||
	copy_taxonomy(&taxonomy, ¤tDs->taxonomy);
 | 
						copy_taxonomy(&taxonomy, &diveSite->taxonomy);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	uiString = copy_qstring(ui.diveSiteNotes->document()->toPlainText());
 | 
						uiString = copy_qstring(ui.diveSiteNotes->document()->toPlainText());
 | 
				
			||||||
	if (!same_string(uiString, currentDs->notes)) {
 | 
						if (!same_string(uiString, diveSite->notes)) {
 | 
				
			||||||
		free(currentDs->notes);
 | 
							free(diveSite->notes);
 | 
				
			||||||
		currentDs->notes = uiString;
 | 
							diveSite->notes = uiString;
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		free(uiString);
 | 
							free(uiString);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!ui.diveSiteCoordinates->text().isEmpty())
 | 
						if (!ui.diveSiteCoordinates->text().isEmpty())
 | 
				
			||||||
		parseGpsText(ui.diveSiteCoordinates->text(), currentDs->latitude, currentDs->longitude);
 | 
							parseGpsText(ui.diveSiteCoordinates->text(), diveSite->latitude, diveSite->longitude);
 | 
				
			||||||
	if (dive_site_is_empty(currentDs)) {
 | 
						if (dive_site_is_empty(diveSite)) {
 | 
				
			||||||
		LocationInformationModel::instance()->removeRow(get_divesite_idx(currentDs));
 | 
							LocationInformationModel::instance()->removeRow(get_divesite_idx(diveSite));
 | 
				
			||||||
		displayed_dive.dive_site_uuid = 0;
 | 
							displayed_dive.dive_site_uuid = 0;
 | 
				
			||||||
 | 
							diveSite = nullptr;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	mark_divelist_changed(true);
 | 
						mark_divelist_changed(true);
 | 
				
			||||||
	resetState();
 | 
						resetState();
 | 
				
			||||||
| 
						 | 
					@ -218,22 +221,22 @@ void LocationInformationWidget::rejectChanges()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void LocationInformationWidget::initFields(dive_site *ds)
 | 
					void LocationInformationWidget::initFields(dive_site *ds)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						diveSite = ds;
 | 
				
			||||||
	if (ds) {
 | 
						if (ds) {
 | 
				
			||||||
		copy_dive_site(ds, &displayed_dive_site);
 | 
					 | 
				
			||||||
		copy_taxonomy(&ds->taxonomy, &taxonomy);
 | 
							copy_taxonomy(&ds->taxonomy, &taxonomy);
 | 
				
			||||||
		filter_model.set(displayed_dive_site.uuid, displayed_dive_site.latitude, displayed_dive_site.longitude);
 | 
							filter_model.set(ds->uuid, ds->latitude, ds->longitude);
 | 
				
			||||||
		updateLabels();
 | 
							updateLabels();
 | 
				
			||||||
		enableLocationButtons(dive_site_has_gps_location(&displayed_dive_site));
 | 
							enableLocationButtons(dive_site_has_gps_location(ds));
 | 
				
			||||||
		QSortFilterProxyModel *m = qobject_cast<QSortFilterProxyModel *>(ui.diveSiteListView->model());
 | 
							QSortFilterProxyModel *m = qobject_cast<QSortFilterProxyModel *>(ui.diveSiteListView->model());
 | 
				
			||||||
		emit startFilterDiveSite(displayed_dive_site.uuid);
 | 
							emit startFilterDiveSite(ds->uuid);
 | 
				
			||||||
		if (m)
 | 
							if (m)
 | 
				
			||||||
			m->invalidate();
 | 
								m->invalidate();
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		clear_dive_site(&displayed_dive_site);
 | 
							free_taxonomy(&taxonomy);
 | 
				
			||||||
		filter_model.set(0, degrees_t{ 0 }, degrees_t{ 0 });
 | 
							filter_model.set(0, degrees_t{ 0 }, degrees_t{ 0 });
 | 
				
			||||||
		clearLabels();
 | 
							clearLabels();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	MapWidget::instance()->prepareForGetDiveCoordinates(displayed_dive_site.uuid);
 | 
						MapWidget::instance()->prepareForGetDiveCoordinates(ds ? ds->uuid : 0);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void LocationInformationWidget::markChangedWidget(QWidget *w)
 | 
					void LocationInformationWidget::markChangedWidget(QWidget *w)
 | 
				
			||||||
| 
						 | 
					@ -271,10 +274,12 @@ void LocationInformationWidget::enableEdition()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void LocationInformationWidget::on_diveSiteCoordinates_textChanged(const QString &text)
 | 
					void LocationInformationWidget::on_diveSiteCoordinates_textChanged(const QString &text)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						if (!diveSite)
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
	degrees_t latitude, longitude;
 | 
						degrees_t latitude, longitude;
 | 
				
			||||||
	bool ok_old = displayed_dive_site.latitude.udeg || displayed_dive_site.longitude.udeg;
 | 
						bool ok_old = diveSite->latitude.udeg || diveSite->longitude.udeg;
 | 
				
			||||||
	bool ok = parseGpsText(text, latitude, longitude);
 | 
						bool ok = parseGpsText(text, latitude, longitude);
 | 
				
			||||||
	if (ok != ok_old || latitude.udeg != displayed_dive_site.latitude.udeg || longitude.udeg != displayed_dive_site.longitude.udeg) {
 | 
						if (ok != ok_old || latitude.udeg != diveSite->latitude.udeg || longitude.udeg != diveSite->longitude.udeg) {
 | 
				
			||||||
		if (ok) {
 | 
							if (ok) {
 | 
				
			||||||
			markChangedWidget(ui.diveSiteCoordinates);
 | 
								markChangedWidget(ui.diveSiteCoordinates);
 | 
				
			||||||
			enableLocationButtons(true);
 | 
								enableLocationButtons(true);
 | 
				
			||||||
| 
						 | 
					@ -293,19 +298,19 @@ void LocationInformationWidget::on_diveSiteCountry_textChanged(const QString& te
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void LocationInformationWidget::on_diveSiteDescription_textChanged(const QString &text)
 | 
					void LocationInformationWidget::on_diveSiteDescription_textChanged(const QString &text)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (!same_string(qPrintable(text), displayed_dive_site.description))
 | 
						if (diveSite && !same_string(qPrintable(text), diveSite->description))
 | 
				
			||||||
		markChangedWidget(ui.diveSiteDescription);
 | 
							markChangedWidget(ui.diveSiteDescription);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void LocationInformationWidget::on_diveSiteName_textChanged(const QString &text)
 | 
					void LocationInformationWidget::on_diveSiteName_textChanged(const QString &text)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (!same_string(qPrintable(text), displayed_dive_site.name))
 | 
						if (diveSite && !same_string(qPrintable(text), diveSite->name))
 | 
				
			||||||
		markChangedWidget(ui.diveSiteName);
 | 
							markChangedWidget(ui.diveSiteName);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void LocationInformationWidget::on_diveSiteNotes_textChanged()
 | 
					void LocationInformationWidget::on_diveSiteNotes_textChanged()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (!same_string(qPrintable(ui.diveSiteNotes->toPlainText()), displayed_dive_site.notes))
 | 
						if (diveSite && !same_string(qPrintable(ui.diveSiteNotes->toPlainText()), diveSite->notes))
 | 
				
			||||||
		markChangedWidget(ui.diveSiteNotes);
 | 
							markChangedWidget(ui.diveSiteNotes);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -330,12 +335,12 @@ void LocationInformationWidget::reverseGeocode()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void LocationInformationWidget::updateLocationOnMap()
 | 
					void LocationInformationWidget::updateLocationOnMap()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (!displayed_dive_site.uuid)
 | 
						if (!diveSite)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	degrees_t latitude, longitude;
 | 
						degrees_t latitude, longitude;
 | 
				
			||||||
	if (!parseGpsText(ui.diveSiteCoordinates->text(), latitude, longitude))
 | 
						if (!parseGpsText(ui.diveSiteCoordinates->text(), latitude, longitude))
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	MapWidget::instance()->updateDiveSiteCoordinates(displayed_dive_site.uuid, latitude, longitude);
 | 
						MapWidget::instance()->updateDiveSiteCoordinates(diveSite->uuid, latitude, longitude);
 | 
				
			||||||
	filter_model.setCoordinates(latitude, longitude);
 | 
						filter_model.setCoordinates(latitude, longitude);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -52,7 +52,7 @@ private:
 | 
				
			||||||
	bool modified;
 | 
						bool modified;
 | 
				
			||||||
	QAction *acceptAction, *rejectAction;
 | 
						QAction *acceptAction, *rejectAction;
 | 
				
			||||||
	GPSLocationInformationModel filter_model;
 | 
						GPSLocationInformationModel filter_model;
 | 
				
			||||||
	dive_site displayed_dive_site;
 | 
						dive_site *diveSite;
 | 
				
			||||||
	taxonomy_data taxonomy;
 | 
						taxonomy_data taxonomy;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue