This is by no means complete, just a "I'm actually working"
this should improve a few things and break others, so don't merge this yet,
it's mostly a WIP.

It's ~mainly~ finished, I just need to finish *testing* and fixing a couple
of occasional bugs.

Tomaz.
From 9b6b9aaef9ef1b87693bfee832af9432a40af990 Mon Sep 17 00:00:00 2001
From: Tomaz Canabrava <[email protected]>
Date: Thu, 11 Aug 2016 11:52:49 -0300
Subject: [PATCH 15/15] Removed a bunch of uneeded includes.

Signed-off-by: Tomaz Canabrava <[email protected]>
---
 desktop-widgets/preferences/preferences_georeference.cpp |  1 -
 desktop-widgets/preferences/preferences_graph.cpp        |  1 -
 desktop-widgets/preferences/preferences_language.cpp     |  1 -
 desktop-widgets/preferences/preferences_network.cpp      |  1 -
 desktop-widgets/preferences/preferences_units.cpp        |  2 --
 desktop-widgets/preferences/preferencesdialog.cpp        | 10 +++++-----
 6 files changed, 5 insertions(+), 11 deletions(-)

diff --git a/desktop-widgets/preferences/preferences_georeference.cpp b/desktop-widgets/preferences/preferences_georeference.cpp
index f626b31..dfa841c 100644
--- a/desktop-widgets/preferences/preferences_georeference.cpp
+++ b/desktop-widgets/preferences/preferences_georeference.cpp
@@ -6,7 +6,6 @@
 #include "qt-models/divelocationmodel.h"
 
 #include <ctime>
-#include <QSettings>
 
 PreferencesGeoreference::PreferencesGeoreference() : AbstractPreferencesWidget(tr("Georeference"), QIcon(":/georeference"), 9)
 {
diff --git a/desktop-widgets/preferences/preferences_graph.cpp b/desktop-widgets/preferences/preferences_graph.cpp
index d94eae9..36951ef 100644
--- a/desktop-widgets/preferences/preferences_graph.cpp
+++ b/desktop-widgets/preferences/preferences_graph.cpp
@@ -2,7 +2,6 @@
 #include "ui_preferences_graph.h"
 #include "core/prefs-macros.h"
 #include "core/subsurface-qt/SettingsObjectWrapper.h"
-#include <QSettings>
 #include <QMessageBox>
 
 #include "qt-models/models.h"
diff --git a/desktop-widgets/preferences/preferences_language.cpp b/desktop-widgets/preferences/preferences_language.cpp
index 408b48b..75297a8 100644
--- a/desktop-widgets/preferences/preferences_language.cpp
+++ b/desktop-widgets/preferences/preferences_language.cpp
@@ -4,7 +4,6 @@
 #include "core/subsurface-qt/SettingsObjectWrapper.h"
 
 #include <QApplication>
-#include <QSettings>
 #include <QMessageBox>
 #include <QSortFilterProxyModel>
 
diff --git a/desktop-widgets/preferences/preferences_network.cpp b/desktop-widgets/preferences/preferences_network.cpp
index 2e0ebbd..68c8a94 100644
--- a/desktop-widgets/preferences/preferences_network.cpp
+++ b/desktop-widgets/preferences/preferences_network.cpp
@@ -6,7 +6,6 @@
 #include "core/cloudstorage.h"
 #include "core/subsurface-qt/SettingsObjectWrapper.h"
 #include <QNetworkProxy>
-#include <QSettings>
 
 PreferencesNetwork::PreferencesNetwork() : AbstractPreferencesWidget(tr("Network"),QIcon(":network"), 9), ui(new Ui::PreferencesNetwork())
 {
diff --git a/desktop-widgets/preferences/preferences_units.cpp b/desktop-widgets/preferences/preferences_units.cpp
index c62fb1c..aa324ec 100644
--- a/desktop-widgets/preferences/preferences_units.cpp
+++ b/desktop-widgets/preferences/preferences_units.cpp
@@ -4,8 +4,6 @@
 #include "core/qthelper.h"
 #include "core/subsurface-qt/SettingsObjectWrapper.h"
 
-#include <QSettings>
-
 PreferencesUnits::PreferencesUnits(): AbstractPreferencesWidget(tr("Units"),QIcon(":units"),1), ui(new Ui::PreferencesUnits())
 {
 	ui->setupUi(this);
diff --git a/desktop-widgets/preferences/preferencesdialog.cpp b/desktop-widgets/preferences/preferencesdialog.cpp
index 01d0aac..3b92dff 100644
--- a/desktop-widgets/preferences/preferencesdialog.cpp
+++ b/desktop-widgets/preferences/preferencesdialog.cpp
@@ -16,7 +16,6 @@
 #include <QStackedWidget>
 #include <QDialogButtonBox>
 #include <QAbstractButton>
-#include <QSettings>
 #include <QDebug>
 
 PreferencesDialog* PreferencesDialog::instance()
@@ -34,10 +33,11 @@ PreferencesDialog::PreferencesDialog()
 {
 	loadPreferences(); //TODO: Move this code out of the qthelper.cpp
 
-	QSettings s;
-	s.beginGroup("GeneralSettings");
-	s.setValue("default_directory", system_default_directory());
-	s.endGroup();
+	//FIXME: This looks wrong.
+	//QSettings s;
+	//s.beginGroup("GeneralSettings");
+	//s.setValue("default_directory", system_default_directory());
+	//s.endGroup();
 
 	pagesList = new QListWidget();
 	pagesStack = new QStackedWidget();
-- 
2.9.3

From a3bd31d92f53803c3ce06fdc2d33435d05bfd9d6 Mon Sep 17 00:00:00 2001
From: Tomaz Canabrava <[email protected]>
Date: Thu, 11 Aug 2016 11:26:37 -0300
Subject: [PATCH 14/15] Correct usage of  QSettings

Signed-off-by: Tomaz Canabrava <[email protected]>
---
 core/qthelper.cpp | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/core/qthelper.cpp b/core/qthelper.cpp
index b8c9625..5c12d14 100644
--- a/core/qthelper.cpp
+++ b/core/qthelper.cpp
@@ -1597,7 +1597,10 @@ void init_proxy()
 
 QString getUUID()
 {
-	// FIXME: This settings should go somewhere or this is the correct place for it?
+	// This is a correct usage of QSettings,
+	// it's not a setting per se - the user cannot change it
+	// and thus, don't need to be on the prefs structure
+	// and this is the *only* point of access from it,
 	QString uuidString;
 	QSettings settings;
 	settings.beginGroup("UpdateManager");
-- 
2.9.3

From f6abef6612fbac1cab1f7e1da942715dc3207e39 Mon Sep 17 00:00:00 2001
From: Tomaz Canabrava <[email protected]>
Date: Thu, 11 Aug 2016 11:20:20 -0300
Subject: [PATCH 13/15] Remove unused include

Signed-off-by: Tomaz Canabrava <[email protected]>
---
 core/divecomputer.cpp | 2 --
 core/qthelper.cpp     | 1 +
 2 files changed, 1 insertion(+), 2 deletions(-)

diff --git a/core/divecomputer.cpp b/core/divecomputer.cpp
index 5a79f39..6519e4f 100644
--- a/core/divecomputer.cpp
+++ b/core/divecomputer.cpp
@@ -2,8 +2,6 @@
 #include "dive.h"
 #include "subsurface-qt/SettingsObjectWrapper.h"
 
-#include <QSettings>
-
 DiveComputerList dcList;
 
 DiveComputerList::DiveComputerList()
diff --git a/core/qthelper.cpp b/core/qthelper.cpp
index 0135137..b8c9625 100644
--- a/core/qthelper.cpp
+++ b/core/qthelper.cpp
@@ -1597,6 +1597,7 @@ void init_proxy()
 
 QString getUUID()
 {
+	// FIXME: This settings should go somewhere or this is the correct place for it?
 	QString uuidString;
 	QSettings settings;
 	settings.beginGroup("UpdateManager");
-- 
2.9.3

From 80fc33453084b267a26aef63a4228aacc402ec29 Mon Sep 17 00:00:00 2001
From: Tomaz Canabrava <[email protected]>
Date: Wed, 10 Aug 2016 18:10:15 -0300
Subject: [PATCH 12/15] Move Dive Computer settings to the Settings

For some reason, the dive computer settings wasn't in the
settings prefs. this moves it, makes the boilerplate on Settings
ObjectWrapper and make things compile.

Signed-off-by: Tomaz Canabrava <[email protected]>
---
 core/divecomputer.cpp                           | 59 ++---------------------
 core/helpers.h                                  |  3 --
 core/pref.h                                     |  8 ++++
 core/subsurface-qt/SettingsObjectWrapper.cpp    | 62 ++++++++++++++++++++++++-
 core/subsurface-qt/SettingsObjectWrapper.h      | 32 ++++++++++++-
 desktop-widgets/configuredivecomputerdialog.cpp |  9 ++--
 desktop-widgets/downloadfromdivecomputer.cpp    | 31 ++++++++-----
 desktop-widgets/mainwindow.cpp                  | 20 +-------
 subsurface-desktop-helper.cpp                   |  3 --
 9 files changed, 132 insertions(+), 95 deletions(-)

diff --git a/core/divecomputer.cpp b/core/divecomputer.cpp
index e4081e1..5a79f39 100644
--- a/core/divecomputer.cpp
+++ b/core/divecomputer.cpp
@@ -1,12 +1,9 @@
 #include "divecomputer.h"
 #include "dive.h"
+#include "subsurface-qt/SettingsObjectWrapper.h"
 
 #include <QSettings>
 
-const char *default_dive_computer_vendor;
-const char *default_dive_computer_product;
-const char *default_dive_computer_device;
-int default_dive_computer_download_mode;
 DiveComputerList dcList;
 
 DiveComputerList::DiveComputerList()
@@ -144,60 +141,14 @@ extern "C" void call_for_each_dc (void *f, void (*callback)(void *, const char *
 
 extern "C" int is_default_dive_computer(const char *vendor, const char *product)
 {
-	return default_dive_computer_vendor && !strcmp(vendor, default_dive_computer_vendor) &&
-	       default_dive_computer_product && !strcmp(product, default_dive_computer_product);
+	auto dc = SettingsObjectWrapper::instance()->dive_computer_settings;
+	return dc->dc_vendor() == vendor && dc->dc_product() == product;
 }
 
 extern "C" int is_default_dive_computer_device(const char *name)
 {
-	return default_dive_computer_device && !strcmp(name, default_dive_computer_device);
-}
-
-void set_default_dive_computer(const char *vendor, const char *product)
-{
-	QSettings s;
-
-	if (!vendor || !*vendor)
-		return;
-	if (!product || !*product)
-		return;
-	if (is_default_dive_computer(vendor, product))
-		return;
-
-	free((void *)default_dive_computer_vendor);
-	free((void *)default_dive_computer_product);
-	default_dive_computer_vendor = strdup(vendor);
-	default_dive_computer_product = strdup(product);
-	s.beginGroup("DiveComputer");
-	s.setValue("dive_computer_vendor", vendor);
-	s.setValue("dive_computer_product", product);
-	s.endGroup();
-}
-
-void set_default_dive_computer_device(const char *name)
-{
-	QSettings s;
-
-	if (!name || !*name)
-		return;
-	if (is_default_dive_computer_device(name))
-		return;
-
-	free((void *)default_dive_computer_device);
-	default_dive_computer_device = strdup(name);
-	s.beginGroup("DiveComputer");
-	s.setValue("dive_computer_device", name);
-	s.endGroup();
-}
-
-void set_default_dive_computer_download_mode(int download_mode)
-{
-	QSettings s;
-
-	default_dive_computer_download_mode = download_mode;
-	s.beginGroup("DiveComputer");
-	s.setValue("dive_computer_download_mode", download_mode);
-	s.endGroup();
+	auto dc = SettingsObjectWrapper::instance()->dive_computer_settings;
+	return dc->dc_device() == name;
 }
 
 extern "C" void set_dc_nickname(struct dive *dive)
diff --git a/core/helpers.h b/core/helpers.h
index b9f7f50..a4a903e 100644
--- a/core/helpers.h
+++ b/core/helpers.h
@@ -22,9 +22,6 @@ QString get_volume_string(volume_t volume, bool showunit = false);
 QString get_volume_unit();
 QString get_pressure_string(pressure_t pressure, bool showunit = false);
 QString get_pressure_unit();
-void set_default_dive_computer(const char *vendor, const char *product);
-void set_default_dive_computer_device(const char *name);
-void set_default_dive_computer_download_mode(int downloadMode);
 QString getSubsurfaceDataPath(QString folderToFind);
 QString getPrintingTemplatePathUser();
 QString getPrintingTemplatePathBundle();
diff --git a/core/pref.h b/core/pref.h
index 89c559c..fb5aafe 100644
--- a/core/pref.h
+++ b/core/pref.h
@@ -49,6 +49,13 @@ typedef struct {
     char *next_check;
 } update_manager_prefs_t;
 
+typedef struct {
+	char *vendor;
+	char *product;
+	char *device;
+	int download_mode;
+} dive_computer_prefs_t;
+
 struct preferences {
 	const char *divelist_font;
 	const char *default_filename;
@@ -140,6 +147,7 @@ struct preferences {
 	bool git_local_only;
 	locale_prefs_t locale; //: TODO: move the rest of locale based info here.
 	update_manager_prefs_t update_manager;
+	dive_computer_prefs_t dive_computer;
 };
 enum unit_system_values {
 	METRIC,
diff --git a/core/subsurface-qt/SettingsObjectWrapper.cpp b/core/subsurface-qt/SettingsObjectWrapper.cpp
index dbb5c11..9d5692d 100644
--- a/core/subsurface-qt/SettingsObjectWrapper.cpp
+++ b/core/subsurface-qt/SettingsObjectWrapper.cpp
@@ -6,6 +6,65 @@
 
 #include "../dive.h" // TODO: remove copy_string from dive.h
 
+DiveComputerSettings::DiveComputerSettings(QObject *parent):
+	QObject(parent), group(QStringLiteral("DiveComputer"))
+{
+}
+
+QString DiveComputerSettings::dc_vendor() const
+{
+	return prefs.dive_computer.vendor;
+}
+
+QString DiveComputerSettings::dc_product() const
+{
+	return prefs.dive_computer.product;
+}
+
+QString DiveComputerSettings::dc_device() const
+{
+	return prefs.dive_computer.device;
+}
+
+int DiveComputerSettings::downloadMode() const
+{
+	return prefs.dive_computer.download_mode;
+}
+
+void DiveComputerSettings::setVendor(const QString& vendor)
+{
+	QSettings s;
+	s.beginGroup(group);
+	s.setValue("dive_computer_vendor", vendor);
+	free(prefs.dive_computer.vendor);
+	prefs.dive_computer.vendor = copy_string(qPrintable(vendor));
+}
+
+void DiveComputerSettings::setProduct(const QString& product)
+{
+	QSettings s;
+	s.beginGroup(group);
+	s.setValue("dive_computer_product", product);
+	free(prefs.dive_computer.product);
+	prefs.dive_computer.product = copy_string(qPrintable(product));
+}
+
+void DiveComputerSettings::setDevice(const QString& device)
+{
+	QSettings s;
+	s.beginGroup(group);
+	s.setValue("dive_computer_device", device);
+	free(prefs.dive_computer.device);
+	prefs.dive_computer.device = copy_string(qPrintable(device));
+}
+
+void DiveComputerSettings::setDownloadMode(int mode)
+{
+	QSettings s;
+	s.beginGroup(group);
+	s.setValue("dive_computer_download_mode", mode);
+	prefs.dive_computer.download_mode = mode;
+}
 
 UpdateManagerSettings::UpdateManagerSettings(QObject *parent) : QObject(parent), group("UpdateManager")
 {
@@ -1678,7 +1737,8 @@ QObject(parent),
 	language_settings(new LanguageSettingsObjectWrapper(this)),
 	animation_settings(new AnimationsSettingsObjectWrapper(this)),
 	location_settings(new LocationServiceSettingsObjectWrapper(this)),
-	update_manager_settings(new UpdateManagerSettings(this))
+	update_manager_settings(new UpdateManagerSettings(this)),
+	dive_computer_settings(new DiveComputerSettings(this))
 {
 }
 
diff --git a/core/subsurface-qt/SettingsObjectWrapper.h b/core/subsurface-qt/SettingsObjectWrapper.h
index 392bf06..472150a 100644
--- a/core/subsurface-qt/SettingsObjectWrapper.h
+++ b/core/subsurface-qt/SettingsObjectWrapper.h
@@ -11,6 +11,34 @@
  * and QWidget frontends. This class will be huge, since
  * I need tons of properties, one for each option. */
 
+class DiveComputerSettings : public QObject {
+	Q_OBJECT
+	Q_PROPERTY(QString vendor READ dc_vendor WRITE setVendor NOTIFY vendorChanged)
+	Q_PROPERTY(QString product READ dc_product WRITE setProduct NOTIFY productChanged)
+	Q_PROPERTY(QString device READ dc_device WRITE setDevice NOTIFY deviceChanged)
+	Q_PROPERTY(int download_mode READ downloadMode WRITE setDownloadMode NOTIFY downloadModeChanged)
+public:
+	DiveComputerSettings(QObject *parent);
+	QString dc_vendor() const;
+	QString dc_product() const;
+	QString dc_device() const;
+	int downloadMode() const;
+
+public slots:
+	void setVendor(const QString& vendor);
+	void setProduct(const QString& product);
+	void setDevice(const QString& device);
+	void setDownloadMode(int mode);
+
+signals:
+	void vendorChanged(const QString& vendor);
+	void productChanged(const QString& product);
+	void deviceChanged(const QString& device);
+	void downloadModeChanged(int mode);
+private:
+	QString group;
+
+};
 class UpdateManagerSettings : public QObject {
 	Q_OBJECT
 	Q_PROPERTY(bool dont_check_for_updates READ dontCheckForUpdates WRITE setDontCheckForUpdates NOTIFY dontCheckForUpdatesChanged)
@@ -647,7 +675,7 @@ class SettingsObjectWrapper : public QObject {
 	Q_PROPERTY(LocationServiceSettingsObjectWrapper* Location  MEMBER location_settings CONSTANT)
 
 	Q_PROPERTY(UpdateManagerSettings* update MEMBER update_manager_settings CONSTANT)
-
+	Q_PROPERTY(DiveComputerSettings* dive_computer MEMBER dive_computer_settings CONSTANT)
 public:
 	static SettingsObjectWrapper *instance();
 
@@ -665,6 +693,8 @@ public:
 	AnimationsSettingsObjectWrapper *animation_settings;
 	LocationServiceSettingsObjectWrapper *location_settings;
 	UpdateManagerSettings *update_manager_settings;
+	DiveComputerSettings *dive_computer_settings;
+
 private:
 	SettingsObjectWrapper(QObject *parent = NULL);
 };
diff --git a/desktop-widgets/configuredivecomputerdialog.cpp b/desktop-widgets/configuredivecomputerdialog.cpp
index 471db9a..79cdcaf 100644
--- a/desktop-widgets/configuredivecomputerdialog.cpp
+++ b/desktop-widgets/configuredivecomputerdialog.cpp
@@ -3,6 +3,7 @@
 #include "core/helpers.h"
 #include "desktop-widgets/mainwindow.h"
 #include "core/display.h"
+#include "core/subsurface-qt/SettingsObjectWrapper.h"
 
 #include <QFileDialog>
 #include <QMessageBox>
@@ -150,8 +151,9 @@ ConfigureDiveComputerDialog::ConfigureDiveComputerDialog(QWidget *parent) : QDia
 
 	memset(&device_data, 0, sizeof(device_data));
 	fill_computer_list();
-	if (default_dive_computer_device)
-		ui.device->setEditText(default_dive_computer_device);
+	auto dc = SettingsObjectWrapper::instance()->dive_computer_settings;
+	if (!dc->dc_device().isEmpty())
+		ui.device->setEditText(dc->dc_device());
 
 	ui.DiveComputerList->setCurrentRow(0);
 	on_DiveComputerList_currentRowChanged(0);
@@ -775,7 +777,8 @@ void ConfigureDiveComputerDialog::getDeviceData()
 	device_data.descriptor = descriptorLookup[selected_vendor + selected_product];
 	device_data.deviceid = device_data.diveid = 0;
 
-	set_default_dive_computer_device(device_data.devname);
+	auto dc = SettingsObjectWrapper::instance()->dive_computer_settings;
+	dc->setDevice(device_data.devname);
 }
 
 void ConfigureDiveComputerDialog::on_cancel_clicked()
diff --git a/desktop-widgets/downloadfromdivecomputer.cpp b/desktop-widgets/downloadfromdivecomputer.cpp
index 7ef4e1e..d585896 100644
--- a/desktop-widgets/downloadfromdivecomputer.cpp
+++ b/desktop-widgets/downloadfromdivecomputer.cpp
@@ -4,6 +4,7 @@
 #include "desktop-widgets/divelistview.h"
 #include "core/display.h"
 #include "core/uemis.h"
+#include "core/subsurface-qt/SettingsObjectWrapper.h"
 #include "qt-models/models.h"
 
 #include <QTimer>
@@ -78,15 +79,17 @@ DownloadFromDCWidget::DownloadFromDCWidget(QWidget *parent, Qt::WindowFlags f) :
 	connect(ui.unselectAllButton, SIGNAL(clicked()), diveImportedModel, SLOT(selectNone()));
 	vendorModel = new QStringListModel(vendorList);
 	ui.vendor->setModel(vendorModel);
-	if (default_dive_computer_vendor) {
-		ui.vendor->setCurrentIndex(ui.vendor->findText(default_dive_computer_vendor));
-		productModel = new QStringListModel(productList[default_dive_computer_vendor]);
+
+	auto dc = SettingsObjectWrapper::instance()->dive_computer_settings;
+	if (!dc->dc_vendor().isEmpty()) {
+		ui.vendor->setCurrentIndex(ui.vendor->findText(dc->dc_vendor()));
+		productModel = new QStringListModel(productList[dc->dc_vendor()]);
 		ui.product->setModel(productModel);
-		if (default_dive_computer_product)
-			ui.product->setCurrentIndex(ui.product->findText(default_dive_computer_product));
+		if (!dc->dc_product().isEmpty())
+			ui.product->setCurrentIndex(ui.product->findText(dc->dc_product()));
 	}
-	if (default_dive_computer_device)
-		ui.device->setEditText(default_dive_computer_device);
+	if (!dc->dc_device().isEmpty())
+		ui.device->setEditText(dc->dc_device());
 
 	timer->setInterval(200);
 	connect(timer, SIGNAL(timeout()), this, SLOT(updateProgressBar()));
@@ -102,7 +105,7 @@ DownloadFromDCWidget::DownloadFromDCWidget(QWidget *parent, Qt::WindowFlags f) :
 
 #if defined(BT_SUPPORT) && defined(SSRF_CUSTOM_SERIAL)
 	ui.bluetoothMode->setText(tr("Choose Bluetooth download mode"));
-	ui.bluetoothMode->setChecked(default_dive_computer_download_mode == DC_TRANSPORT_BLUETOOTH);
+	ui.bluetoothMode->setChecked(dc->downloadMode() == DC_TRANSPORT_BLUETOOTH);
 	btDeviceSelectionDialog = 0;
 	ui.chooseBluetoothDevice->setEnabled(ui.bluetoothMode->isChecked());
 	connect(ui.bluetoothMode, SIGNAL(stateChanged(int)), this, SLOT(enableBluetoothMode(int)));
@@ -337,16 +340,20 @@ void DownloadFromDCWidget::on_downloadCancelRetryButton_clicked()
 	data.create_new_trip = ui.createNewTrip->isChecked();
 	data.trip = NULL;
 	data.deviceid = data.diveid = 0;
-	set_default_dive_computer(data.vendor, data.product);
-	set_default_dive_computer_device(data.devname);
+
+	auto dc = SettingsObjectWrapper::instance()->dive_computer_settings;
+	dc->setVendor(data.vendor);
+	dc->setProduct(data.product);
+	dc->setDevice(data.devname);
 #if defined(BT_SUPPORT) && defined(SSRF_CUSTOM_SERIAL)
-	set_default_dive_computer_download_mode(ui.bluetoothMode->isChecked() ? DC_TRANSPORT_BLUETOOTH : DC_TRANSPORT_SERIAL);
+	dc->setDownloadMode(ui.bluetoothMode->isChecked() ? DC_TRANSPORT_BLUETOOTH : DC_TRANSPORT_SERIAL);
 #endif
-	thread = new DownloadThread(this, &data);
 
+	thread = new DownloadThread(this, &data);
 	connect(thread, SIGNAL(finished()),
 		this, SLOT(onDownloadThreadFinished()), Qt::QueuedConnection);
 
+	//TODO: Don't call mainwindow.
 	MainWindow *w = MainWindow::instance();
 	connect(thread, SIGNAL(finished()), w, SLOT(refreshDisplay()));
 
diff --git a/desktop-widgets/mainwindow.cpp b/desktop-widgets/mainwindow.cpp
index d4c2317..bac7882 100644
--- a/desktop-widgets/mainwindow.cpp
+++ b/desktop-widgets/mainwindow.cpp
@@ -1298,33 +1298,17 @@ void MainWindow::initialUiSetup()
 	show();
 }
 
-const char *getSetting(const QSettings &s,const QString& name)
-{
-	QVariant v;
-	v = s.value(name);
-	if (v.isValid()) {
-		return strdup(v.toString().toUtf8().data());
-	}
-	return NULL;
-}
-
 void MainWindow::readSettings()
 {
 	static bool firstRun = true;
-
-	QSettings s; //WARNING: Why those prefs are not on the prefs struct?
-	s.beginGroup("DiveComputer");
-	default_dive_computer_vendor = getSetting(s, "dive_computer_vendor");
-	default_dive_computer_product = getSetting(s, "dive_computer_product");
-	default_dive_computer_device = getSetting(s, "dive_computer_device");
-	default_dive_computer_download_mode = s.value("dive_computer_download_mode").toInt();
-	s.endGroup();
 	init_proxy();
 
 	// now make sure that the cloud menu items are enabled IFF cloud account is verified
 	enableDisableCloudActions();
 
 #if !defined(SUBSURFACE_MOBILE)
+	QSettings s; //TODO: this 's' exists only for the loadRecentFiles, remove it.
+
 	loadRecentFiles(&s);
 	if (firstRun) {
 		checkSurvey(&s);
diff --git a/subsurface-desktop-helper.cpp b/subsurface-desktop-helper.cpp
index ef349ad..f8d8ba1 100644
--- a/subsurface-desktop-helper.cpp
+++ b/subsurface-desktop-helper.cpp
@@ -50,9 +50,6 @@ void exit_ui()
 	delete window;
 	delete qApp;
 	free((void *)existing_filename);
-	free((void *)default_dive_computer_vendor);
-	free((void *)default_dive_computer_product);
-	free((void *)default_dive_computer_device);
 }
 
 double get_screen_dpi()
-- 
2.9.3

From f8bb1fb4fc02327582c530f673558efa63af4d5c Mon Sep 17 00:00:00 2001
From: Tomaz Canabrava <[email protected]>
Date: Wed, 10 Aug 2016 16:43:18 -0300
Subject: [PATCH 11/15] Removed unused include & variable.

Signed-off-by: Tomaz Canabrava <[email protected]>
---
 qt-models/models.cpp | 2 --
 1 file changed, 2 deletions(-)

diff --git a/qt-models/models.cpp b/qt-models/models.cpp
index d02f466..655213e 100644
--- a/qt-models/models.cpp
+++ b/qt-models/models.cpp
@@ -8,7 +8,6 @@
 #include "core/helpers.h"
 
 #include <QLocale>
-#include <QSettings>
 
 // initialize the trash icon if necessary
 
@@ -67,7 +66,6 @@ LanguageModel *LanguageModel::instance()
 
 LanguageModel::LanguageModel(QObject *parent) : QAbstractListModel(parent)
 {
-	QSettings s;
 	QDir d(getSubsurfaceDataPath("translations"));
 	Q_FOREACH (const QString &s, d.entryList()) {
 		if (s.startsWith("subsurface_") && s.endsWith(".qm")) {
-- 
2.9.3

From bc66fa0c51cc741bd65ee0cc6439afd0546c219f Mon Sep 17 00:00:00 2001
From: Tomaz Canabrava <[email protected]>
Date: Wed, 10 Aug 2016 16:40:14 -0300
Subject: [PATCH 10/15] Simplify Update Manager

Signed-off-by: Tomaz Canabrava <[email protected]>
---
 desktop-widgets/updatemanager.cpp | 47 +++++++++++++++------------------------
 1 file changed, 18 insertions(+), 29 deletions(-)

diff --git a/desktop-widgets/updatemanager.cpp b/desktop-widgets/updatemanager.cpp
index b09d124..2211c33 100644
--- a/desktop-widgets/updatemanager.cpp
+++ b/desktop-widgets/updatemanager.cpp
@@ -8,32 +8,24 @@
 #include "core/version.h"
 #include "desktop-widgets/mainwindow.h"
 #include "core/cloudstorage.h"
+#include "core/subsurface-qt/SettingsObjectWrapper.h"
 
 UpdateManager::UpdateManager(QObject *parent) :
 	QObject(parent),
 	isAutomaticCheck(false)
 {
-	// is this the first time this version was run?
-	QSettings settings;
-	settings.beginGroup("UpdateManager");
-	if (settings.contains("DontCheckForUpdates") && settings.value("DontCheckForUpdates") == "TRUE")
+	auto update_settings = SettingsObjectWrapper::instance()->update_manager_settings;
+
+	if (update_settings->dontCheckForUpdates())
 		return;
-	if (settings.contains("LastVersionUsed")) {
-		// we have checked at least once before
-		if (settings.value("LastVersionUsed").toString() != subsurface_git_version()) {
-			// we have just updated - wait two weeks before you check again
-			settings.setValue("LastVersionUsed", QString(subsurface_git_version()));
-			settings.setValue("NextCheck", QDateTime::currentDateTime().addDays(14).toString(Qt::ISODate));
-		} else {
-			// is it time to check again?
-			QString nextCheckString = settings.value("NextCheck").toString();
-			QDateTime nextCheck = QDateTime::fromString(nextCheckString, Qt::ISODate);
-			if (nextCheck > QDateTime::currentDateTime())
-				return;
-		}
-	}
-	settings.setValue("LastVersionUsed", QString(subsurface_git_version()));
-	settings.setValue("NextCheck", QDateTime::currentDateTime().addDays(14).toString(Qt::ISODate));
+
+	if (update_settings->lastVersionUsed() == subsurface_git_version() &&
+		update_settings->nextCheck() > QDate::currentDate())
+		return;
+
+	update_settings->setLastVersionUsed(subsurface_git_version());
+	update_settings->setNextCheck(QDate::currentDate().addDays(14));
+
 	checkForUpdates(true);
 }
 
@@ -117,23 +109,20 @@ void UpdateManager::requestReceived()
 		msgbox.exec();
 	}
 	if (isAutomaticCheck) {
-		QSettings settings;
-		settings.beginGroup("UpdateManager");
-		if (!settings.contains("DontCheckForUpdates")) {
+		auto update_settings = SettingsObjectWrapper::instance()->update_manager_settings;
+		if (!update_settings->dontCheckForUpdates()) {
+
 			// we allow an opt out of future checks
 			QMessageBox response(MainWindow::instance());
-			QString message = tr("Subsurface is checking every two weeks if a new version is available. If you don't want Subsurface to continue checking, please click Decline.");
+			QString message = tr("Subsurface is checking every two weeks if a new version is available. "
+								 "\n If you don't want Subsurface to continue checking, please click Decline.");
 			response.addButton(tr("Decline"), QMessageBox::RejectRole);
 			response.addButton(tr("Accept"), QMessageBox::AcceptRole);
 			response.setText(message);
 			response.setWindowTitle(tr("Automatic check for updates"));
 			response.setIcon(QMessageBox::Question);
 			response.setWindowModality(Qt::WindowModal);
-			int ret = response.exec();
-			if (ret == QMessageBox::Accepted)
-				settings.setValue("DontCheckForUpdates", "FALSE");
-			else
-				settings.setValue("DontCheckForUpdates", "TRUE");
+			update_settings->setDontCheckForUpdates(response.exec() != QMessageBox::Accepted);
 		}
 	}
 #endif
-- 
2.9.3

From 0fb8635668cdd2fe1e545055f5fbe208e855bab6 Mon Sep 17 00:00:00 2001
From: Tomaz Canabrava <[email protected]>
Date: Wed, 10 Aug 2016 15:50:00 -0300
Subject: [PATCH 09/15] Update manager to settings

Signed-off-by: Tomaz Canabrava <[email protected]>
---
 core/pref.h                                  |  7 ++++
 core/subsurface-qt/SettingsObjectWrapper.cpp | 53 +++++++++++++++++++++++++++-
 core/subsurface-qt/SettingsObjectWrapper.h   | 33 +++++++++++++++--
 3 files changed, 89 insertions(+), 4 deletions(-)

diff --git a/core/pref.h b/core/pref.h
index a304179..89c559c 100644
--- a/core/pref.h
+++ b/core/pref.h
@@ -43,6 +43,12 @@ enum deco_mode {
 	VPMB
 };
 
+typedef struct {
+    bool dont_check_for_updates;
+    char *last_version_used;
+    char *next_check;
+} update_manager_prefs_t;
+
 struct preferences {
 	const char *divelist_font;
 	const char *default_filename;
@@ -133,6 +139,7 @@ struct preferences {
 	int distance_threshold;
 	bool git_local_only;
 	locale_prefs_t locale; //: TODO: move the rest of locale based info here.
+	update_manager_prefs_t update_manager;
 };
 enum unit_system_values {
 	METRIC,
diff --git a/core/subsurface-qt/SettingsObjectWrapper.cpp b/core/subsurface-qt/SettingsObjectWrapper.cpp
index 6df8110..dbb5c11 100644
--- a/core/subsurface-qt/SettingsObjectWrapper.cpp
+++ b/core/subsurface-qt/SettingsObjectWrapper.cpp
@@ -2,10 +2,60 @@
 #include <QSettings>
 #include <QApplication>
 #include <QFont>
+#include <QDate>
 
 #include "../dive.h" // TODO: remove copy_string from dive.h
 
 
+UpdateManagerSettings::UpdateManagerSettings(QObject *parent) : QObject(parent), group("UpdateManager")
+{
+
+}
+
+bool UpdateManagerSettings::dontCheckForUpdates() const
+{
+	return prefs.update_manager.dont_check_for_updates;
+}
+
+QString UpdateManagerSettings::lastVersionUsed() const
+{
+	return prefs.update_manager.last_version_used;
+}
+
+QDate UpdateManagerSettings::nextCheck() const
+{
+	return QDate::fromString(QString(prefs.update_manager.next_check));
+}
+
+void UpdateManagerSettings::setDontCheckForUpdates(bool value)
+{
+	QSettings s;
+	s.beginGroup(group);
+	s.setValue("DontCheckForUpdates", value);
+	prefs.update_manager.dont_check_for_updates = value;
+	emit dontCheckForUpdatesChanged(value);
+}
+
+void UpdateManagerSettings::setLastVersionUsed(const QString& value)\
+{
+	QSettings s;
+	s.beginGroup(group);
+	s.setValue("LastVersionUsed", value);
+	free (prefs.update_manager.last_version_used);
+	prefs.update_manager.last_version_used = copy_string(qPrintable(value));
+	emit lastVersionUsedChanged(value);
+}
+
+void UpdateManagerSettings::setNextCheck(const QDate& date)
+{
+	QSettings s;
+	s.beginGroup(group);
+	s.setValue("NextCheck", date);
+	free (prefs.update_manager.next_check);
+	prefs.update_manager.next_check = copy_string(qPrintable(date.toString()));
+	emit nextCheckChanged(date);
+}
+
 static QString tecDetails = QStringLiteral("TecDetails");
 
 PartialPressureGasSettings::PartialPressureGasSettings(QObject* parent):
@@ -1627,7 +1677,8 @@ QObject(parent),
 	display_settings(new DisplaySettingsObjectWrapper(this)),
 	language_settings(new LanguageSettingsObjectWrapper(this)),
 	animation_settings(new AnimationsSettingsObjectWrapper(this)),
-	location_settings(new LocationServiceSettingsObjectWrapper(this))
+	location_settings(new LocationServiceSettingsObjectWrapper(this)),
+	update_manager_settings(new UpdateManagerSettings(this))
 {
 }
 
diff --git a/core/subsurface-qt/SettingsObjectWrapper.h b/core/subsurface-qt/SettingsObjectWrapper.h
index 157c743..392bf06 100644
--- a/core/subsurface-qt/SettingsObjectWrapper.h
+++ b/core/subsurface-qt/SettingsObjectWrapper.h
@@ -11,6 +11,30 @@
  * and QWidget frontends. This class will be huge, since
  * I need tons of properties, one for each option. */
 
+class UpdateManagerSettings : public QObject {
+	Q_OBJECT
+	Q_PROPERTY(bool dont_check_for_updates READ dontCheckForUpdates WRITE setDontCheckForUpdates NOTIFY dontCheckForUpdatesChanged)
+	Q_PROPERTY(QString last_version_used READ lastVersionUsed WRITE setLastVersionUsed NOTIFY lastVersionUsedChanged)
+	Q_PROPERTY(QDate next_check READ nextCheck WRITE nextCheckChanged)
+public:
+	UpdateManagerSettings(QObject *parent);
+	bool dontCheckForUpdates() const;
+	QString lastVersionUsed() const;
+	QDate nextCheck() const;
+
+public slots:
+	void setDontCheckForUpdates(bool value);
+	void setLastVersionUsed(const QString& value);
+	void setNextCheck(const QDate& date);
+
+signals:
+	void dontCheckForUpdatesChanged(bool value);
+	void lastVersionUsedChanged(const QString& value);
+	void nextCheckChanged(const QDate& date);
+private:
+	QString group;
+};
+
 /* Control the state of the Partial Pressure Graphs preferences */
 class PartialPressureGasSettings : public QObject {
 	Q_OBJECT
@@ -51,9 +75,9 @@ private:
 
 class TechnicalDetailsSettings : public QObject {
 	Q_OBJECT
-	Q_PROPERTY(double modpO2          READ modp02          WRITE setModp02          NOTIFY modpO2Changed)
+	Q_PROPERTY(double modpO2         READ modp02          WRITE setModp02          NOTIFY modpO2Changed)
 	Q_PROPERTY(bool ead              READ ead             WRITE setEad             NOTIFY eadChanged)
-	Q_PROPERTY(bool mod              READ mod                WRITE setMod                NOTIFY modChanged);
+	Q_PROPERTY(bool mod              READ mod             WRITE setMod             NOTIFY modChanged)
 	Q_PROPERTY(bool dcceiling        READ dcceiling       WRITE setDCceiling       NOTIFY dcceilingChanged)
 	Q_PROPERTY(bool redceiling       READ redceiling      WRITE setRedceiling      NOTIFY redceilingChanged)
 	Q_PROPERTY(bool calcceiling      READ calcceiling     WRITE setCalcceiling     NOTIFY calcceilingChanged)
@@ -621,6 +645,9 @@ class SettingsObjectWrapper : public QObject {
 	Q_PROPERTY(LanguageSettingsObjectWrapper*        language  MEMBER language_settings CONSTANT)
 	Q_PROPERTY(AnimationsSettingsObjectWrapper*      animation MEMBER animation_settings CONSTANT)
 	Q_PROPERTY(LocationServiceSettingsObjectWrapper* Location  MEMBER location_settings CONSTANT)
+
+	Q_PROPERTY(UpdateManagerSettings* update MEMBER update_manager_settings CONSTANT)
+
 public:
 	static SettingsObjectWrapper *instance();
 
@@ -637,7 +664,7 @@ public:
 	LanguageSettingsObjectWrapper *language_settings;
 	AnimationsSettingsObjectWrapper *animation_settings;
 	LocationServiceSettingsObjectWrapper *location_settings;
-
+	UpdateManagerSettings *update_manager_settings;
 private:
 	SettingsObjectWrapper(QObject *parent = NULL);
 };
-- 
2.9.3

From dcfd99037264e1f9707d5f884204d9f70da9999e Mon Sep 17 00:00:00 2001
From: Tomaz Canabrava <[email protected]>
Date: Wed, 10 Aug 2016 14:10:38 -0300
Subject: [PATCH 08/15] Rework units

Signed-off-by: Tomaz Canabrava <[email protected]>
---
 desktop-widgets/preferences/preferences_units.cpp | 22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/desktop-widgets/preferences/preferences_units.cpp b/desktop-widgets/preferences/preferences_units.cpp
index 8fb67a8..c62fb1c 100644
--- a/desktop-widgets/preferences/preferences_units.cpp
+++ b/desktop-widgets/preferences/preferences_units.cpp
@@ -2,6 +2,7 @@
 #include "ui_preferences_units.h"
 #include "core/prefs-macros.h"
 #include "core/qthelper.h"
+#include "core/subsurface-qt/SettingsObjectWrapper.h"
 
 #include <QSettings>
 
@@ -44,17 +45,16 @@ void PreferencesUnits::refreshSettings()
 
 void PreferencesUnits::syncSettings()
 {
-	QSettings s;
-	s.beginGroup("Units");
+	auto units = SettingsObjectWrapper::instance()->unit_settings;
 	QString unitSystem[] = {"metric", "imperial", "personal"};
 	short unitValue = ui->metric->isChecked() ? METRIC : (ui->imperial->isChecked() ? IMPERIAL : PERSONALIZE);
-	SAVE_OR_REMOVE_SPECIAL("unit_system", default_prefs.unit_system, unitValue, unitSystem[unitValue]);
-	s.setValue("temperature", ui->fahrenheit->isChecked() ? units::FAHRENHEIT : units::CELSIUS);
-	s.setValue("length", ui->feet->isChecked() ? units::FEET : units::METERS);
-	s.setValue("pressure", ui->psi->isChecked() ? units::PSI : units::BAR);
-	s.setValue("volume", ui->cuft->isChecked() ? units::CUFT : units::LITER);
-	s.setValue("weight", ui->lbs->isChecked() ? units::LBS : units::KG);
-	s.setValue("vertical_speed_time", ui->vertical_speed_minutes->isChecked() ? units::MINUTES : units::SECONDS);
-	s.setValue("coordinates", ui->gpsTraditional->isChecked());
-	s.endGroup();
+
+	units->setUnitSystem(unitSystem[unitValue]);
+	units->setTemperature(ui->fahrenheit->isChecked() ? units::FAHRENHEIT : units::CELSIUS);
+	units->setLength(ui->feet->isChecked() ? units::FEET : units::METERS);
+	units->setPressure(ui->psi->isChecked() ? units::PSI : units::BAR);
+	units->setVolume(ui->cuft->isChecked() ? units::CUFT : units::LITER);
+	units->setWeight(ui->lbs->isChecked() ? units::LBS : units::KG);
+	units->setVerticalSpeedTime(ui->vertical_speed_minutes->isChecked() ? units::MINUTES : units::SECONDS);
+	units->setCoordinatesTraditional(ui->gpsTraditional->isChecked());
 }
-- 
2.9.3

From 1309e142a53d61a532c49535e1d4a159a62460b1 Mon Sep 17 00:00:00 2001
From: Tomaz Canabrava <[email protected]>
Date: Wed, 10 Aug 2016 13:43:39 -0300
Subject: [PATCH 07/15] Preferences settings redone.

Signed-off-by: Tomaz Canabrava <[email protected]>
---
 .../preferences/preferences_network.cpp            | 45 ++++++++--------------
 1 file changed, 16 insertions(+), 29 deletions(-)

diff --git a/desktop-widgets/preferences/preferences_network.cpp b/desktop-widgets/preferences/preferences_network.cpp
index 5d7f706..2e0ebbd 100644
--- a/desktop-widgets/preferences/preferences_network.cpp
+++ b/desktop-widgets/preferences/preferences_network.cpp
@@ -52,20 +52,18 @@ void PreferencesNetwork::syncSettings()
 	cloud->setUserId(ui->default_uid->text().toUpper());
 	cloud->setSaveUserIdLocal(ui->save_uid_local->checkState());
 
-	QSettings s;
-	s.beginGroup("Network");
-	s.setValue("proxy_type", ui->proxyType->itemData(ui->proxyType->currentIndex()).toInt());
-	s.setValue("proxy_host", ui->proxyHost->text());
-	s.setValue("proxy_port", ui->proxyPort->value());
-	SB("proxy_auth", ui->proxyAuthRequired);
-	s.setValue("proxy_user", ui->proxyUsername->text());
-	s.setValue("proxy_pass", ui->proxyPassword->text());
-	s.endGroup();
+	proxy->setType(ui->proxyType->itemData(ui->proxyType->currentIndex()).toInt());
+	proxy->setHost(ui->proxyHost->text());
+	proxy->setPort(ui->proxyPort->value());
+	proxy->setAuth(ui->proxyAuthRequired->isChecked());
+	proxy->setUser(ui->proxyUsername->text());
+	proxy->setPass(ui->proxyPassword->text());
 
-	s.beginGroup("CloudStorage");
 	QString email = ui->cloud_storage_email->text();
 	QString password = ui->cloud_storage_password->text();
 	QString newpassword = ui->cloud_storage_new_passwd->text();
+
+	//TODO: Change this to the Cloud Storage Stuff, not preferences.
 	if (prefs.cloud_verification_status == CS_VERIFIED && !newpassword.isEmpty()) {
 		// deal with password change
 		if (!email.isEmpty() && !password.isEmpty()) {
@@ -79,8 +77,7 @@ void PreferencesNetwork::syncSettings()
 				connect(cloudAuth, SIGNAL(passwordChangeSuccessful()), this, SLOT(passwordUpdateSuccessfull()));
 				cloudAuth->backend(email, password, "", newpassword);
 				ui->cloud_storage_new_passwd->setText("");
-				free(prefs.cloud_storage_newpassword);
-				prefs.cloud_storage_newpassword = strdup(qPrintable(newpassword));
+				cloud->setNewPassword(newpassword);
 			}
 		}
 	} else if (prefs.cloud_verification_status == CS_UNKNOWN ||
@@ -89,7 +86,7 @@ void PreferencesNetwork::syncSettings()
 		   password != prefs.cloud_storage_password) {
 
 		// different credentials - reset verification status
-		prefs.cloud_verification_status = CS_UNKNOWN;
+		cloud->setVerificationStatus(CS_UNKNOWN);
 		if (!email.isEmpty() && !password.isEmpty()) {
 			// connect to backend server to check / create credentials
 			QRegularExpression reg("^[a-zA-Z0-9@.+_-]+$");
@@ -114,22 +111,12 @@ void PreferencesNetwork::syncSettings()
 			cloudAuth->backend(email, password, pin);
 		}
 	}
-	SAVE_OR_REMOVE("email", default_prefs.cloud_storage_email, email);
-	SAVE_OR_REMOVE("save_password_local", default_prefs.save_password_local, ui->save_password_local->isChecked());
-	if (ui->save_password_local->isChecked()) {
-		SAVE_OR_REMOVE("password", default_prefs.cloud_storage_password, password);
-	} else {
-		s.remove("password");
-		free(prefs.cloud_storage_password);
-		prefs.cloud_storage_password = strdup(qPrintable(password));
-	}
-	SAVE_OR_REMOVE("cloud_verification_status", default_prefs.cloud_verification_status, prefs.cloud_verification_status);
-	SAVE_OR_REMOVE("cloud_background_sync", default_prefs.cloud_background_sync, ui->cloud_background_sync->isChecked());
-
-	// at this point we intentionally do not have a UI for changing this
-	// it could go into some sort of "advanced setup" or something
-	SAVE_OR_REMOVE("cloud_base_url", default_prefs.cloud_base_url, prefs.cloud_base_url);
-	s.endGroup();
+	cloud->setEmail(email);
+	cloud->setSavePasswordLocal(ui->save_password_local->isChecked());
+	cloud->setPassword(password);
+	cloud->setVerificationStatus(prefs.cloud_verification_status);
+	cloud->setBackgroundSync(ui->cloud_background_sync->isChecked());
+	cloud->setBaseUrl(prefs.cloud_base_url);
 }
 
 void PreferencesNetwork::cloudPinNeeded()
-- 
2.9.3

From 6e0424fa714991e9c9c3bfb9d59de355f48f3ded Mon Sep 17 00:00:00 2001
From: Tomaz Canabrava <[email protected]>
Date: Wed, 10 Aug 2016 13:27:03 -0300
Subject: [PATCH 06/15] Save user id local seems to be a bit of a mess

So, prefs.save_userid_local is being set outside of
a preferences set (it's set to true and false while
loading the files via xml or git) and because of that
I had to bypass a few method calls.

when something triggers a preferences change, the
application will be notified that the preferences
changed, thing that I couldn't do while reading the
xml or git because that should be local-only.g

Signed-off-by: Tomaz Canabrava <[email protected]>
---
 core/dive.c                                        |  5 -----
 core/load-git.c                                    |  4 ++--
 core/parse-xml.c                                   |  9 +++++++--
 core/subsurface-qt/SettingsObjectWrapper.cpp       | 22 +++++++++++-----------
 core/subsurface-qt/SettingsObjectWrapper.h         | 13 ++++++-------
 .../preferences/preferences_network.cpp            | 16 ++++++++--------
 desktop-widgets/subsurfacewebservices.cpp          |  4 +++-
 7 files changed, 37 insertions(+), 36 deletions(-)

diff --git a/core/dive.c b/core/dive.c
index 04cad24..1d504bd 100644
--- a/core/dive.c
+++ b/core/dive.c
@@ -3351,11 +3351,6 @@ timestamp_t get_times()
 	return dive->when;
 }
 
-void set_save_userid_local(short value)
-{
-	prefs.save_userid_local = value;
-}
-
 void set_userid(char *rUserId)
 {
 	if (prefs.userid)
diff --git a/core/load-git.c b/core/load-git.c
index 0fe2c63..d6fcddf 100644
--- a/core/load-git.c
+++ b/core/load-git.c
@@ -811,7 +811,7 @@ static void parse_settings_userid(char *line, struct membuffer *str, void *_unus
 	(void) str;
 	(void) _unused;
 	if (line) {
-		set_save_userid_local(true);
+		prefs.save_userid_local = true;
 		set_userid(line);
 	}
 }
@@ -1520,7 +1520,7 @@ static int parse_settings_entry(git_repository *repo, const git_tree_entry *entr
 	git_blob *blob = git_tree_entry_blob(repo, entry);
 	if (!blob)
 		return report_error("Unable to read settings file");
-	set_save_userid_local(false);
+	prefs.save_userid_local = false;
 	for_each_line(blob, settings_parser, NULL);
 	git_blob_free(blob);
 	return 0;
diff --git a/core/parse-xml.c b/core/parse-xml.c
index 3b5a2d7..8f2b9bb 100644
--- a/core/parse-xml.c
+++ b/core/parse-xml.c
@@ -1767,7 +1767,12 @@ static void divecomputer_end(void)
 static void userid_start(void)
 {
 	in_userid = true;
-	set_save_userid_local(true); //if the xml contains userid, keep saving it.
+	//if the xml contains userid, keep saving it.
+	// don't call the prefs method here as we don't wanna
+	// actually change the preferences, this is temporary and
+	// will be reverted when the file finishes.
+
+	prefs.save_userid_local = true;
 }
 
 static void userid_stop(void)
@@ -2041,7 +2046,7 @@ int parse_xml_buffer(const char *url, const char *buffer, int size,
 	if (!doc)
 		return report_error(translate("gettextFromC", "Failed to parse '%s'"), url);
 
-	set_save_userid_local(false);
+	prefs.save_userid_local = false;
 	reset_all();
 	dive_start();
 	doc = test_xslt_transforms(doc, params);
diff --git a/core/subsurface-qt/SettingsObjectWrapper.cpp b/core/subsurface-qt/SettingsObjectWrapper.cpp
index 4604abf..6df8110 100644
--- a/core/subsurface-qt/SettingsObjectWrapper.cpp
+++ b/core/subsurface-qt/SettingsObjectWrapper.cpp
@@ -811,6 +811,17 @@ void CloudStorageSettings::setBackgroundSync(bool value)
 	emit backgroundSyncChanged(value);
 }
 
+void CloudStorageSettings::setSaveUserIdLocal(short int value)
+{
+	prefs.save_userid_local = value;
+	emit saveUserIdLocalChanged(value);
+}
+
+short int CloudStorageSettings::saveUserIdLocal() const
+{
+	return prefs.save_userid_local;
+}
+
 void CloudStorageSettings::setBaseUrl(const QString& value)
 {
 	free((void*)prefs.cloud_base_url);
@@ -1620,17 +1631,6 @@ QObject(parent),
 {
 }
 
-void SettingsObjectWrapper::setSaveUserIdLocal(short int value)
-{
-	Q_UNUSED(value);
-	//TODO: Find where this is stored on the preferences.
-}
-
-short int SettingsObjectWrapper::saveUserIdLocal() const
-{
-	return prefs.save_userid_local;
-}
-
 SettingsObjectWrapper* SettingsObjectWrapper::instance()
 {
 	static SettingsObjectWrapper settings;
diff --git a/core/subsurface-qt/SettingsObjectWrapper.h b/core/subsurface-qt/SettingsObjectWrapper.h
index 3b19c9a..157c743 100644
--- a/core/subsurface-qt/SettingsObjectWrapper.h
+++ b/core/subsurface-qt/SettingsObjectWrapper.h
@@ -262,6 +262,7 @@ class CloudStorageSettings : public QObject {
 	Q_PROPERTY(QString userid            READ userId             WRITE setUserId             NOTIFY userIdChanged)
 	Q_PROPERTY(QString base_url          READ baseUrl            WRITE setBaseUrl            NOTIFY baseUrlChanged)
 	Q_PROPERTY(QString git_url           READ gitUrl             WRITE setGitUrl             NOTIFY gitUrlChanged)
+	Q_PROPERTY(short save_userid_local  READ saveUserIdLocal WRITE setSaveUserIdLocal NOTIFY saveUserIdLocalChanged)
 	Q_PROPERTY(bool git_local_only       READ gitLocalOnly       WRITE setGitLocalOnly       NOTIFY gitLocalOnlyChanged)
 	Q_PROPERTY(bool save_password_local  READ savePasswordLocal  WRITE setSavePasswordLocal  NOTIFY savePasswordLocalChanged)
 	Q_PROPERTY(short verification_status READ verificationStatus WRITE setVerificationStatus NOTIFY verificationStatusChanged)
@@ -278,7 +279,8 @@ public:
 	bool savePasswordLocal() const;
 	short verificationStatus() const;
 	bool backgroundSync() const;
-    bool gitLocalOnly() const;
+	bool gitLocalOnly() const;
+	short saveUserIdLocal() const;
 
 public slots:
 	void setPassword(const QString& value);
@@ -292,6 +294,7 @@ public slots:
 	void setVerificationStatus(short value);
 	void setBackgroundSync(bool value);
 	void setGitLocalOnly(bool value);
+	void setSaveUserIdLocal(short value);
 
 signals:
 	void passwordChanged(const QString& value);
@@ -305,6 +308,8 @@ signals:
 	void verificationStatusChanged(short value);
 	void backgroundSyncChanged(bool value);
 	void gitLocalOnlyChanged(bool value);
+	void saveUserIdLocalChanged(short value);
+
 private:
 	QString group;
 };
@@ -601,7 +606,6 @@ private:
 
 class SettingsObjectWrapper : public QObject {
 	Q_OBJECT
-	Q_PROPERTY(short save_userid_local  READ saveUserIdLocal WRITE setSaveUserIdLocal NOTIFY saveUserIdLocalChanged)
 
 	Q_PROPERTY(TechnicalDetailsSettings*   techical_details MEMBER techDetails CONSTANT)
 	Q_PROPERTY(PartialPressureGasSettings* pp_gas           MEMBER pp_gas CONSTANT)
@@ -619,7 +623,6 @@ class SettingsObjectWrapper : public QObject {
 	Q_PROPERTY(LocationServiceSettingsObjectWrapper* Location  MEMBER location_settings CONSTANT)
 public:
 	static SettingsObjectWrapper *instance();
-	short saveUserIdLocal() const;
 
 	TechnicalDetailsSettings *techDetails;
 	PartialPressureGasSettings *pp_gas;
@@ -635,12 +638,8 @@ public:
 	AnimationsSettingsObjectWrapper *animation_settings;
 	LocationServiceSettingsObjectWrapper *location_settings;
 
-public slots:
-	void setSaveUserIdLocal(short value);
 private:
 	SettingsObjectWrapper(QObject *parent = NULL);
-signals:
-	void saveUserIdLocalChanged(short value);
 };
 
 #endif
diff --git a/desktop-widgets/preferences/preferences_network.cpp b/desktop-widgets/preferences/preferences_network.cpp
index 7d89d44..5d7f706 100644
--- a/desktop-widgets/preferences/preferences_network.cpp
+++ b/desktop-widgets/preferences/preferences_network.cpp
@@ -4,7 +4,7 @@
 #include "subsurfacewebservices.h"
 #include "core/prefs-macros.h"
 #include "core/cloudstorage.h"
-
+#include "core/subsurface-qt/SettingsObjectWrapper.h"
 #include <QNetworkProxy>
 #include <QSettings>
 
@@ -29,8 +29,6 @@ PreferencesNetwork::~PreferencesNetwork()
 
 void PreferencesNetwork::refreshSettings()
 {
-	QSettings s;
-
 	ui->proxyHost->setText(prefs.proxy_host);
 	ui->proxyPort->setValue(prefs.proxy_port);
 	ui->proxyAuthRequired->setChecked(prefs.proxy_auth);
@@ -42,17 +40,19 @@ void PreferencesNetwork::refreshSettings()
 	ui->save_password_local->setChecked(prefs.save_password_local);
 	ui->cloud_background_sync->setChecked(prefs.cloud_background_sync);
 	ui->save_uid_local->setChecked(prefs.save_userid_local);
-	ui->default_uid->setText(s.value("subsurface_webservice_uid").toString().toUpper());
-
+	ui->default_uid->setText(QString(prefs.userid).toUpper());
 	cloudPinNeeded();
 }
 
 void PreferencesNetwork::syncSettings()
 {
-	QSettings s;
-	s.setValue("subsurface_webservice_uid", ui->default_uid->text().toUpper());
-	set_save_userid_local(ui->save_uid_local->checkState());
+	auto cloud = SettingsObjectWrapper::instance()->cloud_storage;
+	auto proxy = SettingsObjectWrapper::instance()->proxy;
+
+	cloud->setUserId(ui->default_uid->text().toUpper());
+	cloud->setSaveUserIdLocal(ui->save_uid_local->checkState());
 
+	QSettings s;
 	s.beginGroup("Network");
 	s.setValue("proxy_type", ui->proxyType->itemData(ui->proxyType->currentIndex()).toInt());
 	s.setValue("proxy_host", ui->proxyHost->text());
diff --git a/desktop-widgets/subsurfacewebservices.cpp b/desktop-widgets/subsurfacewebservices.cpp
index bd798c7..68b7737 100644
--- a/desktop-widgets/subsurfacewebservices.cpp
+++ b/desktop-widgets/subsurfacewebservices.cpp
@@ -8,6 +8,7 @@
 #include "desktop-widgets/maintab.h"
 #include "core/display.h"
 #include "core/membuffer.h"
+#include "core/subsurface-qt/SettingsObjectWrapper.h"
 #include <errno.h>
 #include "core/cloudstorage.h"
 
@@ -436,7 +437,8 @@ void SubsurfaceWebServices::buttonClicked(QAbstractButton *button)
 		QSettings s;
 		QString qDialogUid = ui.userID->text().toUpper();
 		bool qSaveUid = ui.saveUidLocal->checkState();
-		set_save_userid_local(qSaveUid);
+		SettingsObjectWrapper::instance()->cloud_storage->setSaveUserIdLocal(qSaveUid);
+
 		if (qSaveUid) {
 			QString qSettingUid = s.value("subsurface_webservice_uid").toString();
 			QString qFileUid = QString(prefs.userid);
-- 
2.9.3

From 07d29aac46974f369796f52b20c1ad411b2db232 Mon Sep 17 00:00:00 2001
From: Tomaz Canabrava <[email protected]>
Date: Wed, 10 Aug 2016 12:48:19 -0300
Subject: [PATCH 05/15] Save the language settings using the wrapper

Signed-off-by: Tomaz Canabrava <[email protected]>
---
 .../preferences/preferences_language.cpp           | 27 ++++++++++------------
 1 file changed, 12 insertions(+), 15 deletions(-)

diff --git a/desktop-widgets/preferences/preferences_language.cpp b/desktop-widgets/preferences/preferences_language.cpp
index a1af676..408b48b 100644
--- a/desktop-widgets/preferences/preferences_language.cpp
+++ b/desktop-widgets/preferences/preferences_language.cpp
@@ -1,6 +1,7 @@
 #include "preferences_language.h"
 #include "ui_prefs_language.h"
 #include "core/helpers.h"
+#include "core/subsurface-qt/SettingsObjectWrapper.h"
 
 #include <QApplication>
 #include <QSettings>
@@ -44,26 +45,22 @@ void PreferencesLanguage::refreshSettings()
 
 void PreferencesLanguage::syncSettings()
 {
-	QSettings s;
-	s.beginGroup("Language");
-	bool useSystemLang = s.value("UseSystemLanguage", true).toBool();
+	auto lang = SettingsObjectWrapper::instance()->language_settings;
+	bool useSystemLang = prefs.locale.use_system_language;
+
 	QAbstractItemModel *m = ui->languageDropdown->model();
 	QString currentText = m->data(m->index(ui->languageDropdown->currentIndex(),0), Qt::UserRole).toString();
 	if (useSystemLang != ui->languageSystemDefault->isChecked() ||
-	    (!useSystemLang && s.value("UiLanguage").toString() != currentText)) {
+		(!useSystemLang && currentText != prefs.locale.language)) {
 		QMessageBox::warning(this, tr("Restart required"),
 			tr("To correctly load a new language you must restart Subsurface."));
 	}
-	s.setValue("UiLanguage", currentText);
-	s.setValue("UseSystemLanguage", ui->languageSystemDefault->isChecked());
-	s.setValue("time_format_override", !ui->timeFormatSystemDefault->isChecked());
-	s.setValue("date_format_override", !ui->dateFormatSystemDefault->isChecked());
-	if (!ui->timeFormatSystemDefault->isChecked())
-		s.setValue("time_format", ui->timeFormatEntry->text());
-	if (!ui->dateFormatSystemDefault->isChecked()) {
-		s.setValue("date_format", ui->dateFormatEntry->text());
-		s.setValue("date_format_short", ui->shortDateFormatEntry->text());
-	}
-	s.endGroup();
+	lang->setLanguage(currentText);
+	lang->setUseSystemLanguage(ui->languageSystemDefault->isChecked());
+	lang->setTimeFormatOverride(!ui->timeFormatSystemDefault->isChecked());
+	lang->setDateFormatOverride(!ui->dateFormatSystemDefault->isChecked());
+	lang->setTimeFormat(ui->timeFormatEntry->text());
+	lang->setDateFormat(ui->dateFormatEntry->text());
+	lang->setDateFormatShort(ui->shortDateFormatEntry->text());
 	uiLanguage(NULL);
 }
-- 
2.9.3

From 5970f94c0663076f1f587eb61dab33d9139c5f9c Mon Sep 17 00:00:00 2001
From: Tomaz Canabrava <[email protected]>
Date: Wed, 10 Aug 2016 12:42:18 -0300
Subject: [PATCH 04/15] Use internal prefs structure to read preferences

Don't use a QSettings to read properties, it's really
easy to mispell something. use the internal prefs structure.

Signed-off-by: Tomaz Canabrava <[email protected]>
---
 desktop-widgets/preferences/preferences_language.cpp | 17 +++++++----------
 1 file changed, 7 insertions(+), 10 deletions(-)

diff --git a/desktop-widgets/preferences/preferences_language.cpp b/desktop-widgets/preferences/preferences_language.cpp
index 264e2a1..a1af676 100644
--- a/desktop-widgets/preferences/preferences_language.cpp
+++ b/desktop-widgets/preferences/preferences_language.cpp
@@ -30,19 +30,16 @@ PreferencesLanguage::~PreferencesLanguage()
 
 void PreferencesLanguage::refreshSettings()
 {
-	QSettings s;
-	s.beginGroup("Language");
-	ui->languageSystemDefault->setChecked(s.value("UseSystemLanguage", true).toBool());
-	ui->timeFormatSystemDefault->setChecked(!s.value("time_format_override", false).toBool());
-	ui->dateFormatSystemDefault->setChecked(!s.value("date_format_override", false).toBool());
-	ui->timeFormatEntry->setText(s.value("time_format").toString());
-	ui->dateFormatEntry->setText(s.value("date_format").toString());
-	ui->shortDateFormatEntry->setText(s.value("date_format_short").toString());
+	ui->languageSystemDefault->setChecked(prefs.locale.use_system_language);
+	ui->timeFormatSystemDefault->setChecked(!prefs.time_format_override);
+	ui->dateFormatSystemDefault->setChecked(!prefs.date_format_override);
+	ui->timeFormatEntry->setText(prefs.time_format);
+	ui->dateFormatEntry->setText(prefs.date_format);
+	ui->shortDateFormatEntry->setText(prefs.date_format_short);
 	QAbstractItemModel *m = ui->languageDropdown->model();
-	QModelIndexList languages = m->match(m->index(0, 0), Qt::UserRole, s.value("UiLanguage").toString());
+	QModelIndexList languages = m->match(m->index(0, 0), Qt::UserRole, prefs.locale.language);
 	if (languages.count())
 		ui->languageDropdown->setCurrentIndex(languages.first().row());
-	s.endGroup();
 }
 
 void PreferencesLanguage::syncSettings()
-- 
2.9.3

From 64290fe8457a3528387ee22f0fbc6c006b1843eb Mon Sep 17 00:00:00 2001
From: Tomaz Canabrava <[email protected]>
Date: Mon, 8 Aug 2016 10:58:05 -0300
Subject: [PATCH 03/15] Preferences Graph using the SettingsObjectWrapper

Signed-off-by: Tomaz Canabrava <[email protected]>
---
 desktop-widgets/preferences/preferences_graph.cpp | 40 +++++++++++------------
 1 file changed, 19 insertions(+), 21 deletions(-)

diff --git a/desktop-widgets/preferences/preferences_graph.cpp b/desktop-widgets/preferences/preferences_graph.cpp
index 3d8d8f6..d94eae9 100644
--- a/desktop-widgets/preferences/preferences_graph.cpp
+++ b/desktop-widgets/preferences/preferences_graph.cpp
@@ -1,7 +1,7 @@
 #include "preferences_graph.h"
 #include "ui_preferences_graph.h"
 #include "core/prefs-macros.h"
-
+#include "core/subsurface-qt/SettingsObjectWrapper.h"
 #include <QSettings>
 #include <QMessageBox>
 
@@ -41,28 +41,26 @@ void PreferencesGraph::refreshSettings()
 
 void PreferencesGraph::syncSettings()
 {
-	QSettings s;
+	auto general = SettingsObjectWrapper::instance()->general_settings;
+	general->setDefaultSetPoint(rint(ui->defaultSetpoint->value() * 1000.0));
+	general->setO2Consumption(rint(ui->psro2rate->value() *1000.0));
+	general->setPscrRatio(rint(1000.0 / ui->pscrfactor->value()));
 
-	s.beginGroup("GeneralSettings");
-	s.setValue("defaultsetpoint", rint(ui->defaultSetpoint->value() * 1000.0));
-	s.setValue("o2consumption", rint(ui->psro2rate->value() *1000.0));
-	s.setValue("pscr_ratio", rint(1000.0 / ui->pscrfactor->value()));
-	s.endGroup();
+	auto pp_gas = SettingsObjectWrapper::instance()->pp_gas;
+	pp_gas->setPheThreshold(ui->pheThreshold->value());
+	pp_gas->setPo2Threshold(ui->po2Threshold->value());
+	pp_gas->setPn2Threshold(ui->pn2Threshold->value());
 
-	s.beginGroup("TecDetails");
-	SAVE_OR_REMOVE("phethreshold", default_prefs.pp_graphs.phe_threshold, ui->pheThreshold->value());
-	SAVE_OR_REMOVE("po2threshold", default_prefs.pp_graphs.po2_threshold, ui->po2Threshold->value());
-	SAVE_OR_REMOVE("pn2threshold", default_prefs.pp_graphs.pn2_threshold, ui->pn2Threshold->value());
-	SAVE_OR_REMOVE("modpO2", default_prefs.modpO2, ui->maxpo2->value());
-	SAVE_OR_REMOVE("redceiling", default_prefs.redceiling, ui->red_ceiling->isChecked());
-	SAVE_OR_REMOVE("gflow", default_prefs.gflow, ui->gflow->value());
-	SAVE_OR_REMOVE("gfhigh", default_prefs.gfhigh, ui->gfhigh->value());
-	SAVE_OR_REMOVE("gf_low_at_maxdepth", default_prefs.gf_low_at_maxdepth, ui->gf_low_at_maxdepth->isChecked());
-	SAVE_OR_REMOVE("show_ccr_setpoint", default_prefs.show_ccr_setpoint, ui->show_ccr_setpoint->isChecked());
-	SAVE_OR_REMOVE("show_ccr_sensors", default_prefs.show_ccr_sensors, ui->show_ccr_sensors->isChecked());
-	SAVE_OR_REMOVE("display_unused_tanks", default_prefs.display_unused_tanks, ui->display_unused_tanks->isChecked());
-	SAVE_OR_REMOVE("show_average_depth", default_prefs.show_average_depth, ui->show_average_depth->isChecked());
-	s.endGroup();
+	auto tech = SettingsObjectWrapper::instance()->techDetails;
+	tech->setModp02(ui->maxpo2->value());
+	tech->setRedceiling(ui->red_ceiling->isChecked());
+	tech->setGflow(ui->gflow->value());
+	tech->setGfhigh(ui->gfhigh->value());
+	tech->setGfLowAtMaxDepth(ui->gf_low_at_maxdepth->isChecked());
+	tech->setShowCCRSetpoint(ui->show_ccr_setpoint->isChecked());
+	tech->setShowCCRSensors(ui->show_ccr_sensors->isChecked());
+	tech->setDisplayUnusedTanks(ui->display_unused_tanks->isChecked());
+	tech->setShowAverageDepth(ui->show_average_depth->isChecked());
 }
 
 #define DANGER_GF (gf > 100) ? "* { color: red; }" : ""
-- 
2.9.3

From a2ddd8d9ab60cdc6c5f335fe848c8382cfbfcea4 Mon Sep 17 00:00:00 2001
From: Tomaz Canabrava <[email protected]>
Date: Mon, 8 Aug 2016 10:34:48 -0300
Subject: [PATCH 02/15] Make georeference use the SettingsObjectHelper

Signed-off-by: Tomaz Canabrava <[email protected]>
---
 .../preferences/preferences_georeference.cpp            | 17 ++++++++---------
 1 file changed, 8 insertions(+), 9 deletions(-)

diff --git a/desktop-widgets/preferences/preferences_georeference.cpp b/desktop-widgets/preferences/preferences_georeference.cpp
index 8446d0e..f626b31 100644
--- a/desktop-widgets/preferences/preferences_georeference.cpp
+++ b/desktop-widgets/preferences/preferences_georeference.cpp
@@ -2,6 +2,7 @@
 #include "ui_prefs_georeference.h"
 #include "core/prefs-macros.h"
 #include "core/qthelper.h"
+#include "core/subsurface-qt/SettingsObjectWrapper.h"
 #include "qt-models/divelocationmodel.h"
 
 #include <ctime>
@@ -33,13 +34,11 @@ void PreferencesGeoreference::refreshSettings()
 
 void PreferencesGeoreference::syncSettings()
 {
-	QSettings s;
-	s.beginGroup("geocoding");
-	s.setValue("enable_geocoding", ui->enable_geocoding->isChecked());
-	s.setValue("parse_dives_without_gps", ui->parse_without_gps->isChecked());
-	s.setValue("tag_existing_dives", ui->tag_existing_dives->isChecked());
-	s.setValue("cat0", ui->first_item->currentIndex());
-	s.setValue("cat1", ui->second_item->currentIndex());
-	s.setValue("cat2", ui->third_item->currentIndex());
-	s.endGroup();
+	auto geocoding = SettingsObjectWrapper::instance()->geocoding;
+	geocoding->setEnableGeocoding(ui->enable_geocoding->isChecked());
+	geocoding->setParseDiveWithoutGps(ui->parse_without_gps->isChecked());
+	geocoding->setTagExistingDives(ui->tag_existing_dives->isChecked());
+	geocoding->setFirstTaxonomyCategory((taxonomy_category) ui->first_item->currentIndex());
+	geocoding->setSecondTaxonomyCategory((taxonomy_category) ui->second_item->currentIndex());
+	geocoding->setThirdTaxonomyCategory((taxonomy_category) ui->third_item->currentIndex());
 }
-- 
2.9.3

From f17fd4f28cf36cbdc17af360cdbfc7c2aa342836 Mon Sep 17 00:00:00 2001
From: Tomaz Canabrava <[email protected]>
Date: Mon, 8 Aug 2016 10:30:20 -0300
Subject: [PATCH 01/15] Make General Settings use the SettingsObjectHelper

First commit in the series that will unify the way to use
save and update settings in the core. This fixes the usage of
the General Settings.

Signed-off-by: Tomaz Canabrava <[email protected]>
---
 .../preferences/preferences_defaults.cpp           | 35 ++++++++++------------
 1 file changed, 16 insertions(+), 19 deletions(-)

diff --git a/desktop-widgets/preferences/preferences_defaults.cpp b/desktop-widgets/preferences/preferences_defaults.cpp
index 62bb3bc..12771e0 100644
--- a/desktop-widgets/preferences/preferences_defaults.cpp
+++ b/desktop-widgets/preferences/preferences_defaults.cpp
@@ -2,6 +2,7 @@
 #include "ui_preferences_defaults.h"
 #include "core/dive.h"
 #include "core/prefs-macros.h"
+#include "core/subsurface-qt/SettingsObjectWrapper.h"
 
 #include <QSettings>
 #include <QFileDialog>
@@ -76,28 +77,24 @@ void PreferencesDefaults::refreshSettings()
 
 void PreferencesDefaults::syncSettings()
 {
-	QSettings s;
-	s.beginGroup("GeneralSettings");
-	s.setValue("default_filename", ui->defaultfilename->text());
-	s.setValue("default_cylinder", ui->default_cylinder->currentText());
-	s.setValue("use_default_file", ui->btnUseDefaultFile->isChecked());
+	auto general = SettingsObjectWrapper::instance()->general_settings;
+	general->setDefaultFilename(ui->defaultfilename->text());
+	general->setDefaultCylinder(ui->default_cylinder->currentText());
+	general->setUseDefaultFile(ui->btnUseDefaultFile->isChecked());
 	if (ui->noDefaultFile->isChecked())
-		s.setValue("default_file_behavior", NO_DEFAULT_FILE);
+		general->setDefaultFileBehavior(NO_DEFAULT_FILE);
 	else if (ui->localDefaultFile->isChecked())
-		s.setValue("default_file_behavior", LOCAL_DEFAULT_FILE);
+		general->setDefaultFileBehavior(LOCAL_DEFAULT_FILE);
 	else if (ui->cloudDefaultFile->isChecked())
-		s.setValue("default_file_behavior", CLOUD_DEFAULT_FILE);
-	s.endGroup();
+		general->setDefaultFileBehavior(CLOUD_DEFAULT_FILE);
 
-	s.beginGroup("Display");
-	SAVE_OR_REMOVE_SPECIAL("divelist_font", system_divelist_default_font, ui->font->currentFont().toString(), ui->font->currentFont());
-	SAVE_OR_REMOVE("font_size", system_divelist_default_font_size, ui->fontsize->value());
-	s.setValue("displayinvalid", ui->displayinvalid->isChecked());
-	s.endGroup();
-	s.sync();
+	auto display =  SettingsObjectWrapper::instance()->display_settings;
 
-		// Animation
-	s.beginGroup("Animations");
-	s.setValue("animation_speed", ui->velocitySlider->value());
-	s.endGroup();
+	//TODO: Verify the 'save or remove special' feature for the divelist font and the font size.
+	display->setDivelistFont(ui->font->currentFont().toString());
+	display->setFontSize(ui->fontsize->value());
+	display->setDisplayInvalidDives(ui->displayinvalid->isChecked());
+
+	auto animation = SettingsObjectWrapper::instance()->animation_settings;
+	animation->setAnimationSpeed(ui->velocitySlider->value());
 }
-- 
2.9.3

_______________________________________________
subsurface mailing list
[email protected]
http://lists.subsurface-divelog.org/cgi-bin/mailman/listinfo/subsurface

Reply via email to