Skip to content

Commit f3b8c5a

Browse files
committed
qml: wiring for custom datadir using options_model
1 parent c065a17 commit f3b8c5a

File tree

2 files changed

+141
-31
lines changed

2 files changed

+141
-31
lines changed

src/qml/models/options_model.cpp

Lines changed: 121 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -24,35 +24,82 @@
2424
#include <QDir>
2525
#include <QSettings>
2626

27-
OptionsQmlModel::OptionsQmlModel(interfaces::Node& node, bool is_onboarded)
27+
OptionsQmlModel::OptionsQmlModel(interfaces::Node* node, bool is_onboarded)
2828
: m_node{node}
2929
, m_onboarded{is_onboarded}
3030
{
31-
m_dbcache_size_mib = SettingToInt(m_node.getPersistentSetting("dbcache"), nDefaultDbCache);
31+
gArgs.LockSettings([&](common::Settings& cs) {
32+
// Clear existing settings to ensure we're only storing new command line arguments
33+
m_cli_settings.command_line_options.clear();
3234

33-
m_listen = SettingToBool(m_node.getPersistentSetting("listen"), DEFAULT_LISTEN);
35+
// Copy only the command line arguments from the provided settings
36+
m_cli_settings.command_line_options = cs.command_line_options;
37+
});
3438

35-
m_natpmp = SettingToBool(m_node.getPersistentSetting("natpmp"), DEFAULT_NATPMP);
39+
if (!is_onboarded) {
40+
// added this to lock settings to default values
41+
if (!gArgs.IsArgSet("-resetguisettings")) {
42+
gArgs.LockSettings([&](common::Settings& s) { m_previous_settings = s; });
43+
}
44+
m_dbcache_size_mib = nDefaultDbCache;
45+
m_listen = DEFAULT_LISTEN;
46+
m_natpmp = DEFAULT_NATPMP;
47+
int64_t prune_value = 0;
48+
m_prune = (prune_value > 1);
49+
m_prune_size_gb = m_prune ? PruneMiBtoGB(prune_value) : DEFAULT_PRUNE_TARGET_GB;
50+
m_script_threads = DEFAULT_SCRIPTCHECK_THREADS;
51+
m_server = false;
52+
m_upnp = DEFAULT_UPNP;
53+
}
54+
55+
#ifdef __ANDROID__
56+
if (!getCustomDataDirString().isEmpty() && (m_dataDir != getDefaultDataDirString())) {
57+
m_dataDir = getCustomDataDirString();
58+
} else {
59+
m_dataDir = getDefaultDataDirString();
60+
}
61+
#else
62+
QSettings settings;
63+
m_dataDir = settings.value("strDataDir", m_dataDir).toString();
64+
#endif // __ANDROID__
65+
}
66+
67+
void OptionsQmlModel::requestShutdown()
68+
{
69+
Q_EMIT requestedShutdown();
70+
}
71+
72+
void OptionsQmlModel::setNode(interfaces::Node* node, bool is_onboarded) {
73+
if (node != nullptr) {
74+
m_node = node;
75+
if (is_onboarded) {
76+
m_dbcache_size_mib = SettingToInt(m_node->getPersistentSetting("dbcache"), nDefaultDbCache);
77+
78+
m_listen = SettingToBool(m_node->getPersistentSetting("listen"), DEFAULT_LISTEN);
3679

37-
int64_t prune_value{SettingToInt(m_node.getPersistentSetting("prune"), 0)};
38-
m_prune = (prune_value > 1);
39-
m_prune_size_gb = m_prune ? PruneMiBtoGB(prune_value) : DEFAULT_PRUNE_TARGET_GB;
80+
m_natpmp = SettingToBool(m_node->getPersistentSetting("natpmp"), DEFAULT_NATPMP);
4081

41-
m_script_threads = SettingToInt(m_node.getPersistentSetting("par"), DEFAULT_SCRIPTCHECK_THREADS);
82+
int64_t prune_value{SettingToInt(m_node->getPersistentSetting("prune"), 0)};
83+
m_prune = (prune_value > 1);
84+
m_prune_size_gb = m_prune ? PruneMiBtoGB(prune_value) : DEFAULT_PRUNE_TARGET_GB;
4285

43-
m_server = SettingToBool(m_node.getPersistentSetting("server"), false);
86+
m_script_threads = SettingToInt(m_node->getPersistentSetting("par"), DEFAULT_SCRIPTCHECK_THREADS);
4487

45-
m_upnp = SettingToBool(m_node.getPersistentSetting("upnp"), DEFAULT_UPNP);
88+
m_server = SettingToBool(m_node->getPersistentSetting("server"), false);
4689

47-
m_dataDir = getDefaultDataDirString();
90+
m_upnp = SettingToBool(m_node->getPersistentSetting("upnp"), DEFAULT_UPNP);
91+
}
92+
// qDebug() << "Node Set";
93+
return;
94+
}
4895
}
4996

5097
void OptionsQmlModel::setDbcacheSizeMiB(int new_dbcache_size_mib)
5198
{
5299
if (new_dbcache_size_mib != m_dbcache_size_mib) {
53100
m_dbcache_size_mib = new_dbcache_size_mib;
54101
if (m_onboarded) {
55-
m_node.updateRwSetting("dbcache", new_dbcache_size_mib);
102+
m_node->updateRwSetting("dbcache", new_dbcache_size_mib);
56103
}
57104
Q_EMIT dbcacheSizeMiBChanged(new_dbcache_size_mib);
58105
}
@@ -63,7 +110,7 @@ void OptionsQmlModel::setListen(bool new_listen)
63110
if (new_listen != m_listen) {
64111
m_listen = new_listen;
65112
if (m_onboarded) {
66-
m_node.updateRwSetting("listen", new_listen);
113+
m_node->updateRwSetting("listen", new_listen);
67114
}
68115
Q_EMIT listenChanged(new_listen);
69116
}
@@ -74,7 +121,7 @@ void OptionsQmlModel::setNatpmp(bool new_natpmp)
74121
if (new_natpmp != m_natpmp) {
75122
m_natpmp = new_natpmp;
76123
if (m_onboarded) {
77-
m_node.updateRwSetting("natpmp", new_natpmp);
124+
m_node->updateRwSetting("natpmp", new_natpmp);
78125
}
79126
Q_EMIT natpmpChanged(new_natpmp);
80127
}
@@ -85,7 +132,7 @@ void OptionsQmlModel::setPrune(bool new_prune)
85132
if (new_prune != m_prune) {
86133
m_prune = new_prune;
87134
if (m_onboarded) {
88-
m_node.updateRwSetting("prune", pruneSetting());
135+
m_node->updateRwSetting("prune", pruneSetting());
89136
}
90137
Q_EMIT pruneChanged(new_prune);
91138
}
@@ -96,7 +143,7 @@ void OptionsQmlModel::setPruneSizeGB(int new_prune_size_gb)
96143
if (new_prune_size_gb != m_prune_size_gb) {
97144
m_prune_size_gb = new_prune_size_gb;
98145
if (m_onboarded) {
99-
m_node.updateRwSetting("prune", pruneSetting());
146+
m_node->updateRwSetting("prune", pruneSetting());
100147
}
101148
Q_EMIT pruneSizeGBChanged(new_prune_size_gb);
102149
}
@@ -107,7 +154,7 @@ void OptionsQmlModel::setScriptThreads(int new_script_threads)
107154
if (new_script_threads != m_script_threads) {
108155
m_script_threads = new_script_threads;
109156
if (m_onboarded) {
110-
m_node.updateRwSetting("par", new_script_threads);
157+
m_node->updateRwSetting("par", new_script_threads);
111158
}
112159
Q_EMIT scriptThreadsChanged(new_script_threads);
113160
}
@@ -118,7 +165,7 @@ void OptionsQmlModel::setServer(bool new_server)
118165
if (new_server != m_server) {
119166
m_server = new_server;
120167
if (m_onboarded) {
121-
m_node.updateRwSetting("server", new_server);
168+
m_node->updateRwSetting("server", new_server);
122169
}
123170
Q_EMIT serverChanged(new_server);
124171
}
@@ -129,7 +176,7 @@ void OptionsQmlModel::setUpnp(bool new_upnp)
129176
if (new_upnp != m_upnp) {
130177
m_upnp = new_upnp;
131178
if (m_onboarded) {
132-
m_node.updateRwSetting("upnp", new_upnp);
179+
m_node->updateRwSetting("upnp", new_upnp);
133180
}
134181
Q_EMIT upnpChanged(new_upnp);
135182
}
@@ -158,6 +205,33 @@ QUrl OptionsQmlModel::getDefaultDataDirectory()
158205
return QUrl::fromLocalFile(path);
159206
}
160207

208+
void OptionsQmlModel::defaultReset()
209+
{
210+
QSettings settings;
211+
// Save the strDataDir setting
212+
QString path = GUIUtil::getDefaultDataDirectory();
213+
214+
setDataDir(path);
215+
216+
// Remove all entries from our QSettings object
217+
settings.clear();
218+
219+
// Set strDataDir
220+
settings.setValue("strDataDir", path);
221+
222+
// Set that this was reset
223+
settings.setValue("fReset", true);
224+
225+
// Clear the settings
226+
gArgs.LockSettings([&](common::Settings& s) { s = m_previous_settings; });
227+
228+
// reinstate command line arguments
229+
gArgs.LockSettings([&](common::Settings& cs) { cs = m_cli_settings; });
230+
gArgs.SoftSetBoolArg("-printtoconsole", false);
231+
232+
gArgs.ClearPathCache();
233+
}
234+
161235
bool OptionsQmlModel::setCustomDataDirArgs(QString path)
162236
{
163237
if (!path.isEmpty()) {
@@ -168,12 +242,29 @@ bool OptionsQmlModel::setCustomDataDirArgs(QString path)
168242
QString newPrefix = "/storage/self/primary/";
169243
QString path = uri.replace(originalPrefix, newPrefix);
170244
#else
245+
QSettings settings;
171246
path = QUrl(path).toLocalFile();
172247
#endif // __ANDROID__
173-
qDebug() << "PlaceHolder: Created data directory: " << path;
248+
// Delet before merge
249+
// qDebug() << "PlaceHolder: Created data directory: " << path;
250+
try{
251+
if (TryCreateDirectories(GUIUtil::QStringToPath(path))) {
252+
// qDebug() << "Created data directory: " << path;
253+
TryCreateDirectories(GUIUtil::QStringToPath(path) / "wallets");
254+
}
255+
} catch (const std::exception& e) {
256+
qDebug() << "Error creating data directory: " << e.what();
257+
}
258+
#ifndef __ANDROID__
259+
settings.setValue("strDataDir", path);
260+
#endif // __ANDROID__
261+
if(path != GUIUtil::getDefaultDataDirectory()) {
262+
gArgs.SoftSetArg("-datadir", fs::PathToString(GUIUtil::QStringToPath(path)));
263+
}
264+
gArgs.ClearPathCache();
265+
Q_EMIT customDataDirStringChanged(m_custom_datadir_string);
174266

175267
m_custom_datadir_string = path;
176-
Q_EMIT customDataDirStringChanged(path);
177268
setDataDir(path);
178269
return true;
179270
}
@@ -203,27 +294,28 @@ void OptionsQmlModel::setDataDir(QString new_data_dir)
203294

204295
void OptionsQmlModel::onboard()
205296
{
206-
m_node.resetSettings();
297+
m_node->resetSettings();
207298
if (m_dbcache_size_mib != nDefaultDbCache) {
208-
m_node.updateRwSetting("dbcache", m_dbcache_size_mib);
299+
m_node->updateRwSetting("dbcache", m_dbcache_size_mib);
209300
}
210301
if (m_listen) {
211-
m_node.updateRwSetting("listen", m_listen);
302+
m_node->updateRwSetting("listen", m_listen);
212303
}
213304
if (m_natpmp) {
214-
m_node.updateRwSetting("natpmp", m_natpmp);
305+
m_node->updateRwSetting("natpmp", m_natpmp);
215306
}
216307
if (m_prune) {
217-
m_node.updateRwSetting("prune", pruneSetting());
308+
m_node->updateRwSetting("prune", pruneSetting());
218309
}
219310
if (m_script_threads != DEFAULT_SCRIPTCHECK_THREADS) {
220-
m_node.updateRwSetting("par", m_script_threads);
311+
m_node->updateRwSetting("par", m_script_threads);
221312
}
222313
if (m_server) {
223-
m_node.updateRwSetting("server", m_server);
314+
m_node->updateRwSetting("server", m_server);
224315
}
225316
if (m_upnp) {
226-
m_node.updateRwSetting("upnp", m_upnp);
317+
m_node->updateRwSetting("upnp", m_upnp);
227318
}
319+
228320
m_onboarded = true;
229321
}

src/qml/models/options_model.h

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,11 @@
66
#define BITCOIN_QML_MODELS_OPTIONS_MODEL_H
77

88
#include <txdb.h>
9+
#include <chainparams.h>
10+
#include <clientversion.h>
911
#include <common/settings.h>
1012
#include <common/system.h>
13+
#include <interfaces/chain.h>
1114
#include <validation.h>
1215

1316
#include <QObject>
@@ -37,10 +40,14 @@ class OptionsQmlModel : public QObject
3740
Q_PROPERTY(QString dataDir READ dataDir WRITE setDataDir NOTIFY dataDirChanged)
3841
Q_PROPERTY(QString getDefaultDataDirString READ getDefaultDataDirString CONSTANT)
3942
Q_PROPERTY(QUrl getDefaultDataDirectory READ getDefaultDataDirectory CONSTANT)
43+
Q_PROPERTY(QString fullClientVersion READ fullClientVersion CONSTANT)
44+
Q_PROPERTY(quint64 assumedBlockchainSize READ assumedBlockchainSize CONSTANT)
45+
Q_PROPERTY(quint64 assumedChainstateSize READ assumedChainstateSize CONSTANT)
4046

4147
public:
42-
explicit OptionsQmlModel(interfaces::Node& node, bool is_onboarded);
48+
explicit OptionsQmlModel(interfaces::Node* node, bool is_onboarded);
4349

50+
void setNode(interfaces::Node* node, bool is_onboarded);
4451
int dbcacheSizeMiB() const { return m_dbcache_size_mib; }
4552
void setDbcacheSizeMiB(int new_dbcache_size_mib);
4653
bool listen() const { return m_listen; }
@@ -67,12 +74,17 @@ class OptionsQmlModel : public QObject
6774
QUrl getDefaultDataDirectory();
6875
Q_INVOKABLE bool setCustomDataDirArgs(QString path);
6976
Q_INVOKABLE QString getCustomDataDirString();
77+
Q_INVOKABLE void defaultReset();
78+
QString fullClientVersion() const { return QString::fromStdString(FormatFullVersion()); }
79+
quint64 assumedBlockchainSize() const { return m_assumed_blockchain_size; };
80+
quint64 assumedChainstateSize() const { return m_assumed_chainstate_size; };
7081

7182
public Q_SLOTS:
7283
void setCustomDataDirString(const QString &new_custom_datadir_string) {
7384
m_custom_datadir_string = new_custom_datadir_string;
7485
}
7586
Q_INVOKABLE void onboard();
87+
Q_INVOKABLE void requestShutdown();
7688

7789
Q_SIGNALS:
7890
void dbcacheSizeMiBChanged(int new_dbcache_size_mib);
@@ -83,11 +95,13 @@ public Q_SLOTS:
8395
void scriptThreadsChanged(int new_script_threads);
8496
void serverChanged(bool new_server);
8597
void upnpChanged(bool new_upnp);
98+
void onboardingFinished();
99+
void requestedShutdown();
86100
void customDataDirStringChanged(QString new_custom_datadir_string);
87101
void dataDirChanged(QString new_data_dir);
88102

89103
private:
90-
interfaces::Node& m_node;
104+
interfaces::Node* m_node;
91105
bool m_onboarded;
92106

93107
// Properties that are exposed to QML.
@@ -105,6 +119,10 @@ public Q_SLOTS:
105119
bool m_upnp;
106120
QString m_custom_datadir_string;
107121
QString m_dataDir;
122+
common::Settings m_previous_settings;
123+
common::Settings m_cli_settings;
124+
quint64 m_assumed_blockchain_size{ Params().AssumedBlockchainSize() };
125+
quint64 m_assumed_chainstate_size{ Params().AssumedChainStateSize() };
108126

109127
common::SettingsValue pruneSetting() const;
110128
};

0 commit comments

Comments
 (0)